Nucleo-WL55开发板是采用ARM Cortex-M4与Cortex-M0+的双核处理器架构,并内置了RTC计时器以实现日历功能。

其实现RTC初始化的函数为:

<pre>static void MX_RTC_Init(void)
  • {
  •   RTC_TimeTypeDef sTime = {0};
  •   RTC_DateTypeDef sDate = {0};
  •   hrtc.Instance = RTC;
  •   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  •   hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
  •   hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;
  •   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  •   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  •   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  •   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  •   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  •   hrtc.Init.BinMode = RTC_BINARY_NONE;
  •   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
  •   {
  •   sTime.Hours = 0x8;
  •   sTime.Minutes = 0x30;
  •   sTime.Seconds = 0x0;
  •   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  •   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  •   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   sDate.WeekDay = RTC_WEEKDAY_SATURDAY;
  •   sDate.Month =RTC_MONTH_APRIL;
  •   sDate.Date = 0x26;
  •   sDate.Year = 0x25;

  •   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
  •   }
  •   else
  •   {
  •     if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET)
  •     {
  •       BSP_LED_On(LED3);
  •     }
  •     if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
  •     {
  •       BSP_LED_On(LED1);
  •     }
  •   }
  •   __HAL_RCC_CLEAR_RESET_FLAGS();
  • }</pre>
  • 复制代码

    为了能直观的显示计时值,可在OLED屏显示程序的基础为其配置与数值显示的相关的函数,其内容如下:

    数值提取函数:

    <pre>uint32_t oled_pow(uint8_t m,uint8_t n)
  • {
  •         uint32_t result=1;         
  •         while(n--)result*=m;   
  •         return result;
  • }</pre>
  • 复制代码

    数值显示函数:

    <pre>void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
  • {                
  •         uint8_t t,temp;
  •         uint8_t enshow=0;                                                  
  •         for(t=0;t<len;t++)
  •         {
  •                 temp=(num/oled_pow(10,len-t-1))%10;
  •                 if(enshow==0&&t<(len-1))
  •                 {
  •                         if(temp==0)

  •                         {
  •                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  •                                 continue;
  •                         }else enshow=1;
  •                           
  •                 }
  •                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  •         }
  • } </pre>
  • 复制代码

    此外,为了显示RTC的时间值,经修改其内容如下:

    <pre>void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
  • {
  •   RTC_DateTypeDef sdatestructureget;
  •   RTC_TimeTypeDef stimestructureget;
  •   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  •   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  •   OLED_ShowNum(20,4,stimestructureget.Hours,2,16);
  •   OLED_ShowNum(44,4,stimestructureget.Minutes,2,16);
  •   OLED_ShowNum(68,4,stimestructureget.Seconds,2,16);
  • }</pre>
  • 复制代码

    实现RTC计时值显示的主程序为:

    <pre>int main(void)
  • {
  •   HAL_Init();
  •   BSP_LED_Init(LED2);
  •   BSP_LED_Init(LED3);
  •   BSP_LED_Init(LED1);
  •   OLED_config();
  •   OLED_Init();
  •   OLED_Clear();
  •   OLED_ShowString(20,0,"STM32WL55",16);
  •   OLED_ShowString(20,2,"RTC TEST",16);
  •   OLED_ShowString(20,4,"  :  :  ",16);
  •   SystemClock_Config();
  •   MX_RTC_Init();
  •   BSP_LED_On(LED2);
  •   RTCStatus = 1;       
  •   while (1)
  •   {
  •     RTC_CalendarShow(aShowTime, aShowDate);
  •         HAL_Delay(500);
  •   }
  • }</pre>
  • 复制代码

    经程序的编译与下载,其测试效果如下图所示。

    image.png

    测试效果图


    视频演示: