【NUCLEO_F767ZI开发板系列】四、外部中断控制LED


    外部中断

   使用STM32F767的外部中断来控制LED灯

 打开上一节的工程,在Cube里配置引脚PB13为中断源:GPIO_EXIT_13

 


接着配置引脚选项:引脚外部已经下拉,此处可以不选择下拉

 GPIO的Mode选择外部中断上升沿触发。 如图:



然后配置NVIC的中断管理:因为此处只用到了这一个外部中断,所以分组就选择了分组2,  

4个抢占优先级,4个响应优先级。使能外部中断线,配置优先级,这里都选择2 。


 生成代码,可以看到在GPIO的初始化函数中,中断已经配置好了

  GPIO_InitStruct.Pin = KEY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
 NVIC的配置也已经设置了:

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 2);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
 在主函数的下面添加代码:

 这是发生了外部中断之后的回调函数。在中断服务函数里被调用


/* USER CODE BEGIN 4 */

uint8_t Led_Set=0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if( HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_SET )
	{
		HAL_Delay(300);
		Led_Set++;
		if(Led_Set>=255) Led_Set=1;
		if(Led_Set%2 == 1)
			HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
		else
			HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
	}
}

/* USER CODE END 4 */

HAL库里默认将这个函数定义成了weak若函数,用户不来编写它,就会调用weak声明的若函数,

如果用户在别的,c文件里再次写了这个函数,就会调用用户编写的那个函数,编译器不会报错。默认的回调函数如下:

/**
  * @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
   */
}
 在主函数while(1)里添加如下代码:

 

		HAL_Delay(500);
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);

编译下载到开发板,实验现象:


 绿色的LED1一秒亮一次,按下按键,蓝色的灯亮,再按红色灯亮,继续按两次,蓝色红色灯依次熄灭。



猜你喜欢

转载自blog.csdn.net/qq_37147721/article/details/79263849