[每日一帖]STM32使用外部8M时钟的RTC程序
新做的STM32板,外部32k的时钟调不通,改用外部8MHz高速时钟做RTC时钟源调通了,贴出调试代码供需要的人参考。测试程序运行效果:
RTC初始化部分代码:
u8 RTC_Init(void) //初始化RTC时钟,同时检测时钟是否工作正常 (返回0-错误 1-第一次配置 2-配置OK)
{
u8 temp;
//检查是不是第一次配置时钟
if(BKP->DR1 != 0x1234) //第一次配置
{
//------------------------------------
RCC->APB1ENR |= 1 << 28; //bit28-PWREN 电源接口时钟使能(0-关闭 1-开启)
RCC->APB1ENR |= 1 << 27; //bit27-BKPEN 备份接口时钟使能(0-关闭 1-开启)
PWR->CR |= 1 << 8; //取消备份区写保护(注:如果RTC的时钟是HSE/128,该位必须保持为1)
//bit8-DBP 取消后备区域的写保护(0-禁止写入RTC和后备寄存器 1-允许写入RTC和后备寄存器)
RCC->BDCR |= 1 << 16; //备份区域软复位
RCC->BDCR &= ~(1 << 16); //备份区域软复位结束
//bit16-BDRST 备份域软件复位(0-复位未激活 1-复位整个备份域)
//------------------------------------HSE作为RTC时钟
RCC->BDCR |= 3 << 8; //bit8-9-RTCSEL RTC时钟源选择(0-无时钟 1-LSE 2-LSI 3-HSE128分频)
//------------------------------------RTC时钟使能
RCC->BDCR |= 1 << 15; //bit15-RTCEN RTC时钟使能(0-RTC时钟关闭 1-RTC时钟开启)
//------------------------------------
while(!(RTC->CRL & (1 << 5))); //bit5-RTOFF 等待RTC寄存器操作完成
while(!(RTC->CRL & (1 << 3))); //bit3-RSF 寄存器同步标志 --- 等待RTC寄存器同步
RTC->CRH = 0; //关闭RTC中断
//------------------------------------
while(!(RTC->CRL & (1 << 5))); //bit5-RTOFF 等待RTC寄存器操作完成
RTC->CRL |= 1 << 4; //bit4-CNF 配置标志 --- 允许配置
RTC->;PRLH = 0x0000;
RTC->;PRLL = 62500; //时钟周期设置
//------------------------------------
RTC_Set(2014,10,12, 11,45,00); //设置时间
RTC->CRL &= ~(1 << 4); //配置更新
while(!(RTC->CRL & (1 << 5))); //bit5-RTOFF 等待RTC寄存器操作完成
//------------------------------------
BKP->DR1 = 0x1234;
temp = 1; //FIRST TIME
}
else //系统继续计时
{
RCC->APB1ENR |= 1 << 28;//bit28-PWREN 电源接口时钟使能(0-关闭 1-开启)
RCC->APB1ENR |= 1 << 27;//bit27-BKPEN 备份接口时钟使能(0-关闭 1-开启)
PWR->CR |= 1 << 8; //取消备份区写保护(注:如果RTC的时钟是HSE/128,该位必须保持为1)
while(!(RTC->CRL & (1 << 5))); //bit5-RTOFF 等待RTC寄存器操作完成
while(!(RTC->CRL & (1 << 3))); //bit3-RSF 寄存器同步标志 --- 等待RTC寄存器同步
RTC->CRH = 0; //关闭RTC中断
while(!(RTC->CRL & (1 << 5))); //bit5-RTOFF 等待RTC寄存器操作完成
temp = 2;
}
MY_NVIC_Init(0, 0, RTC_IRQn, 2); //优先级设置
RTC_Get(); //更新时间
return temp; //ok
}
主函数:
int main(void)
{
//------------------------------------
u8 t;
//------------------------------------
Stm32_Clock_Init(SYS_CLK/HSE_OSC); //系统时钟设置
uart_init(SYS_CLK, 115200); //串口初始化为115200
//------------------------------------
printf("\r\n\r\nXinChao's STM32!");
//------------------------------------
printf("\r\nRTC Init ... ");
t = RTC_Init(); //RTC初始化
if(t == 1)
{
printf("第一次配置!");
}
else if(t == 2)
{
printf("配置OK !");
}
else
{
printf("RTC Error! RTC初始化失败!晶振有问题!");
}
//------------------------------------
Set_RTC_IRQ(1); //打开秒中断
//------------------------------------
while(1)
{
if(SencondFlag)
{
SencondFlag = 0;
printf("\r\n当前时间:%02u-%02u-%02u %02u:%02u:%02u",
calendar.w_year,
calendar.w_month,
calendar.w_date,
calendar.hour,
calendar.min,
calendar.sec);
}
}
}
完整的代码:
感谢分享!
页:
[1]