新聞中心

重返STM32之---RTC使用

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
STM3f10x的RTC時(shí)能涉及到的寄存器有RCC,BKP和RTC這三個(gè)大類(lèi)寄存器;其中RCC主要控制了實(shí)時(shí)時(shí)鐘和備份區(qū)的電源使能和時(shí)鐘使能;RTC模塊和時(shí)鐘配置系統(tǒng)的寄存器是在后備區(qū)域的(即BKP),通過(guò)BKP后備區(qū)域來(lái)存儲(chǔ)RTC配置的數(shù)據(jù)可以讓在系統(tǒng)復(fù)位或待機(jī)模式下喚醒后RTC里面配置的數(shù)據(jù)維持不變;為此備份區(qū)還得涉及一個(gè)寄存器PWR,電源管理寄存器,備份區(qū)的寫(xiě)保護(hù)位在PWR->CR的第八位。
由于整個(gè)RTC都是位于后備區(qū),而且RTC的APB1總線和內(nèi)核的APB1總線是獨(dú)立的,所以在系統(tǒng)復(fù)位和喚醒時(shí),RTC和BKP的那些時(shí)鐘不用從新配置;他們只受Backup domain software reset這個(gè)位和系統(tǒng)完全掉電的影響。所以呢;RTC只要有備用電池,它可以完全獨(dú)立工作。
如圖一和圖二所示
圖一
圖二
大家要清楚f10x系列的RTC算不上一個(gè)真正意義上的RTC,它只是一個(gè)計(jì)數(shù)器,精度上難免差強(qiáng)人意,所以設(shè)計(jì)要注意是否滿足計(jì)時(shí)要求。
如果是要實(shí)現(xiàn)實(shí)時(shí)時(shí)間以上所有的寄存器都要有相應(yīng)設(shè)置,如果只用秒中斷,那么只需要設(shè)置RCC和RTC的寄存器就可以了。

以下以實(shí)現(xiàn)實(shí)時(shí)時(shí)鐘為例講解初始化過(guò)程。
  1. 檢測(cè)后備區(qū)是否已有有效標(biāo)記
BKP->DR1 != 0x5050;//(DR1 TO DR42)
  • 庫(kù)函數(shù)
BKP_ReadBackupRegister(BKP_DR1) != 0x5050;
  1. 開(kāi)啟電源管理和備份區(qū)時(shí)鐘
(RCC->APB1ENR |=1<<28;//POWER);
(RCC->APB1ENR |=1<<27;//BACKUP);
  • 庫(kù)函數(shù)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  1. 取消備份去寫(xiě)保護(hù)
(PWR->CR |=1<<8;//WP);
  • 庫(kù)函數(shù)
  • 復(fù)位后備區(qū)所有寄存器
RCC->BDCR |=1<<16;
RCC->BDCR &=~(1<<16);
  • 庫(kù)函數(shù)
  • 開(kāi)啟外部32k晶振
RCC->BDCR |=1<<0;
  • 庫(kù)函數(shù)
  • 32k晶振是否正常工作
  • 庫(kù)函數(shù)
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  1. 選擇32k為RTC時(shí)鐘并使能RTC
  2. 庫(kù)函數(shù)
  3. 等待RTC操作和同步完成
  4. 庫(kù)函數(shù)
  5. 使能秒中斷
  6. 庫(kù)函數(shù)
RTC_ITConfig(RTC_IT_SEC, ENABLE);
  • ;
  • 配置RTC
  • 允許配置
//set time---
  • 庫(kù)函數(shù)
BKP_WriteBackupRegister(BKP_DR1, 0X5050);
  1. 如果時(shí)鐘已被設(shè)置過(guò)(RTC沒(méi)有斷電)
  2. 等待同步
  3. 開(kāi)中斷
  4. 等待操作完成
  5. 庫(kù)函數(shù)
RTC_ITConfig(RTC_IT_SEC, ENABLE);

最后配置RTC中斷優(yōu)先級(jí)。


關(guān)鍵詞: STM32RTC使

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉