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的状态,这里就不重复展示了
|