日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+RTC(修复官方例程日期不更新bug)

發布時間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。