一、硬件设计
按键KEY1连接PB6,KEY2连接PC3。
二、软件设计
通过原理图知道按键通过一个上拉电阻接到3.3V,按键没有被按下时,GPIO输入口检测到为高电平,按键被按下时GPIO口检测到为低电平。
接下来配置STM32Cubemx,将GPIO配置为下降沿触发模式,选择Pull-up(上拉),UserLabal填Keyx方便后期维护代码,然后点击生成代码即可。
生成代码后,stm32f1xx_it.c中可以看到对应的中断处理代码,HAL_GPIO_EXTI_IRQHandler()函数中调用了一个中断回调函数HAL_GPIO_EXTI_Callback,通过其中的注释可知道,我们可以通过在自己的用户文件中重新定义此函数,来处理我们的中断触发事件。
void EXTI3_IRQHandler(void)
{
/* USER CODE BEGIN EXTI3_IRQn 0 */
/* USER CODE END EXTI3_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(Key2_Pin);
/* USER CODE BEGIN EXTI3_IRQn 1 */
/* USER CODE END EXTI3_IRQn 1 */
}
/**
* @brief EXTI line detection callbacks.
* @param GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
*/
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
所以,我们可以在main.c中重新对此函数进行定义,来实现我们自己的应用。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == Key1_Pin)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
if(GPIO_Pin == Key2_Pin)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
}
}
三、实验效果
按键控制LED亮灭。
STM32按键控制LED
结尾:
对这个项目感兴趣的小伙伴,完全可以根据本项目的文章教程,一步步自己搭建属于自己的STM32-FreeRTOS智能家居项目,如果需要完整资料和完整硬件的可私信我(有偿):原理图、STM32源码、Android app源码、操作教程。