/*出处:【keysking的stm32教程】 第6集 狂飙STM32中断_哔哩哔哩_bilibili*/

今天先是改了个一直以来的认知错误,跑马灯不用电平反转需要两次delay,不然第二次翻转就出现问题了。。。算是白学了,哈哈哈哈。

    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
    HAL_Delay(500);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
    HAL_Delay(500);

为了及时处理高优先级事件stm32引入了中断机制,这里我们做一个实验,按下按键之后让PC13小灯熄灭,平时保持常亮。

①PC13设置普通输出(我这个灯IO口输出低电平点亮)

stm32外部中断-LMLPHP

②按键对应的PB14设置GPIO_EXIT

stm32外部中断-LMLPHP

③选择合适的中断触发模式

stm32外部中断-LMLPHP

从上往下依次是:上升沿触发中断、下降沿触发中断、电平上升下降都触发中断;

stm32外部中断-LMLPHP

我手上这块板子按下按键PB14捕获低电平,所以选择下降沿触发。

④设置NVIC中断控制器,勾选开启中断向量EXIT[15:10]

stm32外部中断-LMLPHP

⑤再次生成代码打开ide发现CubeMX帮我们自动生成了这个中断处理函数

stm32外部中断-LMLPHP

增加翻转PC13电平的代码

stm32外部中断-LMLPHP

基本功能实现了,但是还没按键消抖,从原理图上看我这个板子根本没滤波电容。直接在中断里面使用阻塞式延时是个危险动作!所以这里调整一下滴答计时器中断和按键触发中断优先级顺序。

stm32外部中断-LMLPHP

/**
  * @brief This function handles EXTI line[15:10] interrupts.
  */
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
	HAL_Delay(10);
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)
	{
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
	}
  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}
04-25 23:54