你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32WB55】RTC外设

[复制链接]
银河帝国 发布时间:2023-7-30 20:18

RTC的简介

实时时钟(Real-Time Clock),缩写为RTC,它是一种集成电路,一般被称为时钟芯片。在物联网的方向中应用广泛且普遍。设备通过联网,获取获取准确的时间,自己校准RTC的偏差,之后离线了,在本地也能保存一份正常运行的时间参数。

STM32的RTC的简介

STM32中,对于需要高精度计时的应用,我们都会选用32.768K的时钟晶振。原因是32768是2的十五次方,经过时钟15分频后,刚好得到一个1Hz的计数器。

用WB55RTC的Demo程序简单测试:

打开wb55的库,发现里面就有RTC的示例代码,在calendar示例代码中,用变量

厘清RTC驱动需要的流程和逻辑。

编写一个OLED可直接显示的RTC代码。用变量aShowTime来显示当前时间和变量aShowDate用来指示日期,代码烧录到

点击仿真进入仿真界面,在watch中可以看到要观察的两个变量

image-20230730115249980.png

全速运行代码:

image-20230730115331691.png

可以发现日期的初始化代码需要调整,以外其它功能一切正常,断电后RTC也能够继续工作。

如果想把wb55的RTC功能添加到自己的项目上,可见是非常简单的,只需要修改年月日时间的参数。

打开示例代码中的.ioc文件,如下,修改年月日时间参数。

image-20230730115651930.png

在cube界面,可以看到日历功能已经封装好了,只需要使能。接下来,生成代码,重新编译运行,下载代码进wb55,调试,全速运行

image-20230730124648872.png

如果发现时间没有变化,还是上一次的值,很有可能是因为第一次上电运行程序已经把一个值保存到了备份寄存器,这个值没有被修改。我们需要修改的地方在MX_RTC_Init中,在这个方法中,初始化RTC外设,并且设置日历的初始值。初始值是否修改依据的是备份域寄存器的半字是否被是某个用户定义的值,如果是则不予修改,认为时间是已经经过初始化过的了。我们通过cubemx重新生成代码,但是这个用户定义的半字没有经过修改,所以我们写的值不起作用。

修改方法就是把原来程序中的0x32F2换成任意一个其他值。下面换成了0x32F1

 if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F1)
   {
     /* Configure RTC Calendar */
   /* USER CODE END Check_RTC_BKUP */
 
   /** Initialize RTC and set the Time and Date
   */
   sTime.Hours = 0x11;
   sTime.Minutes = 0x57;
   sTime.Seconds = 0x20;
   sTime.SubSeconds = 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_SUNDAY;
   sDate.Month = RTC_MONTH_JULY;
   sDate.Date = 0x30;
   sDate.Year = 0x23;
 
   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
   {
     Error_Handler();
   }
   /* USER CODE BEGIN RTC_Init 2 */
 
   /* Writes a data in a RTC Backup data Register0 */
   HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F1);
   }
   else
   {
     /* Check if the Power On Reset flag is set */
     if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET)
     {
       /* Turn on LED2: Power on reset occurred */
       BSP_LED_On(LED2);
     }
 
     /* Check if Pin Reset flag is set */
     if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
     {
       /* Turn on LED3: External reset occurred */
       BSP_LED_On(LED3);
     }
   }
收藏 评论0 发布时间:2023-7-30 20:18

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版