江科大睡眠,停止,待機模式hal庫實現

修改主頻我們直接在cubeMx上面修改就行了,很方便

睡眠,停止,待機模式是通過對電源的控制來進行的,相關代碼在PWR文件里面

SEV(Send Event)

void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)
void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)
void HAL_PWR_EnterSTANDBYMode(void)

當調用HAL_PWR_EnableSleepOnExit()后,處理器在中斷服務程序結束返回時,會自動進入睡眠模式,除非有其他中斷發生或者手動禁止該功能。

參數Regulator為調節器,PWR_MAINREGULATOR_ON主調節器,PWR_LOWPOWERREGULATOR_ON低功耗調節器

進入睡眠模式后的程序下載

按住復位鍵不松手,點擊下載然后松手

我們把進入睡眠模式的代碼寫入主循環中,能一直觀察到running,也就是沒有成功進入睡眠模式,這是因為hal庫的底層代碼,systick會每隔一段時間刷新并觸發一次中斷,這個中斷會使我們退出睡眠模式。

所以我們得在進入睡眠模式前面關閉tick時鐘,在從睡眠模式恢復的時候再開啟tick時鐘

hal庫睡眠模式串口收發

uint8_t RxData;
uint8_t Serial_RxFlag;
uint8_t Serial_GetRxFlag(void)
{if (Serial_RxFlag == 1)			//如果標志位為1{Serial_RxFlag = 0;return 1;					//則返回1,并自動清零標志位}return 0;						//如果標志位為0,則返回0
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();OLED_Init();OLED_ShowString(1, 1, "RxData:");HAL_UART_Receive_IT(&huart1,&RxData,1);while (1){if (Serial_GetRxFlag() == 1)			//檢查串口接收數據的標志位{Serial_SendByte(RxData);			//串口將收到的數據回傳回去,用于測試,hal庫我們使用的是中斷接收,所以就不需要和江科大一樣把變量先讀取再發送,直接發送就行了OLED_ShowHexNum(1, 8, RxData, 2);	//顯示串口接收的數據}OLED_ShowString(2, 1, "Running");		//OLED閃爍Running,指示當前主循環正在運行HAL_Delay(100);OLED_ShowString(2, 1, "       ");HAL_Delay(100);HAL_SuspendTick();HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);HAL_ResumeTick();  }
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){if(huart == &huart1){Serial_RxFlag = 1;HAL_UART_Receive_IT(&huart1,&RxData,1);}
}

hal庫停止模式紅外對射接收器計次

while (1){/* USER CODE END WHILE */OLED_ShowNum(1, 7, CountSensor_Get(), 5);			//OLED不斷刷新顯示CountSensor_Get的返回值OLED_ShowString(2, 1, "Running");					//OLED閃爍Running,指示當前主循環正在運行HAL_Delay(100);OLED_ShowString(2, 1, "       ");HAL_Delay(100);/* USER CODE BEGIN 3 */HAL_SuspendTick();HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);HAL_ResumeTick();SystemClock_Config();}

停止模式結束后得重新對系統的時鐘進行配置,所以我們在停止模式的后面加上cubeMx給我們生成的時鐘配置函數即可。

hal庫待機模式實時時鐘

RTC_ReadTimeCounter()是hal庫的獲取時間戳的函數,這個函數在rtc文件里面是靜態的,要獲取時間戳的話得把他的前綴static刪掉,并在.h文件里面進行聲明。

標準庫的鬧鐘設置是直接通過時間戳來設置的,而hal庫的需要定義一個時間結構體作為鬧鐘結構體的成員,再初始化鬧鐘,對于相差10s的鬧鐘這類應用很差,不如標準庫,但是對于定時時鐘的鬧鐘效果比標準庫的更直白。

鬧鐘配置函數

HAL_StatusTypeDef RTC_SetAlarmTenSecondsLater(RTC_HandleTypeDef *hrtc)
{RTC_TimeTypeDef sTime = {0};RTC_AlarmTypeDef sAlarm = {0};HAL_StatusTypeDef status = HAL_ERROR;/* 檢查參數 */if (hrtc == NULL){return HAL_ERROR;}/* 獲取當前時間 */if (HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){return HAL_ERROR;}/* 計算十秒后的時間 */sTime.Seconds += 10;/* 處理秒數進位 */if (sTime.Seconds >= 60){sTime.Seconds -= 60;sTime.Minutes++;if (sTime.Minutes >= 60){sTime.Minutes -= 60;sTime.Hours++;if (sTime.Hours >= 24){sTime.Hours -= 24;/* 注意:這里沒有處理日期進位,因為RTC_DateTypeDef未獲取 */}}}/* 配置鬧鐘結構體 */sAlarm.AlarmTime = sTime;sAlarm.Alarm = 0x00;//鬧鐘成員編號,單個鬧鐘無用/* 設置鬧鐘 */status = HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, RTC_FORMAT_BIN);/* 配置鬧鐘中斷 (可選,如需要中斷處理) */if (status == HAL_OK){HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);}return status;
}

相比于標準庫的直接寫入時間戳,hal庫的這類鬧鐘配置比較復雜

  RTC_DateTypeDef GetData;  //獲取日期結構體RTC_TimeTypeDef GetTime;   //獲取時間結構體HAL_StatusTypeDef RTC_SetAlarmTenSecondsLater(RTC_HandleTypeDef *hrtc);
uint32_t Alarm;
int main(void)
{HAL_Init();SystemClock_Config();OLED_Init();MX_GPIO_Init();MX_RTC_Init();/*顯示靜態字符串*/OLED_ShowString(1, 1, "CNT :");OLED_ShowString(2, 1, "ALR :");OLED_ShowString(3, 1, "ALRF:");HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//wake up標志位得手動清除,不然會一直存在導致程序一直處于喚醒Alarm = RTC_ReadTimeCounter(&hrtc) + 10;			//鬧鐘為喚醒后當前時間的后10sOLED_ShowNum(2, 6, Alarm, 10);					//顯示鬧鐘值RTC_SetAlarmTenSecondsLater(&hrtc);while (1){OLED_ShowNum(1, 6, RTC_ReadTimeCounter(&hrtc), 10);	//顯示32位的秒計數器OLED_ShowNum(3, 6, __HAL_RTC_ALARM_EXTI_GET_FLAG(), 1);		//顯示鬧鐘標志位OLED_ShowString(4, 1, "Running");			//OLED閃爍Running,指示當前主循環正在運行HAL_Delay(100);OLED_ShowString(4, 1, "       ");HAL_Delay(100);OLED_ShowString(4, 9, "STANDBY");			//OLED閃爍STANDBY,指示即將進入待機模式HAL_Delay(1000);OLED_ShowString(4, 9, "       ");HAL_Delay(100);OLED_Clear();								//OLED清屏,模擬關閉外部所有的耗電設備,以達到極度省電HAL_SuspendTick();HAL_PWR_EnterSTANDBYMode();     //STM32進入停止模式,并等待指定的喚醒事件(WKUP上升沿或RTC鬧鐘)HAL_ResumeTick();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82495.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【黃金評論】美元走強壓制金價:基于NLP政策因子與ARIMA-GARCH的聯動效應解析

一、基本面:多因子模型解析黃金承壓邏輯 1. 政策沖擊因子驅動美元強勢 通過NLP模型對關稅政策文本進行情感分析,構建政策不確定性指數(PUI)達89.3,觸發美元避險需求溢價。DSGE模型模擬顯示,鋼鐵關稅上調至…

藍橋云課ROS一鍵配置teb教程更新-250604

一鍵配置 echo "250604已經更新不動了"git clone https://gitcode.com/ZhangRelay1/donut.gitsudo apt-key add ~/donut/ros.keysudo apt updateecho "Upgrade Mission Completed."echo "Teb Mission Begins."sudo apt install ros-kinetic-sta…

OD 算法題 B卷【服務啟動】

文章目錄 服務啟動 服務啟動 有若干連續編號的服務(編號從0開始),服務間有依賴關系,啟動一個指定的服務,請判斷該服務是否可以成功啟動,并輸出依賴的前置服務編號;依賴關系是可以傳遞的&#x…

StarRocks與Apache Iceberg:構建高效湖倉一體的實時分析平臺

## 引言:數據湖的挑戰與演進 在數據驅動的時代,企業數據湖需要同時滿足海量存儲、高性能查詢、多引擎協作和實時更新等復雜需求。傳統基于 Hive 的數據湖方案面臨元數據管理低效、缺乏 ACID 事務支持、查詢性能瓶頸等問題。在此背景下,**Sta…

Kafka 單機部署啟動教程(適用于 Spark + Hadoop 環境)

🧭 Kafka 單機部署啟動教程(適用于 Spark Hadoop 環境) 📦 一、Kafka 版本選擇 推薦使用 Kafka 2.13-2.8.1(Scala 2.13,穩定適配 Spark 3.1.2 和 Hadoop 3.1.1) 下載地址(Apache 官…

C語言數組初始化方法大全(附帶實例)

在 C語言中,數組用于存儲相同類型的多個元素。數組的初始化是一個重要的概念,它允許我們在聲明數組的同時為其賦初值。 這篇文章,我將為大家詳細介紹 C語言中初始化數組的多種方法,以及一些需要注意的細節。 數組初始化的基本語…

RAMSUN分享全新超值型MM32F0050系列MCU

憑借全國產化的供應鏈優勢和可靠的國產高端工藝制程,靈動微再次推出全新超值型MM32F0050系列微控制器單元(MCU),將超值型MCU推向新的高度。 MM32F0050系列MCU配備了72MHz的Arm Cortex-M0內核,提供64KB的Flash存儲和8K…

CMS32M65xx/67xx系列CoreMark跑分測試

CMS32M65xx/67xx系列CoreMark跑分測試 1、參考資料準備 1.1、STM32官方跑分鏈接 1.2、官網鏈接 官方移植文檔,如下所示,點擊紅框處-移植文檔: A new whitepaper and video explain how to port CoreMark-Pro to bare-metal 1.3、測試軟件git下載鏈接 …

LeetCode 139. 單詞拆分(Word Break) - 動態規劃深度解析

文章目錄 問題描述動態規劃解法解法核心思路完整代碼實現關鍵代碼解析1. 數據結構初始化2. 動態規劃數組3. 核心循環邏輯4. 子串區間理解(關鍵)示例演算復雜度分析算法優化點總結本文詳細解析LeetCode 139題"單詞拆分"的動態規劃解法,涵蓋核心思路、代碼實現、區間…

獲客方式有哪些拓展方向?

品牌在面臨增長瓶頸時,如何拓展獲客方式會是一個首要考慮的問題。有些時候企業會將獲客渠道想得很復雜,其實仔細數下來,我們可以拓展的方向仍舊是根據渠道來溯源,因此相對固定。 一、跟隨流行趨勢 在數字營銷領域,緊跟…

bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))

1.如圖 2.分析 關鍵報錯提示: undefined is not iterable (cannot read property Symbol(Symbol.iterator)) 直譯: undefined是不可迭代的(不能讀取屬性Symbol(Symbol.iterator)) 理解: 有一個值、不存在&#x…

【筆記】PyCharm 使用問題反饋與官方進展速覽

#工作記錄 https://youtrack.jetbrains.com/issue/IJPL-190308 【筆記】記一次PyCharm的問題反饋_the polyglot context is using an implementation th-CSDN博客 【筆記】與PyCharm官方溝通解決開發環境問題-CSDN博客 與 JetBrains 官方溝通記錄(PyCharm 相關問題…

VSCode 工作區配置文件通用模板(CMake + Ninja + MinGW/GCC 編譯器 的 C++ 或 Qt 項目)

下面是一個通用模板,適用于大多數使用 VSCode CMake Ninja MinGW/GCC 編譯器 的 C 或 Qt 項目。你可以將這個 .vscode 文件夾復制到你的項目根目錄下,稍作路徑調整即可使用。 📁 .vscode/ 目錄結構(通用模板) .vs…

棧-20.有效的括號-力扣(LeetCode)

一、題目解析 對于這個字符串需要左右括號匹配,并且是以正確的順序 二、算法原理 解法1.圖棧 解法2.用else if代替圖棧 正常做法:對于三種左括號直接進棧((,[,{進棧),然后判斷與下一個括號是否匹配,匹配則出棧,不匹…

將音頻數據累積到緩沖區,達到閾值時觸發處理

實現了音頻處理中的 AEC(聲學回聲消除)和 AES(音頻增強)功能,其核心功能是: 數據緩沖管理:將輸入的麥克風和揚聲器音頻數據塊累積到緩沖區中塊處理機制:當緩沖區填滿預設大小&#…

fastadmin+workman環境搭建

一、出現錯誤 從git拉取到本地在配置網址登錄后出現 unserialize(): Error at offset 0 of 17039 bytes 參考:https://blog.csdn.net/yqwwj001/article/details/88688675 找到 \thinkphp\library\think\cache\driver\Flie.php 中的 $content substr($content, …

若依+vue2實現模擬登錄

1、背景 第三方通過鏈接訪問若依項目&#xff0c;該鏈接通過攜帶唯一標識符&#xff1a;phone&#xff08;手機號&#xff09;&#xff0c;項目通過手機號查詢本項目數據庫人員信息實現模擬登錄。 2、實現 2.1. 前端實現 2.1.1 創建專用模擬登錄頁面PhoneLogin.vue <te…

【2025】使用docker compose一鍵部署項目到服務器(4)

目錄&#x1f4bb; 前言一、部署準備二、本地idea配置docker和docker compose執行器三、編寫docker-compose.yml文件四、執行啟動 前言 該篇文章主要是使用idea通過docker-compose.yml構建容器集合并且進行統一管理更新 該專欄主要為介紹通過docker compose實現容器編排部署 &…

Linux Windows之wsl安裝使用簡介

參考資料 如何使用 WSL 在 Windows 上安裝 Linuxwindows11 安裝WSL2全流程舊版 WSL 的手動安裝步驟 目錄 一. 前期準備1.1 確認windows的版本1.2 開啟Linux子系統的支持1.2.1 圖形化方式1.2.2 命令行方式 1.3 安裝wsl軟件1.4 安裝Linux分發版 二. 基本配置2.1 Windows Termina…

matlab模糊控制實現路徑規劃

路徑規劃是機器人和自動駕駛系統中的重要問題之一&#xff0c;它涉及確定如何在給定環境中找到最優路徑以達到特定目標。模糊控制是一種有效的控制方法&#xff0c;可以應用于路徑規劃問題。 路徑規劃算法的目標是在避免障礙物的情況下&#xff0c;找到機器人或車輛從起點到終…