第一步:首先检查自己的硬件原理图,一定要确定自己的按键到底需要接上拉电阻还是下拉电阻。我的板子原理图如下,wk_up需要接下拉电阻,固定在低电平使其通路。KEY0与KEY1则需要接上拉电阻,固定在高电平使其通路。
上拉电阻:将一个不确定的信号(高或低电平),通过一个电阻与电源VCC相连,固定在高电平。
下拉电阻:将一个不确定的信号(高或低电平),通过一个电阻与地GND相连,固定在低电平。
上、下拉电阻的作用:
一般说法是上拉增大电流,下拉电阻是用来吸收电流。
1、当 TTL 电路驱动 CMOS 电路时,如果电路输出的高电平低于 CMOS 电路的最低高电平 (一般为 3.5V), 这时就需要在 TTL 的输出端接上拉电阻,以提高输出高电平的值。
2、OC 门电路必须使用上拉电阻,以提高输出的高电平值。
3、为增强输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在 CMOS 芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻以降低输入阻抗, 提供泄荷通路。
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限,增强抗干 扰能力。
6、提高总线的抗电磁干扰能力,管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上、下拉电阻是电阻匹配,有效的抑制 反射波干扰。
按键延时消抖处理按键不灵敏问题
方法一:(不推荐,不推荐在中断中使用延时函数,当然你硬是要使用也可以看看):
HAL_Delay()分析 中断中使用HAL_Delay()这时候下载的代码,用keil单步执行不难看出,在进入回调函数之后就一直在HAL_Delay陷入了死循环中,怎么也出不来,小小的延时函数为什么会出现这种情况呢?百度一下HAL_Delay函数卡死,相关帖子层出不穷,真正说出原因并提供解决方法的几乎没有。但其实原因并不难,进来HAL_Delay函数看看就知道。
计时器的时基来源是 SysTick定时器,且在固定时间间隔内产生中断。Interrupt这一词是问题的关键,既然是中断,势必就有优先级,如果在中断里面HAL_Delay会卡死,而main函数则不会,那么有没有可能是Systick优先级太低造成的呢。带着这个问题我们回到STM32CubeMX中重新找到NVIC。
这时候我们注意到在默认使能的中断里面有一个System tick的中断,这就是给HAL_Delay函数提供时基的定时器中断了。显然,这个中断的抢占优先级和外部中断的抢占优先级是一样的,那么在外部中断触发时肯定不能接着触发systick中断了,问题已经找到,只需要简单地将外部中断的抢占优先级改低即可。
方法二:(推荐)
在进入中断时候进行相应的中断线失能,结束相应的中断函数操作后,再中断使能。
示例:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_NVIC_DisableIRQ(EXTI3_IRQn);
HAL_NVIC_DisableIRQ(EXTI4_IRQn);
switch(GPIO_Pin )
{
case KEY1_Pin :
HAL_GPIO_TogglePin (LED1_GPIO_Port,LED1_Pin );break ;
case KEY2_Pin :
HAL_GPIO_TogglePin (LED2_GPIO_Port,LED2_Pin );break;
}
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}