STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)
首先說明下開發條件:
1、開發板:秉火霸道,STM32F103ZET
2、軟件:Cubemx V4.23(F1 V1.60庫)?
問題描述:Cubemx生成RTC代碼會出現時間可以更新,日期復位以后就不能更新,恢復到2000/1/1的問題!
問題原因:斷電以后 日期DateToUpdate的相關內容沒有備份,而時間會通過RTC_WriteTimeCounter(hrtc, counter_time)進行備份!
解決思路:想辦法將日期保存起來!
解決辦法:
1、cubemx設置:
當然你也可以選擇二進制設置,然后將生成的代碼月份和星期都改成二進制顯示,這樣就可以從源頭上解決問題:
2、解決辦法
????初始化函數改為
void MX_RTC_Init(void)
{
// ?RTC_TimeTypeDef sTime;//在前面申明
// ?RTC_DateTypeDef DateToUpdate;
? ? /**Initialize RTC Only ?*/
? hrtc.Instance = RTC;
? hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
? hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
? if (HAL_RTC_Init(&hrtc) != HAL_OK)
? {
? ? _Error_Handler(__FILE__, __LINE__);
? }
? ? /**Initialize RTC and set the Time and Date */
? if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2)
{
sTime.Hours = 0x23;
sTime.Minutes = 0x59;
sTime.Seconds = 0x50;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
DateToUpdate.WeekDay = RTC_WEEKDAY_SATURDAY;
DateToUpdate.Month = RTC_MONTH_DECEMBER;
DateToUpdate.Date = 0x3;
DateToUpdate.Year = 0x17;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/* 寫入一個數值:0x32F2到RTC備份數據寄存器1 */
????HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x32F2);//隨便寫的一個數,目的就是檢測是否掉電
? }
?else
? {?
? ? /* 檢查上電復位標志位是否為:SET */
? ? if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
? ? {
? ? ? printf("發生上電復位!!!\n");
? ? }
? ? /* 檢測引腳復位標志位是否為:SET */
? ? if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
? ? {
? ? ? printf("發生外部引腳復位!!!\n");
? ? ??DateToUpdate.Year ?= HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
? ? ? DateToUpdate.Month = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
? ? ? DateToUpdate.Date ?= HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
? ? ? DateToUpdate.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR6);
? ? ? HAL_RTC_SetDate(&hrtc,&DateToUpdate,RTC_FORMAT_BIN); ? ? ? ?//與寫入的方式保持一致!main函 ? ? ?數里面寫入的是二進制
? ? } ? ?
? ? /* 清楚復位源標志位 */
? ? __HAL_RCC_CLEAR_RESET_FLAGS();
? }
}
main函數改為:
?while (1)
? {
? /* USER CODE END WHILE */
? /* USER CODE BEGIN 3 */
?HAL_RTC_GetDate (&hrtc,&DateToUpdate,RTC_FORMAT_BIN);
//必須立即備份,以后再顯示
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, DateToUpdate.Year); ? //使用二進制寫入寄存器,應該以二進制存入
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, DateToUpdate.Month);
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, DateToUpdate.Date); ?
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR6, DateToUpdate.Month);
? ? ? /* Display date Format : yy/mm/dd */
? ? ? printf("%d/%d/%d\r\n",2000+DateToUpdate.Year, DateToUpdate.Month, DateToUpdate.Date);//BCD嗎,12月份就是)0X12,顯示出來就是18月了!
HAL_RTC_GetTime (&hrtc,&sTime,RTC_FORMAT_BIN);
? ? ? printf("%d:%d:%d\r\n",sTime.Hours, sTime.Minutes, sTime.Seconds);
? ? ? printf("\r\n");
? ? ? HAL_Delay(1000);
? }
3、聯系方式:微信Startingray,本人準備將cubemx的小bug解決的過程記錄下來,也是給愛好者一點啟示,歡迎微信和我溝通,共同進步!個人覺得Cubemx是未來的發展方向,可以使我們避免很多小錯誤,但是由于現在軟件版本之間的兼容性,加上不同版本庫之間存在的bug,還是需要我們在使用時時刻保持警惕!
總結
以上是生活随笔為你收集整理的STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直流电机及PWM介绍
- 下一篇: 图像标签 链接标签