STM32中断
一、STM32中断
1. 概念
- 中断是由内核外部产生的,一般由硬件引起,比如外设中断和外部中断等。
2. 中断响应过程
- 中断源发出中断请求
- 判断处理器是否允许中断,以及该中断源是否被屏蔽
- 中断优先级排队
- 处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序
- 执行中断服务程序
- 恢复被保护的状态,执行中断返回指令,回到被中断的程序
中断全过程
中断分为同步中断和异步中断:
- 同步中断:同步中断是当指令执行时由控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。
- 异步中断:异步中断是由其他硬件设备依照 CPU时钟信号随机产生的。
3. 中断优先级
- 多个中断同时出现时,处理器先响应高优先级的中断
- 低优先级中断的ISR执行时,可以被高优先级中断再次打断
- ISR比App Code拥有更高的执行优先级
二、仿中断高低电平控制LED灯
1. CubeMx
- 进入STM32CubeMX新建项目
- 检索所需芯片,并完成项目的基础创建
- 点击sys,将debug->Serial Wire
- Rcc->HSE->Crystal/Ceramic Resonator
- 将PB0选为外部中断触发器,PA2控制led灯的->GPIO_output
- 设置中断触发器B0
- 设置中断触发器B0
- PLLCLK,晶振频率最大值改为72M赫兹
- NVIC设置:
- 完成项目生成
- Project配置
- Code Generator
- 项目生成
- Project配置
2. 控制代码编写
- 打开工程,搜索
HAL_GPIO_EXTI_Callback
函数:
- 弱函数,需要重写
- 弱函数,需要重写
- main.c中编写回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); // 读取b0的状态
switch (GPIO_Pin){
case GPIO_PIN_0:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, b0_pin); // 将a2写入与b0相同的电位
break;
}
}
3. 编译并烧录
使用mscuip进行烧录
4. 运行结果
三、HAL库中断方式进行串口通信
1. CudeMX配置项目
- 点击sys,将debug->Serial Wire
- Rcc->HSE->Crystal/Ceramic Resonator
- A-Z->USART1->Mode
- NVIC设置:
- 完成项目生成
-
Project配置
-
Code Generator
-
项目生成
-
2. Keil代码设置
- main函数定义缓冲区大小
#define LENGTH 10 // 接收缓冲区大小
2. 定义缓冲区和标志位
uint8_t RxBuffer[LENGTH]; // 接收缓冲区
uint8_t Rxflag = 0; // 标志位,0为接收未完成,1为接收完成
3. 定义接收成功信息
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); // 使能接收中断
char data[] = "\nReveive Success\n"; // 接收成功信息
- while循环发送信息与接收信息
if (Rxflag == 1){ // 若数据接收完成
Rxflag = 0; // 清除标志位
HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF); // 接收成功信息
// 发送接收到的字符
HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
}
- 定义回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart->Instance == USART1){
Rxflag = 1; // 设置标志位为1
HAL_UART_Receive_IT(&huart1, (uint8_t*)&RxBuffer, LENGTH); // 使能接收中断
}
}
6. 编译烧录
7. 运行效果
四、总结
- 中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。
- 提高Cpu的运行效率,可以处理突发事件
五、参考
STM32之中断控制LED灯
STM32中断控制的流程
【嵌入式11】HAL库实验中断开关点灯及串口通信
【STM32CubeMX】HAL库中断方式UART串口通信
HAL库中断方式进行串口通信