娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月26日(星期四)

正在發(fā)生

2018年12月26日 | STM32 RTC鬧鐘中斷和喚醒待機模式

發(fā)布者:meilidaowl 來源: eefocus關(guān)鍵字:STM32  RTC  鬧鐘中斷  喚醒待機模式 手機看文章 掃描二維碼
隨時隨地手機看文章

RTC代表的是實時時鐘的意思。因為它提供的時鐘基準(zhǔn)比較準(zhǔn)確所以用處還是很多的。本文章主要講解基于STM32F103上的RTC鬧鐘中斷功能以及用鬧鐘中斷喚醒STM32的待機模式。


需要注意RTC的幾個要點:1.RTC的值被設(shè)定后它就會一直按照設(shè)定的基準(zhǔn)時間自己遞增,如果你的硬件設(shè)備上發(fā)現(xiàn)一個紐扣電池,那就是給RTC功能供電用的。因此就算關(guān)閉掉設(shè)備的主電源,RTC的運行也是不受影響的,當(dāng)然如果扣掉紐扣電池或者不帶紐扣電池它就不工作了。2.每次STM32復(fù)位后這個RTC值它重新計數(shù)還是繼續(xù)計數(shù)要考慮清楚3.RTC的值是有上限的,它的最大值就是2的32次方減一,這個數(shù)字很大因此不用太關(guān)心。


本文章的第一個例程是讓RTC一次設(shè)定值后一秒遞增一個單位,每過40秒就觸發(fā)一個鬧鐘并進入中斷,每經(jīng)過一秒就將秒數(shù)輸出到計算機上。下面就是RTC的初始化配置。(第一個程序從正點原子的程序上修改得來)


u8 RTC_Init()

{

u8 temp = 0;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);//電源時鐘和背部時鐘

PWR_BackupAccessCmd(ENABLE);                    //允許背部區(qū)域?qū)?/p>


if (BKP_ReadBackupRegister(BKP_DR1) != 0xC0B4)

{

 

BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);

while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{

    temp++;

    delay_ms(10);

}

if(temp>=250)return 1;   

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);    

RCC_RTCCLKCmd(ENABLE);  

RTC_WaitForLastTask();

RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE); //打開RTC的秒中斷和鬧鐘中斷

RTC_WaitForLastTask();

RTC_EnterConfigMode();                        //進入配置RTC模式

RTC_SetPrescaler(32767); 


RTC_SetCounter(0);                            //初始值設(shè)定為0s

    RTC_WaitForLastTask();

RTC_SetAlarm(40);                            //鬧鐘值設(shè)定為40s

RTC_WaitForLastTask();                        //等待上述配置完成

RTC_ExitConfigMode();                          //退出配置模式

BKP_WriteBackupRegister(BKP_DR1, 0XC0B4);

PWR_BackupAccessCmd(DISABLE);                //不允許背部區(qū)域?qū)懖僮?/p>

}

else

{

PWR_BackupAccessCmd(DISABLE);

RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR,ENABLE); //打開RTC的秒中斷和鬧鐘中斷

RTC_WaitForLastTask();

}

  

NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中斷的中斷配置

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

return 0;

}

//此初始化函數(shù)在主函數(shù)中的用法

while(RTC_Init())

{

printf("INIT Programing is ERROR!!\r\n");


}


if (BKP_ReadBackupRegister(BKP_DR1) != 0xC0B4)    的意思就是讓STM32上電后自檢是不是第一次運行這個程序。BKP_ReadBackupRegister(BKP_DR1)代表讀取BKP_DR1的值,如果第一次運行這個程序那這個值一定是0X0000,值和0XC0B4不相等就進入配置初始化程序。BKP_WriteBackupRegister(BKP_DR1, 0XC0B4)代表往BKP_DR1這個寄存器中寫入0XC0B4,注意BKP_DR1這個值被寫入之后就算復(fù)位他也不會被清除成0000。這樣的話就算復(fù)位或者重新上電,初始程序也不會再執(zhí)行一遍,所以RTC的值就不會再重新設(shè)置了。如果想要RTC的值重新從0開始計數(shù),那就可以吧0XC0B4改成一個新的數(shù)字,重新下載一次程序就可以了。


接下來的時鐘配置選擇打開外部低速時鐘LSE,它向RTC提供時鐘頻率。它頻率為是32.768KHZ.我們需要分頻后使用它。分成1HZ。



根據(jù)上圖1HZ = 32768/(32767+1)  所以RTC_SetPrescaler(32767)就能明白什么意思了吧。


為RTC提供時鐘頻率還是有兩種選擇的,這里我們用一種就夠了。


RTC_WaitForLastTask()和RTC_WaitForSynchro()都是等待最近的寫操作完成的意思,在RTC配置的時候這兩條尤其第一條都是很重要的,如果添加位置不當(dāng)或缺失程序有時候會卡在一個地方。


接下來打開RTC的秒中斷和鬧鐘中斷。在接下來就是對RTC的一些具體配置比如初始值和計數(shù)頻率以及鬧鐘數(shù)值的配置。按照ST的說法:



要用到RTC_WaitForLastTask()和RTC_EnterConfigMode(進入配置)和RTC_ExitConfigMode(退出配置); 這三個庫函數(shù)。


最后往BKP_DR1這個寄存器中寫入0XC0B4代表第一次RTC配置已經(jīng)完成。當(dāng)程序復(fù)位或者設(shè)備重新上電后它都不會在進入這個配置程序了。還要關(guān)閉背部寄存器的寫操作允許位。


else的程序就是第二次運行這個程序的時候執(zhí)行的命令。主要是打開RTC的兩個中斷。


之后的程序就是配置RTC全局中斷。這個中斷包括了鬧鐘和秒中斷。還有一個返回值要在主程序里面才能明白他的意義,簡單來說返回0代表RTC的配置沒有問題,返回1則相反。可以不用返回值的方法,因為一般沒問題。


下面就是RTC全局中斷的介紹:


void RTC_IRQHandler()

{



if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) //是否鬧鐘中斷發(fā)生

{


printf("THE ALARM  READY =%d \r\n",RTC_GetCounter());//輸出此時的秒數(shù)

RTC_ClearITPendingBit(RTC_IT_ALR);

PWR_BackupAccessCmd(ENABLE);

RTC_EnterConfigMode();

    RTC_WaitForLastTask();

RTC_SetAlarm(40+RTC_GetCounter());   //配置下次鬧鐘為40s后

RTC_WaitForLastTask();

RTC_ExitConfigMode();   

PWR_BackupAccessCmd(DISABLE);

}

    if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)  //是否秒中斷發(fā)生

{


printf("Time is  =%d \r\n",RTC_GetCounter()); //輸出此時的秒數(shù)


}

RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清除秒中斷標(biāo)志位和溢出位

RTC_WaitForLastTask();

}

下面就是程序運行的結(jié)果。


要注意的一點就是在中斷函數(shù)里面如果把判斷秒中斷的函數(shù)寫在了判斷鬧鐘中斷的前面,就會得到THE ALARM READY=41。。。還有一點就是就算沒有寫反,下一次鬧鐘的時間是81秒,如圖


下面就是待機喚醒:


待機模式是功耗最低的一種模式。外部復(fù)位(NRST 引腳)、 IWDG 復(fù)位、 WKUP 引腳上的上升沿或 RTC 鬧鐘事件

發(fā)生時,STM32從待機模式退出。其中外部復(fù)位和WKUP的方法比較簡單。主要講一下RTC鬧鐘喚醒。


這兩個程序一個是讓STM32的一個管腳接按鍵,按鍵按下的時候STM32進入待機狀態(tài),當(dāng)40秒的鬧鐘到來時喚醒STM32.


另一個是當(dāng)按鍵按下時候進入待機狀態(tài),鬧鐘設(shè)置為5S秒后,鬧鐘來臨時喚醒STM32.


void RTC_Init()

{


NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);

PWR_WakeUpPinCmd(ENABLE);

PWR_BackupAccessCmd(ENABLE);

    BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);

while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{

 

}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

RCC_RTCCLKCmd(ENABLE);

RTC_WaitForLastTask();

RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_SEC, ENABLE);

RTC_WaitForLastTask();

RTC_EnterConfigMode(); 

RTC_SetCounter(0);    //設(shè)置計數(shù)初始值

 

RTC_WaitForLastTask();

RTC_SetPrescaler(32767);

RTC_WaitForLastTask();

RTC_SetAlarm(40);      //鬧鐘定時40S

RTC_WaitForLastTask();

RTC_ExitConfigMode();


NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中斷  它的優(yōu)先級要小于按鍵

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

}

void EXTIX_Init(void)

{

 

    EXTI_InitTypeDef EXTI_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 

  GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);//配置按鍵PC5為外部中斷

 

  EXTI_InitStructure.EXTI_Line=EXTI_Line5;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);  

 

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中斷的優(yōu)先級高于RTC

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure); 


 

}

void EXTI9_5_IRQHandler()    //按鍵對應(yīng)的外部中斷

{

EXTI_ClearITPendingBit(EXTI_Line5);

 

PWR_EnterSTANDBYMode();    //進入待機模式

 

}

void RTC_IRQHandler()        //RTC的中斷

{


if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)

{

printf("TIME IS =%d \r\n",RTC_GetCounter());

}


RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);

RTC_WaitForLastTask();

}


以上的例程就是讓STM32運行模式下每秒都講時間顯示到計算機上,在按下連接PC5的按鍵后STM32進入待機模式,計時40秒后鬧鐘觸發(fā),STM32退出待機模式。要注意的是本程序沒有設(shè)置保存RTC的值,因此每次從待機退出后時間從零開始重新計數(shù)。而且按鍵觸發(fā)待機模式要在STM32上電40S之前,否則40S之后鬧鐘錯過沒法喚醒STM32.



13秒時候按下按鍵等待計數(shù)到40S的時候都是在待機過程中所以STM32串口沒法發(fā)送數(shù)據(jù)。40s鬧鐘來臨時計數(shù)又從0開始,退出待機模式相當(dāng)于復(fù)位。


第二個例程當(dāng)按鍵按下時候進入待機狀態(tài),鬧鐘設(shè)置為5S秒后,鬧鐘來臨時喚醒STM32.運行的時候?qū)⒚霐?shù)顯示到計算機。本程序在上面那個上更改少些地方即可。


void RTC_Init()

{


NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);

PWR_WakeUpPinCmd(ENABLE);

PWR_BackupAccessCmd(ENABLE);

if(PWR_GetFlagStatus(PWR_FLAG_SB)!=RESET) //如果現(xiàn)在處于待機模式

{

PWR_ClearFlag(PWR_FLAG_SB);            //清除待機模式

RTC_ITConfig(RTC_IT_SEC, ENABLE);     //打開RTC中斷

RTC_WaitForSynchro();

}

else

{

BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);

while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{


}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

RCC_RTCCLKCmd(ENABLE);

RTC_WaitForLastTask();

RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_SEC, ENABLE);

RTC_WaitForLastTask();

RTC_EnterConfigMode(); 

RTC_SetCounter(0);

 

RTC_WaitForLastTask();

RTC_SetPrescaler(32767);

RTC_WaitForLastTask();

//RTC_SetAlarm(35);        //取消這個鬧鐘設(shè)置

RTC_WaitForLastTask();

RTC_ExitConfigMode();

}

NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

}

void EXTI9_5_IRQHandler()

{

EXTI_ClearITPendingBit(EXTI_Line5);

RTC_ClearFlag(RTC_FLAG_SEC);

while(RTC_GetFlagStatus(RTC_FLAG_SEC)==RESET);

RTC_SetAlarm(RTC_GetCounter()+5);  //鬧鐘在此時刻加上5秒

RTC_WaitForLastTask();

PWR_EnterSTANDBYMode();        //進入待機模式

 

}

其他的地方不需要更改。


這個程序的運行結(jié)果,可以看到在450s的時候進入待機模式5S之后程序接著運行。


時間并不是從0開始。

關(guān)鍵字:STM32  RTC  鬧鐘中斷  喚醒待機模式 引用地址:STM32 RTC鬧鐘中斷和喚醒待機模式

上一篇:STM32 RTC 讀寫不正確
下一篇:STM32F1RCC時鐘配置總結(jié)

推薦閱讀

早在今年5月英特爾便宣布計劃在以色列擴建工廠,并已提交相關(guān)申請。今日,以色列政府針對英特爾擬投資50億美元擴建工廠計劃,同意給予7億謝克爾(約合1.85億美元)的政府補貼。 英特爾是以色列最大的雇主和出口商之一,英特爾的許多新技術(shù)都是在以色列研發(fā)的。于此同時,英特爾也是科技領(lǐng)域最大投資者,其投資額約350億美元。 為吸引英特爾繼續(xù)投資,以色列...
江蘇南京供電公司總經(jīng)理 陳剛 順應(yīng)能源革命和數(shù)字革命融合發(fā)展趨勢,國家電網(wǎng)有限公司創(chuàng)造性地提出“三型兩網(wǎng)、世界一流”戰(zhàn)略目標(biāo)。江蘇南京供電公司不忘初心、牢記使命,準(zhǔn)確把握發(fā)展機遇,在勇于革新和率先作為中,集聚高質(zhì)量發(fā)展的強大向心力。 建設(shè)泛在電力物聯(lián)網(wǎng),為企業(yè)發(fā)展賦能 南京供電公司作為首批泛在電力物聯(lián)網(wǎng)綜合示范試點單位,堅持...
據(jù)天眼查信息,12月25日,小米旗下湖北小米長江產(chǎn)業(yè)基金合伙企業(yè)(有限合伙)對外投資新增一家企業(yè)泰凌微電子(上海)有限公司。此外,泰凌微電子26日發(fā)生大股東變更,從新余中域高鵬祥云投資合伙企業(yè)(有限合伙)變更為國家集成電路產(chǎn)業(yè)投資基金股份有限公司。泰凌微電子(上海)有限公司成立于2010年6月,是一家致力于研發(fā)高性能低功耗無線物聯(lián)網(wǎng)芯片的...
據(jù)MacRumors報道,臺積電計劃于2022年第四季度開始量產(chǎn)3納米芯片。這意味著2023年上市的眾多終端設(shè)備將迎來一次重要升級。據(jù)悉3納米制程工藝可以帶來更高能效,從而為搭載3納米制程工藝芯片的智能手機、PC等設(shè)備提供更強性能與持久續(xù)航。作為臺積電的大客戶,蘋果自然不會缺席3納米。據(jù)悉,將于2023年發(fā)布的蘋果M3芯片以及當(dāng)年秋季發(fā)布的iPhone 15系列所...

史海拾趣

問答坊 | AI 解惑

CRC校驗與C語言實現(xiàn)

一起學(xué)習(xí) 共同進步…

查看全部問答∨

請教:有沒有單刀多擲的波段開關(guān)?

請教:電路中使用了2段8位波段開關(guān),目的為了16選一,想找一個16選一的單刀多擲的波段開關(guān),不知道有沒有,請高手指點!…

查看全部問答∨

電源的分類及知識

1、交流穩(wěn)壓電源的分類及其特點: 能夠提供一個穩(wěn)定電壓和頻率的電源稱交流穩(wěn)定電源。目前國內(nèi)多數(shù)廠家所做的工作是交流電壓穩(wěn)定。下面結(jié)合市場有的交流穩(wěn)壓電源簡述其分類特點。 參數(shù)調(diào)整(諧振)型 這類穩(wěn)壓電源,穩(wěn)壓的基本原理是LC串聯(lián)諧 ...…

查看全部問答∨

新手求助。。。液晶屏驅(qū)動程序

單片機是MSP430F149 液晶顯示屏是OCMJ15×20D. 液晶屏相關(guān)信息http://www.ec66.com/market/manual/OCMJ-D.pdf 程序如下: #include #define uchar     unsigned char #define uint      unsigned int ...…

查看全部問答∨

求 電子電路及電子器件教程?謝謝推薦

求 電子電路及電子器件教程?謝謝推薦,我對計算機外圍器件很不熟悉,搞嵌入式系統(tǒng)很吃力,多謝指教,我的QQ 112315116…

查看全部問答∨

初學(xué)驅(qū)動的問題,請教了?

我出學(xué)驅(qū)動,用的是driverstudio3.2 配置好了各個方面之后,用向?qū)闪艘粋€驅(qū)動程序(按照書上說的做的),可是生成后一編譯就出現(xiàn)了 --------------------Configuration: TestDriver - Win32 Checked-------------------- Linking with DDK li ...…

查看全部問答∨

EMC上海研發(fā)中心招聘高級驅(qū)動開發(fā)工程師

Layered Driver Senior Software Engineer Responsibilities ·        Participate in feature requirements, design, implementation, testing, support and measurement of productivity based on established ...…

查看全部問答∨

小弟有個簡單的問題,關(guān)于#pragma

我看ti的例子中有這樣定義: #ifdef __cplusplus #pragma DATA_SECTION(\\"AdcRegsFile\\" #else #pragma DATA_SECTION(AdcRegs,\\"AdcRegsFile\\" #endif volatile struct ADC_REGS AdcRegs; 諸如此類。 我理解為,將那些寄 ...…

查看全部問答∨

為什么Timer不中斷啊

/********************************************************* 程序功能:MCU的片內(nèi)ADC對P6.0端口的電壓進行轉(zhuǎn)換           將模擬電壓值顯示在1602液晶上。 ************************************************** ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 萨嘎县| 乃东县| 双辽市| 延寿县| 保靖县| 富平县| 兴宁市| 裕民县| 深圳市| 眉山市| 铁岭市| 河源市| 桂平市| 海原县| 正镶白旗| 琼海市| 长宁县| 四子王旗| 奉贤区| 宁津县| 泸州市| 崇信县| 文水县| 灵璧县| 阳谷县| 新昌县| 永丰县| 鱼台县| 萨嘎县| 三台县| 新龙县| 富源县| 洛扎县| 阳春市| 东台市| 祁门县| 盱眙县| 澜沧| 凉山| 嘉峪关市| 施秉县|