電路原理圖如下:
單片機源程序如下:
- #include "delay.h"
- #include "led.h"
- #include "rtc.h"
-
- //實時時鐘配置
- //初始化RTC時鐘,同時檢測時鐘是否工作正常
- //BKP->DR1用于保存是否第一次配置的設置
- //返回0:正常
- //其他:錯誤代碼
- u8 RTC_Init(void)
- {
- //檢查是不是第一次配置時鐘
- u8 temp=0;
- if(BKP->DR1!=0X5050)//第一次配置
- {
- RCC->APB1ENR|=1<<28; //使能電源時鐘
- RCC->APB1ENR|=1<<27; //使能備份時鐘
- PWR->CR|=1<<8; //取消備份區寫保護
- RCC->BDCR|=1<<16; //備份區域軟復位
- RCC->BDCR&=~(1<<16); //備份區域軟復位結束
- RCC->BDCR|=1<<0; //開啟外部低速振蕩器
- while((!(RCC->BDCR&0X02))&&temp<250)//等待外部時鐘就緒
- {
- temp++;
- delay_ms(10);
- };
- if(temp>=250)return 1;//初始化時鐘失敗,晶振有問題
- RCC->BDCR|=1<<8; //LSI作為RTC時鐘
- RCC->BDCR|=1<<15;//RTC時鐘使能
- while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
- while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
- RTC->CRH|=0X01; //允許秒中斷
- while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
- RTC->CRL|=1<<4; //允許配置
- RTC->PRLH=0X0000;
- RTC->PRLL=32767; //時鐘周期設置(有待觀察,看是否跑慢了?)理論值:32767
- RTC->CRL&=~(1<<4); //配置更新
- while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成
- BKP->DR1=0X5050;
- }else//系統繼續計時
- {
- while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
- RTC->CRH|=0X01; //允許秒中斷
- while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
-
- }
- MY_NVIC_Init(0,0,RTC_IRQn,2);//優先級設置
- return 0; //ok
- }
- //RTC時鐘中斷
- //每秒觸發一次
- void RTC_IRQHandler(void)
- {
- if(RTC->CRL&0x0001)//秒鐘中斷
- {
- LED1=!LED1;
-
- }
- RTC->CRL&=0X0FFA; //清除溢出,秒鐘中斷標志
- while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
- }
復制代碼
所有程序51hei提供下載:
RTC時鐘.7z
(192.04 KB, 下載次數: 17)
2020-6-16 15:08 上傳
點擊文件名下載附件
|