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

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

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


    外部中断

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

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

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


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

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


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

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

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

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

 生成代码,可以看到在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);

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

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

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