由于是记录学习过程,难免会有错漏,直接指出即可
STM32CubeMX+Keil5按键操控LED,使用的是STM32F103ZET6
首先按键本身性质需要处理,按键按下会有信号抖动,前沿抖动和后沿抖动,一般前后沿抖动都为5-10ms,如果不消除抖动,进行处理时会出现一次按键被识别成多次
其实电路里面就可以直接硬件消抖,硬件消抖是利用RC低通滤波滤掉,额,应该是用电容,效果好不好我也不知道,好像说效果不一定好,电容的选择也有影响,而且能应用的地方有限,最重要的问题是我这个板子上没有,所以选择软件解决
因为用按键控制LED,所以先看原理图确定引脚
LED引脚,由图可得LED0和LED1为可控LED,分别接着PB5和PE5,接地那个灯是电源灯,接电源即亮



按键(KEY)引脚,第一个按键(KEY_UP)连接的引脚WK_UP为PA0有唤醒功能,即可以把MCU从睡眠或低功耗模式中唤醒为正常模式,简单介绍一下,WK_UP给一个上升沿即可唤醒,在实际操作上即为按一下KEY_UP按键,至于怎么进入睡眠模式和其他更详细的,先不管,以后再说,说这么多的意思是,虽然可以用KEY_UP按键,但是我还是不用了
所以就用KEY0,KEY1,KEY2三个按键,分别连接的是PE4,PE3,PE2
很明显就和我一开始说的,根据原理图,这三个按键是直接接地,没有连接电容之类的可以硬件消抖,所以要从软件入手



打开STM32CubeMX进行引脚设置,先打开时钟


选择debug方式,如果是使用板子的不要选择No Debug

设置LED的引脚PB5和PE5,设置为输出,为使LED不会接电就亮,初始电平为高

设置按键引脚PE4,PE3,PE2,设置为输入,因为按键另一边接地,所以按下按键就为低电平,所以内部上拉,设置为高电平,反之,如果按键接高电平的话,内部需要设置下拉,设置为低电平

判断一次按键电平然后延时一小会再判断一次,实现消除前沿抖动,选择导出


选择HAL库

导出然后打开,写入,实现的功能是按KEY0改变LED0亮灭,按KEY1改变LED1亮灭,按KEY2同时改变LED0和LED1亮灭

while (1)
{
/* USER CODE END WHILE */
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)//检测到KEY0为低电平
{
HAL_Delay(10);//延时10ms
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)//检测到KEY0还为低电平
{
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);//KEY0按下后状态维持到松开
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0电平
}
}
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)//检测到KEY1为低电平
{
HAL_Delay(10);//延时10ms
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)//检测到KEY1还为低电平
{
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET);//KEY1按下后状态维持到松开
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//翻转LED1电平
}
}
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)//检测到KEY2为低电平
{
HAL_Delay(10);//延时10ms
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)//检测到KEY2还为低电平
{
while(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET);//KEY2按下后状态维持到松开
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0电平
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//翻转LED1电平
}
}
/* USER CODE BEGIN 3 */
}然后实现出来是这样
