Qurak

Make Code Talk

0%

STM32单片机HAL库学习MacOS(2)——按键控制

——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软件,新建工程(这里我沿用上次的工程),打开配置界面。

时钟树配置

具体步骤:

  • 打开左侧目录中的System Core->RCC->HSE->Crysta/Ceramic Resonatorl

  • 打开Clock Configuration具体配置

    时钟树配置

引脚配置

按照上面的表格进行配置

引脚配置

设置完毕,点击生成代码Generate Code

按键控制软件部分

(1)基本函数介绍

本次实验中,我们主要用到GPIO引脚控制的功能。在HAL函数库中已经有了包装好的函数:

引脚输出HAL_GPIO_WritePin (...),引脚翻转**HAL_GPIO_TogglePin(..)**,读取引脚HAL_GPIO_ReadPin (...).

1
2
3
4
5
6
// 函数接口介绍
// GPIOx:引脚对应的区域(寄存器编号A-H) GPIO_PIN_x(引脚所在寄存器的位置)
// GPIO_PIN_SET(写入高电平) GPIO_PIN_RESTE(写入低电平)
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
//**********引脚管理***********
//if you want to change pins of KEY_Control, modify the GPIOx, and GPIO_PIN_x.
#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)
// use tags to make codes easier to understand
#define KEY0_Press 1
#define KEY1_Press 2
#define KEY2_Press 3
#define WKUP_Press 4

按键识别原理

引脚定义完,我们需要让单片机能识别出我们所按下的按键。这里提供一个思路:

D08BDF62-B42D-403C-AC91-6AA2EB10180A

用代码来编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uint8_t Key_Scan(uint8_t mode)                  //mode选择模式,1为支持连续;0为不支持连续
{
static uint8_t key=1; //静态变量key,只初始化一次
if(mode==1) key = 1;
if( key && (KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
HAL_Delay(10); //电路防抖,一般延迟10ms
key = 0; //标记按键已被按下
if(KEY0==0) return KEY0_Press; // 1表示KEY0
if(KEY1==0) return KEY1_Press; // 2表示KEY1
if(KEY2==0) return KEY2_Press; // 3表示KEY2
if(WK_UP==1) return WKUP_Press; // 4表示KEY_UP
}else if(KEY0==1 && KEY1==1 && KEY2==1 && WK_UP==0) key=1;
return 0; //无按键按下
}

(3)设计验证实验与代码编写

验证思路:

通过按键控制LED反映出四种不同的效果

image-20201221163030103

代码部分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)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
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);
}
/* USER CODE END 3 */
}

提示:代码记得写在指定区域哦(Bigin -> End)

然我们点击Build All,看到

1
Build Finished. 0 errors, 0 warnings. 

然后点击Run烧录到板子,就可以按按钮控制单片机的灯光。


END