5. 按键控制
5.1 独立按键基础知识
独立按键是一种简单的输入设备,广泛应用于各种电子设备中,用于实现基本的用户交互。它们的工作原理通常基于一个简单的机械开关,当按下按键时触发某些操作。独立按键可以有多种尺寸、形状和颜色,便于用户辨识和使用。
5.2 独立按键结构组成
独立按键的主要结构组成包括:按钮、外壳、弹簧、触点、导电片和引脚。当按下按键时,导电片触碰到触点,从而形成一个闭合电路。
5.3 独立按键原理
独立按键原理主要是基于机械触点和电气触点之间的关系。当按键未被按下时,通常触点是分开的,电路是断开的。当用户按下按键时,触点在弹簧和导电片的作用下形成闭合,这时电路连通,微控制器能够读取到该按键触发的信号。
5.4 消抖措施
由于机械按键在闭合和分开时可能产生的机械振动(相当于弹簧),导致开关状态在短时间内多次变换,这就是按键抖动现象。消抖措施主要分为软件消抖和硬件消抖:
- 软件消抖:主要是通过编程的方法,设定一个延迟或计时器,确保在一定的时间内只读取一次按键状态,避免抖动对程序的影响。
- 硬件消抖:在按键电路中加入元器件如电阻、电容组成的RC低通滤波器,对按键信号进行平滑处理,降低抖动的影响。
5.5 独立按键驱动原理
独立按键驱动是为了让微控制器能识别按键的状态,而微控制器正好可以识别高电平和低电平,所以大多数的按键都是通过给按键的一端接入高电平,一端接入GPIO;或者是给按键的一端接入低电平,一端接入GPIO。通过检测连接按键的引脚有没有发生电平变化,就可以知道按键是否按下。
5.6 独立按键原理图
在开发板的原理图中,一共有三个按键,分别是RST,BSL,B21按键。
其中RST是芯片复位功能按键,不能通过软件的方式去控制该按键。
BSL是特殊按键,它接到了PA18引脚,该引脚是用于进入升级模式进行串口下载等操作的特殊引脚,不建议使用。
B21按键就是用户的可以操控的按键,将PB21引脚接入了一个按键,通过按键接到GND。采用的检测方式是通过给按键的一端接入低电平,一端接入GPIO。在没有按下按键时,因为内部软件配置的上拉电阻的存在,导致一直处在高电平;当按键按下时,PB21引脚将被变为低电平的GND。这样高低电平的变化,就可以让开发板检测到按键的状态。
⚠说明
PA18引脚为MSPM0G3507芯片的BSL引脚,用于启动芯片的BootLoader模式,非特殊情况,请确保在给开发板通电时,PA18引脚为低电平,否则将会启动BootLoader模式,导致无法正常执行之前所下载的代码。
5.7 输入模式配置
在单片机中,引脚输入模式指的是设置某个引脚为输入引脚,用来接受外部信号的方式。而我们要知道接入按键的引脚上的状态,那不就是输入功能吗。接收外部信号 = 按键的高低电平变化。
5.7.1 准备一个空白工程
将SDK路径下的G3507空白工程复制到SDK的根目录下:
必须复制到SDK的根目录下,不然无法找到文件
在Keil中打开我们复制的空白工程 empty。
设置图形化配置文件保存路径:
源:
cmd.exe /C "$P../../../../../../tools/keil/syscfg.bat '$P' empty.syscfg"
改:
cmd.exe /C "$P../../tools/keil/syscfg.bat '$P' empty.syscfg"
设置工程头文件路径:
改为:
设置工程链接器:
改为:
../../source/ti/driverlib/lib/keil/m0p/mspm0g1x0x_g3x0x/driverlib.a
完成之后编译,可以看到没有报错了。
5.7.2 开启SYSCONFIG配置工具
在Keil的主界面打开empty.syscfg文件,在empty.syscfg文件打开的情况下,再打开SYSCONFIG的GUI界面。
先配置LED,因为我们要通过按键,去控制LED的亮灭。
5.7.3 配置指定引脚为输入模式
在GPIO中,再新建一组GPIO,然后配置引脚的参数。配置PB21引脚为上拉电阻的输入模式。
上下拉电阻说明
上下拉电阻(Pull-up resistor 和 Pull-down resistor)是在数字电路中常用的一种电阻,它们用于保证电路在未明确连接到高电平或低电平时能够保持一个确定的状态。
上拉电阻(Pull-up resistor):
上拉电阻是指连接到电源电压(Vcc)的电阻。 它通常用于将输入或输出信号线拉向高电平状态,当该线路没有被其他信号源驱动时,上拉电阻确保线路维持高电平。 在开漏(open-drain)或开集(open-collector)输出电路中,上拉电阻是必须的,因为这些输出类型只能将信号拉低,不能主动将其拉高。
下拉电阻(Pull-down resistor):
下拉电阻是指连接到地(GND)的电阻。 它用于将输入或输出信号线拉向低电平状态,确保当该线路没有被其他信号源驱动时,线路维持低电平。 在某些电路设计中,下拉电阻可以用来防止信号线由于干扰或静电而意外跳变到高电平。
将以上配置保存,然后到Keil中编译更新。
5.8 按键点灯实验
LED的控制使用的是之前LED章节的内容。那么我们应该怎么读取引脚的状态,用来控制LED亮还是灭呢?
使用函数 uint32_t DL_GPIO_readPins(GPIO_Regs* gpio, uint32_t pins) 可以读取引脚的状态。 需要输入两个参数:
参数说明
gpio:读取的GPIO端口。G3507芯片只有GPIOA和GPIOB端口,这里选择GPIOB。
pins:读取的引脚号。根据我们sysconfig配置的引脚名称,这里写入的是KEY_PIN_22_PIN。
它会返回的参数: 类型为uint32_t ,返回的是对应引脚的状态位。比如以PA18为例。当PA18引脚检测到低电平时,返回的值是0;当PA18引脚检测到高电平时,对应的32位寄存器中PA18的位将会被置1,返回的值为0x40000,换为2进制就是:100 0000 0000 0000 0000。
从代码一直查找到用户手册的寄存器,可以知道,二进制的 100 0000 0000 0000 0000 对应的就是PA18引脚。数据手册中,是从0开始往左边算,二进制的100对应的就是PA2号引脚为高电平,10000对应的就是PA4引脚为高电平。
现在我们知道了如何读取对应引脚的状态,那么在empty.c中编写以下代码:(主要是要有main函数的文件)
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
while (1)
{
//如果读取到的引脚值等于0,说明PB21引脚为低电平
if( DL_GPIO_readPins(KEY_PORT, KEY_PIN_21_PIN) == 0 )
{
DL_GPIO_setPins(LED1_PORT,LED1_PIN_22_PIN); //LED控制输出高电平
}
else//如果PA21引脚为高电平
{
DL_GPIO_clearPins(LED1_PORT,LED1_PIN_22_PIN);//LED控制输出低电平
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
编译代码。编译通过:0报错0警告
确认编译成功后,我们将代码烧录开发板中即可。这里我使用J-LINK连接开发板。
J-LINK | 开发板 |
---|---|
5V | 5V |
CLK | CLK |
SWD | DIO |
GND | GND |
Keil中J-LINK下载的配置
配置完J-LINK后,重新编译,然后点击下载:
将代码编译烧录到开发板中即可看到,当按下按键时LED亮,松开按键时LED灭。