——Dec.9.2020
目录
本次实验采用正点原子STM32F407探索者开发版和STM32cubeIDE软件开发
一、开发板按键引脚配置
(1)开发板控制引脚配置
读过上一篇的小伙伴想必对于STM32cubeIDE的使用有了一定的了解,这里直接进入按键的引脚配置。通过查询正点原子STM32F407探索者开发版的引脚说明,下面列出我们本次实验需要用到的引脚以及相关配置:
引脚 GPIO_PIN |
功能 Function |
输入模式 GPIO |
PA0 |
WK_UP |
Input-Pull Down |
PE2 |
KEY2 |
Input-Pull Up |
PE3 |
KEY1 |
Input-Pull Up |
PE4 |
KEY0 |
Input-Pull Up |
PF9 |
LED_0 |
Output-Pull Up |
PF10 |
LED_1 |
Output-Pull Up |
我们打开STM32cubeIDE软件,新建工程(这里我沿用上次的工程),打开配置界面。
时钟树配置
具体步骤:
引脚配置
按照上面的表格进行配置
设置完毕,点击生成代码Generate Code
按键控制软件部分
(1)基本函数介绍
本次实验中,我们主要用到GPIO引脚控制的功能。在HAL函数库中已经有了包装好的函数:
引脚输出HAL_GPIO_WritePin (...)
,引脚翻转**HAL_GPIO_TogglePin(..)
**,读取引脚HAL_GPIO_ReadPin (...)
.
1 2 3 4 5 6
|
HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_SET/RESET); HAL_GPIO_TogglePin(GPIOx, GPIO_PIN_x); HAL_GPIO_ReadPin(GPIOx, GPIO_PIN_x, GPIO_PIN_SET/RESET);
|
了解函数后,我们开始编写我们的验证实验。
(2)准备工作
为了尽量规范代码的编写,增加代码的可读性,我们需要做一点重要的前期工作。
引脚宏定义
通过把引脚进行宏定义,我们可以集中管理引脚以及方便调用引脚。有时候可以通过宏定义简化某些操作(例如读取引脚电平等待)。另外,如果采用文件管理模块驱动代码,宏定义也是一个降低移植工作量的好方法(保住头发)👦 👍
1 2 3 4 5 6 7 8 9 10 11 12
|
#define KEY0 HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) #define KEY1 HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) #define KEY2 HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_2) #define WK_UP HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)
#define KEY0_Press 1 #define KEY1_Press 2 #define KEY2_Press 3 #define WKUP_Press 4
|
按键识别原理
引脚定义完,我们需要让单片机能识别出我们所按下的按键。这里提供一个思路:
用代码来编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| uint8_t Key_Scan(uint8_t mode) { static uint8_t key=1; if(mode==1) key = 1; if( key && (KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) { HAL_Delay(10); key = 0; if(KEY0==0) return KEY0_Press; if(KEY1==0) return KEY1_Press; if(KEY2==0) return KEY2_Press; if(WK_UP==1) return WKUP_Press; }else if(KEY0==1 && KEY1==1 && KEY2==1 && WK_UP==0) key=1; return 0; }
|
(3)设计验证实验与代码编写
验证思路:
通过按键控制LED反映出四种不同的效果
代码部分Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| while (1) {
key = Key_Scan(1); switch(key) { case WKUP_Press: { HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10,GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10,GPIO_PIN_SET); break; } case KEY0_Press: { HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET); break; } case KEY1_Press: { HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9); HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10); break; } case KEY2_Press: { HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); break; } } HAL_Delay(100); } }
|
提示:代码记得写在指定区域哦(Bigin -> End)
然我们点击Build All
,看到
1
| Build Finished. 0 errors, 0 warnings.
|
然后点击Run
烧录到板子,就可以按按钮控制单片机的灯光。
END