STM32L562E-DK预置了一个可编程按键,接在了PC13上,高电平触发
打开之前创建的工程,由于之前选择的是开发板生成的工程,生成工程时已经将按键的初始化代码写进去了,不需要再重新写初始化代码,我们只需要调用即可。
先以轮询方式实现按键检测,按键轮询是间隔很短时间不断查询GPIO电平状态,判断电平是否有发生改变,从而得知是否有按键动作,需要注意的是按键在按下或释放的过程中,可能会伴随抖动,如图示意
在这抖动过程中,会产生多次高低电平,如果不加处理会被识别为多次按键操作,因此为了避免误判需要进行去抖处理,一般软件上可以用延时来去抖
用轮询的方式写个按键检测程序,用按键控制2个LED的亮灭,代码实现如下
void AppUserLoop(void)
{
if(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin))
{
LL_mDelay(20);
if(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin))
{
LL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
LL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);
while(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin));
}
}
}
在主循环中调用AppUserLoop,运行效果如下
接下来用中断方式实现按键检测,与上面的轮询方法不同,这种方式并不用一直查询GPIO的状态,按键状态改变时会产生中断,程序在检测到中断后再判断按键状态,接下来用STM32CubeMX配置这个按键的中断,双击工程目录中的这个.ioc文件打开STM32CubeMX
选中PC13在右侧的pinout view中对应的引脚会闪烁
用鼠标左键点击这个引脚,把它配置成中断模式,GPIO mode设置成上升沿检测
切换到NVIC标签,使能中断
点击GENERATE CODE,再重新打开MDK,可以看到中断初始化和中断处理方法都添加好了
修改一下刚才的程序,增加一个标识,中断触发后标识置1,主循环中检测到标识被置1后再检测按键是否被按下,代码实现如下
uint8_t user_button_int_flag = 0;
void EXTI13_IRQHandler(void)
{
/* USER CODE BEGIN EXTI13_IRQn 0 */
/* USER CODE END EXTI13_IRQn 0 */
if (LL_EXTI_IsActiveRisingFlag_0_31(LL_EXTI_LINE_13) != RESET)
{
LL_EXTI_ClearRisingFlag_0_31(LL_EXTI_LINE_13);
/* USER CODE BEGIN LL_EXTI_LINE_13_RISING */
user_button_int_flag = 1;
/* USER CODE END LL_EXTI_LINE_13_RISING */
}
/* USER CODE BEGIN EXTI13_IRQn 1 */
/* USER CODE END EXTI13_IRQn 1 */
}
void AppUserLoop(void)
{
if(user_button_int_flag != 0)
{
user_button_int_flag = 0;
LL_mDelay(20);
if(LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin))
{
LL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
LL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);
}
}
}
改好后的运行效果和之前轮询模式一样,可以正常通过按键切换2个LED的状态,这里就不重复展示了
|