|
- #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寄存器操作完成
- }
复制代码
|
-
-
keil.7z
79.3 KB, 下载次数: 21, 下载积分: 黑币 -5
|