【NUCLEO_F767ZI开发板系列】四、外部中断控制LED
程序员文章站
2022-04-02 07:54:46
...
外部中断
使用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一秒亮一次,按下按键,蓝色的灯亮,再按红色灯亮,继续按两次,蓝色红色灯依次熄灭。