STM32標准庫_02 | 從按鍵開始認識狀態機編程


本篇文章主要介紹如何利用狀態機來編寫按鍵檢測實驗,希望能給人以收獲。

1.開發環境

軟件環境

使用MDK5.25版本,芯片包為STM32F4系列。

硬件環境

開發板:一塊多按鍵的開發板,本實驗采用有三個按鍵的stm32F407VGT6開發板,是一款大容量芯片,最高能跑168MHz,比F103的72M快了一倍多。

燒錄器:STlink或者Jlink。

2.工程創建

和STM32標准庫_01 | 搭建自己的程序框架,思路是一樣的,具體可以看我的截圖,從正點原子的資料中拷貝相關源文件。

因為我的開發板用的是25M的外部晶振,所以要修改兩個地方,達到利用外部晶振倍頻到168M作為系統時鍾。

1.修改的地方之一:stm32f4xx.h里面的HSE_VALUE,系統默認采用外部8M晶振,所 以 #define HSE_VALUE ((uint32_t)8000000) ,現把它修改 為 #define HSE_VALUE ((uint32_t)25000000)

2.修改的地方之二:系統通過PLL倍頻到168M,所以在配置PLL的時候,也需要作相應的修改。在system_stm32f4xx.c里,需要 把PLL_M修改為25,不然會超頻使STM32不能正常工作,常見表現為掉進HardFault_Handler()中。

滴答定時器的初始化是和F103一樣的,但是GPIO的初始化有些區別,F407掛載到高速時鍾總線AHB1上,翻轉速度最高能夠達到100M,意味着可以更高速的進行一些協議的通信,還有就是把設置IO的輸出輸出模式和上下拉模式分離了出來,多了GPIO_OType和GPIO_PuPd需要配置。

測試一下

3.代碼編寫

1.狀態機編程思想

其實很多項目里面多多少少都有狀態機的影子,狀態機又稱有限狀態機,任何事物只要擁有有限個狀態,就能使用狀態機的方式實現代碼。例如門有兩種狀態,即開和關,還例如我們今天要寫的按鍵輪詢檢測實驗中,按鍵的狀態可以分為四種,按鍵彈起的狀態、按鍵按下抖動狀態、按鍵按下狀態和按鍵彈起抖動狀態。

2.按鍵基礎代碼編寫

下面我們來編寫代碼,首先是按鍵的GPIO初始化,因為我們檢測的是低電平,所以設置為上拉輸入。

編寫引腳電平獲取函數。

關於按鍵編號,是聲明在頭文件的枚舉

除了按鍵編號與按鍵狀態的枚舉外,還有一個鍵值的枚舉,讓我們保留按鍵是按下,長按還是松開等等。

聲明了這些枚舉后,我們得用實體去接收啊,如果是C++,就是創建對象了,當然了,C語言沒有對象,所以我們創建一個結構體去接收。

3.按鍵輪詢狀態機代碼編寫

先定義觸發長按的時間為1s。

開始編寫三個按鍵一起輪詢的按鍵檢測函數,利用狀態機編程。

在按鍵彈起狀態時,如果檢測到引腳為低電平,則跳轉到按鍵按鍵抖動狀態。

在按鍵按鍵抖動狀態里,如果檢測到引腳為按下時的低電平,則跳轉到按鍵按下狀態,否則則返回按鍵彈起狀態。

在按鍵按下狀態里,會執行長按計數,如果小於觸發長按的時間里,按鍵松開了,則進入按鍵彈起抖動狀態,並且保留(按鍵按下的鍵值);如果達到觸發長按的時間,就會保存(按鍵長按的鍵值,並賦值長按狀態,就能一直去等待按鍵松開),如果按鍵松開就跳轉到按鍵彈起抖動狀態。

在按鍵彈起抖動狀態下,檢測按鍵是不是按鍵彈起狀態,如果是則跳轉到按鍵彈起狀態。異常狀態時按鍵切回按鍵彈起狀態。

4.按鍵輪詢狀態機測試

1.測試流程

按鍵1按下,把LED1,2,3點亮;按鍵2按下,把LED1,2,3熄滅;按鍵3長按,翻轉LED1,2,3。

2.代碼燒錄

3.實驗現象

代碼已全部上傳到gitee,希望各位小伙伴們在下載的同時不忘點擊Star,地址:https://gitee.com/Notmi/stm32-standard-peripheral-libraries


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM