一、内部中断:usart中断

1.在cubeMX中勾选usart1的NVIC(中断向量控制器)中的使能

2.点击生成代码

3.打开keil5会发现文件中多了一个stmf1xx_it.c文件,代码中有一个打开usart1中断服务函数

4.在main函数内的while循环前必须开启一次中断函数接收
 

	HAL_UART_Receive_IT(&huart1, &rx_byte, 1);

5.正常写while循环中的代码不影响中断回调

6.收到数据 → MCU 自动进中断 → HAL 调回调函数(就是说每次接收到数据就会启动一次中断的回调函数)
下面写一个demo每次传输完成就启动LED灯的反转

uint8_t rx_byte; //定义一个全局变量

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        if (rx_byte != NULL)
        {
            HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //自定义内容
            HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //自定义内容
        }

        // ⭐ 必须开启下一次接收
        HAL_UART_Receive_IT(&huart1, &rx_byte, 1);
    }
}

二、外部中断:GPIO中断

1.在cubeMX中选择外部中断引脚,这里选择PE4

2.配置PE4为上拉电阻下降沿有效

3.在PE4引脚配置中打开NVIC(中断向量控制器)的使能

4.点击cubeMX生成代码


5.打开keil5发现在中断入口文件stm32fxx_it.c中多了一个函数EXTI4_IRQHandler,这就是EXTI4 的中断服务函数

6.硬件中断需要现在在main函数内初始化GPIO

MX_GPIO_Init();  //GPIO初始化

7.正常写while循环中的代码不影响中断回调

8.GPIO电平变化 → MCU 自动进中断 → HAL 调回调函数(就是说每次接收到数据就会启动一次中断的回调函数)
此demo中在每次key0按下后,就会触发外部中断,运行中断函数,使得LED0反转

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == KEY0_Pin)   // PE4 按键
    {
        // ? 软件消抖:简单延时 10~20 ms
        for (int i = 0; i < 10000; i++);   // 简短延时,大约 10ms(视系统频率而定)

        // 再次读取引脚状态,确认按键真的被按下
        if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_SET) 
        {
            HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);  // 翻转 LED0
        }
    }
}

谢谢大家,我会继续努力
 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐