欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32F401利用CubeMX实现按键中断翻转LED

程序员文章站 2022-04-02 07:54:28
...

硬件平台:NucleoF401RE

软件环境:CubeMX+Kiel5

硬件说明:参考Nucleo板子原理图,用户按键链接IO为PC13,LED链接IO为PA5;

STM32F401利用CubeMX实现按键中断翻转LED

STM32F401利用CubeMX实现按键中断翻转LED


如上搞清楚资源链接关系,就可以利用CubeMX进行初始化代码生成配置,比较简单。需要注意的是在中断嵌套部分需要设置外部中断10-15LINES;

STM32F401利用CubeMX实现按键中断翻转LED

利用CubeMX工具生产代码,下面对部分代码进行说明。

CubeMX生成初始化代码配置后,用户字需要添加自己业务需要的功能即可。

中断函数全部在stm2f4xx_it.c当中,如下所示:

/******************************************************************************/
/* STM32F4xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f4xx.s).                    */
/******************************************************************************/

/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

如上可以看出,中断触发后会调用HAL_GPIO_EXIT_IRQHandler()函数,其定义原型位于stm32f4xx_hal_gpio.c文件当中。

/**
  * @brief  This function handles EXTI interrupt request.
  * @param  GPIO_Pin Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

/**
  * @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
   */
}

如上回调函数,定义了UNUSED(GPIO_PIN)虚拟函数,注释中说明了如果需要实现回调功能,需要用户自己在User文件当中定义实现,如下在main.c中重新定义回调函数:

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_13)
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
/* USER CODE END 4 */

中断发生时,调用回调函数需要判断是哪个IO引起的,分别对应地去实现自定义的功能。