第一節補充:按鍵操作
《用CubeMX學習STM32》
注釋 點擊上面藍字進入完整專欄,這個系列所有文章都會整合到這個專欄
這一篇是補充第一篇的按鍵操作, 因為第一篇很多地方很詳細了, 寫了很大的篇幅, 所以單獨寫一篇用CubeMX配置STM32使用自帶按鍵的操作
提示 : 仍然按照先Cube配置再IAR或者Keil編程, CubeMX里面關於時鍾的配置跟我上一篇寫的一樣, RCC和SYS設置以及時鍾樹(Clock Configuration)都按照第一篇配置即可, 沒有什么特別的需求, 是從始至終不需改變這個地方的配置的。
1-2. 使用核心板自帶按鍵
操作簡介 : 通過板子上的兩個按鈕控制LED燈的亮滅 WK_UP按鍵按下則LED0閃爍, 松開停止閃爍並熄滅, 即WK_UP按鍵長按LED0才會持續閃爍 KEY0按下再松手, LED1就亮, 再按下一次LED1就滅, 類似於開關的功能,每按一次KEY0鍵, LED1狀態翻轉一次
Step1 <CubeMX配置>
(1) 新建工程(New Project)---->搜索自己所用的MCU型號(我的是STM32F407zg系列)
這里我直接把前面的工程拿來用, 添加對按鍵對應引腳的配置即可
這里關於引腳上拉下拉解釋一下: 可以看到, 當WK_UP按下時, +3.3v就進入PA0, 而KEY0按下時, PE4就會變為低電平。 所以WK_UP相當於有一個下拉電阻. 我在圖里標注了兩個額外的上下拉電阻, 便於理解清晰
此外, 電阻是上拉還是下拉是看通過這個電阻, 電流是注入引腳 (就是下拉) 還是從引腳流出 (即上拉)
1、比如WK_UP對應那個地方, 通過那個電阻將WK_UP那一邊鉗在了低電平, 所以是下拉電阻
2、同理, KEY0那個對應引腳, 相當於是有一個另一端接VCC的電阻, 從而在KEY0那個按鍵沒有按下的時候, KEY0引腳被鉗在了高電平, 那個電阻還起着限流的作用
(2) 引腳配置
這里我們將按鍵都設置為輸入引腳, 因為對應按鍵按下之后, 一個會給對應引腳輸入高電平, 一個會輸入低電平, 都會給引腳輸入一個信號, 所以設置為輸入GPIO_Input
根據前面的上下拉講解, 應該知道, WK_UP對應的PA0引腳應設置為內部下拉(Pull-down)
KEY0對應PE4引腳內部設置為上拉(Pull-up) 具體配置見下圖展示
同理配置KEY0對應的PE4
- 配置完成后點擊 Generate Code---->Open Project
(3) 部分初始化代碼展示
打開工程后, 我們先看一下多了哪些東西
在main.h 這里面也多了對引腳的宏定義, 因為我們自己給它起了個別名
Step2 <IAR或者Keil編程>
(1) 功能代碼編寫
下面我直接把代碼打出來, 便於復制
/* USER CODE BEGIN 3 */
// 在while(1)里面循環掃描, 判斷讀取的按鍵引腳狀態
// 先讀取WKUP引腳的電平 若為GPIO_PIN_SET(即WKUP得到了高電平, 表示這個按鍵按下了)
if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)
{
HAL_Delay(10); // 延時10ms, 做一個軟件的消抖, 防止因抖動而檢測到按鍵按下
if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);// 點亮LED0
HAL_Delay(100);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET); // 點亮LED0
HAL_Delay(100);
}
}
// 下面掃描KEY0按鍵的引腳信號
if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10); // 延時10ms, 做一個軟件的消抖, 防止因抖動而檢測到按鍵按下
if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
{
// 做一個松手檢測, 若KEY0一直是RESET(低電平),則一直在死循環
// 當KEY0位SET才會跳出,進而繼續執行下面的對 LED1 的操作
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}
}
}
/* USER CODE END 3 */
HAL_GPIO_ReadPin這個函數就是去讀取引腳的狀態, 讀取引腳是RESET(0)還是SET(非0)
在while(1)里面循環掃描, 如果發現按鍵按下, 就執行其內部的函數, 每次讀取引腳電平后還要用HAL_Delay()函數做一個小延時, 作為軟件消抖,消除按鍵意外抖動出現的結果
(2) 功能函數解釋
(3) 實際效果展示
我來過, 我戰斗過, 我不在乎結局! 加油
Author : 李光輝
date : Thu Dec 26 12:43:45 CST 2019
blog ID: Kevin_8_Lee
blog site : https://blog.csdn.net/Kevin_8_Lee/