<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 淺談STM32F10X芯片RTC實(shí)時(shí)時(shí)鐘

          淺談STM32F10X芯片RTC實(shí)時(shí)時(shí)鐘

          作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏

          1、介紹

          系統(tǒng)復(fù)位后,對(duì)后備寄存器和RTC的訪問被禁止,這是為了防止對(duì)后備區(qū)域(BKP)的意外寫操作。執(zhí)行以下操作將使能對(duì)后備寄存器和RTC的訪問:

          本文引用地址:http://www.ex-cimer.com/article/201611/316903.htm

          l設(shè)置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能電源和后備接口時(shí)鐘(調(diào)用:RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE));

          l設(shè)置寄存器PWR_CR的DBP位,使能對(duì)后備寄存器和RTC的訪問(調(diào)用:PWR_BackupAccessCmd(ENABLE))。

          2、RTC注意事項(xiàng)

          lRTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器僅能通過備份域復(fù)位信號(hào)復(fù)位;系統(tǒng)復(fù)位或電源復(fù)位不會(huì)影響他們的值;

          lRTC提供APB1接口通ABP1讀取RTC寄存器的值,但必須等待RTC_CRL寄存器中的RSF(同步標(biāo)志位)位被硬件置“1”之后進(jìn)行;

          lRTC的配置必需在前一次寫操作結(jié)束(判斷RTC_CR寄存器中的RTOFF是否為1,為1表示更新完成),并設(shè)置RTC_CRL寄存器中的CNF位,使RTC進(jìn)入配置模式后,才能寫入RTC_PRL、RTC_CNT、RTC_ALR寄存器,清除CNF標(biāo)志位時(shí),寫操作才實(shí)際有效(說(shuō)明RTC是動(dòng)態(tài)配置的,即是在RTC運(yùn)行起來(lái)之后再進(jìn)行配置);

          lRTC中的任何標(biāo)志位都將保持掛起狀態(tài)(因?yàn)镺WF、ALRF、SECF和RSF只能由硬件置位由軟件清零),直到適當(dāng)?shù)腞TC_CR請(qǐng)求位被軟件復(fù)位,表示所有請(qǐng)求的中斷已經(jīng)被接受;

          l若ALRF=1且ALRIE=1,則允許產(chǎn)生RTC全局中斷,如果EXTI控制器中允許產(chǎn)生EXTI線17中斷,則允許產(chǎn)生RTC全局中斷和RTC鬧鐘中斷,在這種情況下,一般設(shè)置鬧鈴中斷優(yōu)先級(jí)高于全局中斷,如果全局中斷優(yōu)先級(jí)高于鬧鈴中斷,則在全局中斷中必須清除鬧鐘中斷標(biāo)志之后,才能進(jìn)入鬧鐘中斷處理函數(shù)進(jìn)一步處理(因?yàn)椴磺宄龢?biāo)志,則會(huì)一直引發(fā)中斷,而全局中斷優(yōu)先級(jí)高,就會(huì)一直在全局中斷中無(wú)法跳出來(lái));

          l若ALRF=1,如果在EXTI控制器中設(shè)置了EXTI線17的中斷模式,則允許產(chǎn)生RTC鬧鐘中斷;如果在EXTI控制器中設(shè)置了EXTI線17的事件模式,則這條線上會(huì)產(chǎn)生一個(gè)脈沖(不會(huì)產(chǎn)生RTC鬧鐘中斷);

          l當(dāng)APB1時(shí)鐘不運(yùn)行時(shí),OWF、ALRF、SECF和RSF位不被更新;

          l系統(tǒng)復(fù)位時(shí)禁止所有中斷,無(wú)掛起中斷請(qǐng)求,可以對(duì)RTC寄存器進(jìn)行寫操作;

          l對(duì)RTC的寫操作必須使用如下過程之一與RTC秒標(biāo)志同步:

          使用RTC鬧鐘中斷,并在中斷處理程序中修改RTC鬧鐘和/或RTC計(jì)數(shù)器;

          等待RTC控制寄存器中秒標(biāo)志SECF置位,再更改RTC鬧鐘和/或RTC計(jì)數(shù)器。

          圖1簡(jiǎn)化的RTC框圖(詳見手冊(cè))

          3、RTC寄存器描述

          lRTC控制寄存器高位RTC_CRH/低位RTC_CRL

          lRTC預(yù)分頻裝載寄存器(RTC_PRLH/RTC_PRLL)

          lRTC預(yù)分頻器余數(shù)寄存器(RTC_DIVH/RTC_DIVL)

          lRTC計(jì)數(shù)器寄存器(RTC_CNTH/RTC_CNTL)

          lRTC鬧鐘寄存器(RTC_ALRH/RTC_ALRL)

          與RTC相關(guān)的寄存器有:

          lAPB1外設(shè)時(shí)鐘使能寄存器RCC_APB1ENR的PWREN和BKPEN,使能電源和后備時(shí)鐘

          l電源控制寄存器PWR_CR的后備區(qū)域保護(hù)位:DBP

          4、RTC配置流程

          ?配置RCC:選擇系統(tǒng)時(shí)鐘、配置總線時(shí)鐘、使能外圍設(shè)備時(shí)鐘等;

          ?調(diào)用RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE)函數(shù),使能電源和備份域時(shí)鐘;

          ?調(diào)用PWR_BackupAccessCmd(ENABLE)獲取后備區(qū)域訪問權(quán)限;

          ?調(diào)用BKP_DeInit()函數(shù)將外設(shè)BKP的全部寄存器重設(shè)為缺省值;

          ?配置并選擇RTC時(shí)鐘:調(diào)用RCC_RTCCLKConfig(RCC_RTCCLKSource_XXX)選擇是LSE、HSE的128分頻或者LSI;

          ?RTC配置:

          n調(diào)用RCC_RTCCLKCmd(ENABLE)使能RTC時(shí)鐘;

          n調(diào)用RTC_WaitForSynchro()等待RTC寄存器(RTC_CNT、RTC_ALR和RTC_PRL)與RTC的APB時(shí)鐘同步(等待RTOFF位置1);

          n調(diào)用RTC_WaitForLastTask()函數(shù)等待最近一次對(duì)RTC寄存器的寫操作完成;

          n調(diào)用RTC配置函數(shù)(如RTC_SetPrescaler(40000))配置RTC(說(shuō)明:對(duì)RTC的控制寄存器是可以直接讀寫的;對(duì)RTC_PRL、RTC_CNT、RTC_ALR的寫操作需要進(jìn)入配置模式,而讀他們則只需要等待同步完成(RSF置1)通過APB1接口讀?。?;

          n每次調(diào)用RTC配置函數(shù)之后需要調(diào)用RTC_WaitForLastTask()等待本次配置成功。

          ?EXTI配置:若需要將RTC于EXTI線17相連,則配置EXTI線17為中斷/事件模式;

          ?NVIC配置:若要產(chǎn)生中斷,則配置中斷向量控制器,使能EXTI15_10_IRQHandler中斷,或者使能RTC_IRQHandler中斷;

          ?編寫中斷處理函數(shù):注意一定要在中斷處理函數(shù)中調(diào)用RTC_ClearITPendingBit()函數(shù)清除對(duì)應(yīng)的中斷標(biāo)志位;

          5、RTC配置實(shí)例

          void NVIC_Configuration(void)

          {

          NVIC_InitTypeDef NVIC_InitStructure;

          #ifdef VECT_TAB_RAM

          NVIC_SetVectorTable(NVIC_VectTab_RAM,0x00);

          #else

          NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00);

          #endif

          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

          NVIC_InitStructure.NVIC_IRQChannel =RTCAlarm_IRQn;

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

          NVIC_Init(&NVIC_InitStructure);

          /*設(shè)置鬧鐘中斷優(yōu)先級(jí)高于全局中斷*/

          NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQn;

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

          NVIC_Init(&NVIC_InitStructure);

          }

          void RTC_Configuration(void)

          {

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);

          PWR_BackupAccessCmd(ENABLE);

          BKP_DeInit();

          RCC_LSICmd(ENABLE);

          while(RESET == RCC_GetFlagStatus(RCC_FLAG_LSIRDY))

          {

          }

          RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

          RCC_RTCCLKCmd(ENABLE);

          RTC_WaitForSynchro();

          RTC_WaitForLastTask();

          RTC_ITConfig(RTC_IT_ALR,ENABLE);

          RTC_ITConfig(RTC_IT_SEC,ENABLE);

          RTC_SetPrescaler(6000);

          RTC_WaitForLastTask();

          RTC_SetAlarm(29);

          RTC_WaitForLastTask();

          BKP_TamperPinCmd(DISABLE);

          BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);

          }

          void EXTI_Configuration(void)

          {

          EXTI_InitTypeDef EXTI_InitStructure;

          EXTI_InitStructure.EXTI_Line = EXTI_Line17;

          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

          EXTI_InitStructure.EXTI_LineCmd = ENABLE;

          EXTI_Init(&EXTI_InitStructure);

          }

          /*中斷處理函數(shù)*/

          void RTC_IRQHandler(void)

          {

          if(SET == RTC_GetITStatus(RTC_IT_SEC))

          {

          RTC_ClearITPendingBit(RTC_IT_SEC);

          GPIO_WriteBit(GPIOB,GPIO_Pin_13,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_13)));

          }

          }

          void RTCAlarm_IRQHandler(void)

          {

          if(SET == RTC_GetFlagStatus(RTC_IT_ALR))

          {

          RTC_ClearFlag(RTC_IT_ALR); /*清除中斷標(biāo)志位,包括外部中斷線標(biāo)志*/

          if(EXTI_GetITStatus(EXTI_Line17));

          {

          EXTI_ClearITPendingBit(EXTI_Line17);

          GPIO_WriteBit(GPIOB,GPIO_Pin_8,(BitAction)(0));

          }

          }

          }



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();