目录
前言
上节课我们学习了GPIO输出——使用固件库点亮LED,包含LED以及GPIO的讲解,以及具体代码的编写。那么我们节本课就接着上节课讲讲带参宏以及GPIO输入——按键检测。
创作不易,点个三连霸!
STM32第七节:GPIO输入——按键检测(包含带参宏)
带参宏
代码替换展示
我们在编写程序的时候,在其他代码里见到过带参宏的定义;例如LED_G(ON/OFF);这种定义,那么带参宏是纯粹的C语言知识,我们看以下的代码,这里就在上一节的基础上相当于替换掉了GPIO口操作的两行代码,换成了带参宏。
//GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
LED_G(OFF);
Delay(0xFFFFF);
//GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
LED_G(ON);
Delay(0xFFFFF);
那么,我们该如何定义带参宏呢?
定义带参宏
那么我们打开bsp_led.h,再次定义两个宏ON/OFF:
#define ON 1
#define OFF 0
#define LED_G(a) if(a) \
GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);\
else GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
这里我们其实是写了一个宏定义函数,我们设置了ON为1,OFF为0;在下面的宏函数中,定义LED_G(a)中的参量是否为1或0;这样我们就可以控制输出的具体代码,使得main.c文件更加简洁明了,可读性更强。
GPIO输入——按键检测
上节课讲了GPIO口的输出,这节课我们来讲讲输入。我们可以通过一个按键,来改变外部的这个电平的状态,让io口来读取电平的状态。
硬件部分
在我们的指南者板子上,只有两个按键K1,K2。 我们看右边的高电平为3V3,但是我们的GPIO对于这个是有限制的,所以我们在前面接了一个限流电阻(R4,R5,R7,R11),当按键没有按下的时候,默认接地,为低电平;按键按下之后,就变成了高电平。因为PA0有自动唤醒的功能wakeup,而wakeup一定要是上升沿才能唤醒的,为了统一风格,所以是上升沿输入。
电路图中的电容又有什么用呢?之前在学51单片机的时候,我们采取的消抖方式为软件消抖,我们这个是机械按键,需要延时20ms(消抖是前后都要消抖),要不然就会像交流电一样不断接通3.3V,如果我们接了这个电容的话,就会一直给电容充放电,直到稳定。之后无论是按下还是抬起,电容也在不断的充放电,对我们的电路没有影响。所以我们就不需要软件消抖。如果等于高电平,我们就确认按键按下了,如果等于低电平,我们就抬起了按键,进行相应的动作。
端口输入数据寄存器(GPIOx_IDR)
很显然,这个寄存器还是配置低位的寄存器,不做更改时为0&#