
一:問題現象和背景描述。
對于新手學習STM32單片機的視頻教程網上一大堆,個人認為江協科技的視頻挺不錯的(這里絕不是打廣告哈 ),對照著視頻學習,當程序下載后功能實現正常,皆大歡喜,但也并不總是盡盡如人意,誰學習過程中沒遇到一些疑難雜癥的,但正是那些我們踩過的坑,才會讓我們更加刻骨難忘,說遠啦我們言歸正傳。
例如現在我遇到的這個問題:在做 【13-2】待機模式+RTC時鐘實驗時,程序編譯下載什么都正常,但發現和視頻演示功能不一樣,出現異常,表現為一直喚醒待機模式,OLED顯示CNT\ALR的值會同步增加。這個問題苦惱了我很久,因為我確信程序什么的都沒問題,因為它演示的功能很簡單,就是啟用RTC的鬧鐘,然后循環顯示秒計數器的值和RTC_FLAG_ALR的標志位,再進入待機模式,等到了RTC的鬧鐘的定時時間,退出待機模式重復執行,很簡單的一段邏輯。最后通過匯集各方資料發現原因在于固件庫/標準外設庫的不一致導致的,視頻用的固件庫/標準外設庫的版本 STM32F10x_StdPeriph_Lib_V3.5.0,而我采用的是 STM32F10x_StdPeriph_Lib_V3.6.0。它們內容幾乎一樣,但也有一些細微的差別,就拿本次實驗所說,區別在于 V3.5.0 PWR.C 文件中 void PWR_EnterSTANDBYMode(void) 函數比 V3.6.0 PWR.C 文件中,多了一句 /* Clear Wake-up flag */PWR->CR |= PWR_CR_CWUF; 結果導致進入待機模式后不停的喚醒,就是因為少了一句對喚醒標志位的清除,從而導致出現異常。

二:解決辦法
1:將 V3.6.0 的固件庫替換成 V3.5.0。
2:如果嫌麻煩仍使用 V3.6.0的版本,那么在調用進入待機模式的函數前面添加一句對喚醒標志位的清除的操作。

三:示例代碼如下:
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "OLED.h"
- #include "MyRTC.h"
- int main(void)
- {
- OLED_Init();
- MyRTC_Init();
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
-
- OLED_ShowString(1, 1, "CNT :");
- OLED_ShowString(2, 1, "ALR :");
- OLED_ShowString(3, 1, "ALRF:");
-
- PWR_WakeUpPinCmd(ENABLE);
-
- uint32_t Alarm = RTC_GetCounter() + 10;
- RTC_SetAlarm(Alarm);
- OLED_ShowNum(2, 6, Alarm, 10);
-
- while (1)
- {
- OLED_ShowNum(1, 6, RTC_GetCounter(), 10);
- OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1);
-
- OLED_ShowString(4, 1, "Running");
- Delay_ms(100);
- OLED_ShowString(4, 1, " ");
- Delay_ms(100);
-
- OLED_ShowString(4, 9, "STANDBY");
- Delay_ms(1000);
- OLED_ShowString(4, 9, " ");
- Delay_ms(100);
-
- OLED_Clear();
-
- /* Clear Wake-up flag */
- PWR->CR |= PWR_CR_CWUF;
- PWR_EnterSTANDBYMode();
- }
- }
復制代碼
四:圖片對比
注意.png (70.25 KB, 下載次數: 0)
下載附件
2026-6-12 02:03 上傳
|