xinchao 发表于 2016-8-21 20:27:09

[每日一帖]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);
                }
      }
}

完整的代码:

yyzc 发表于 2023-11-12 15:26:28

感谢分享!
页: [1]
查看完整版本: [每日一帖]STM32使用外部8M时钟的RTC程序