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>
复制代码经程序的编译与下载,其测试效果如下图所示。
测试效果图
视频演示: