主要内容
上一篇文章中采用了EXTI中断的方式控制小灯的亮灭。其实也可以不采用中断,直接使用GPIO配置即可实现按键对应小灯的状态,且效果几乎相同。同样本次例程试验采用正点原子阿波罗STM32F429IGT6开发板,debug采用STLink(后续的文章中将不再赘述)。
试验的主要内容有:
1.正常的配置流程
2.修改代码实现对功能的优化和模块化设计
cubemx配置
按照相同的步骤,选择芯片,配置时钟树,小灯和按键的配置都和上节相同,不再赘述。
(需要注意的是,延时的操作不可避免的要使用HAL_Delay()函数,故在SYS处Debug勾选Serial Wire确保延时函数的正确使用。同时注意延时函数的优先级,本节例程暂时不会有冲突,但后续的会有,错误的优先级会导致程序卡死,后续再强调)
代码部分
1.普通功能
初始化配置已经在cubemx基本完成,我们的思路是检测按键的电平状态,通过GPIO反转函数令小灯的电平翻转,实现亮灭
主体函数如下所示
while (1)
{
if(HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_3) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
if(HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_3) == GPIO_PIN_SET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
if(HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_2) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
if(HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_2) == GPIO_PIN_SET)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
}
通过上电发现,并没有很好地实现功能,按键按下两个灯闪烁不定,此时考虑到没有对按键进行消抖处理。
按键消抖:由于采用的是机械按键,在按下瞬间的电平变化并不是理想的阶跃信号,具体的变化大致如图所示