Bootstrap

STM32中断

一、STM32中断

1. 概念

  • 中断是由内核外部产生的,一般由硬件引起,比如外设中断和外部中断等。

2. 中断响应过程

  1. 中断源发出中断请求
  2. 判断处理器是否允许中断,以及该中断源是否被屏蔽
  3. 中断优先级排队
  4. 处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序
  5. 执行中断服务程序
  6. 恢复被保护的状态,执行中断返回指令,回到被中断的程序

中断全过程
在这里插入图片描述
中断分为同步中断和异步中断:

  • 同步中断:同步中断是当指令执行时由控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。
  • 异步中断:异步中断是由其他硬件设备依照 CPU时钟信号随机产生的。

3. 中断优先级

在这里插入图片描述

  • 多个中断同时出现时,处理器先响应高优先级的中断
  • 低优先级中断的ISR执行时,可以被高优先级中断再次打断
  • ISR比App Code拥有更高的执行优先级

二、仿中断高低电平控制LED灯

1. CubeMx

  1. 进入STM32CubeMX新建项目
    2.
  2. 检索所需芯片,并完成项目的基础创建
    在这里插入图片描述
  3. 点击sys,将debug->Serial Wire
    在这里插入图片描述
  4. Rcc->HSE->Crystal/Ceramic Resonator
    在这里插入图片描述
  5. 将PB0选为外部中断触发器,PA2控制led灯的->GPIO_output
    在这里插入图片描述
    在这里插入图片描述
    • 设置中断触发器B0
      在这里插入图片描述
  6. PLLCLK,晶振频率最大值改为72M赫兹
    在这里插入图片描述
  7. NVIC设置:
    在这里插入图片描述
  8. 完成项目生成
    • Project配置
      在这里插入图片描述
    • Code Generator
      在这里插入图片描述
    • 项目生成
      在这里插入图片描述

2. 控制代码编写

  1. 打开工程,搜索HAL_GPIO_EXTI_Callback函数:
    在这里插入图片描述
    • 弱函数,需要重写
      在这里插入图片描述
  2. 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配置项目

  1. 点击sys,将debug->Serial Wire
    在这里插入图片描述
  2. Rcc->HSE->Crystal/Ceramic Resonator
    在这里插入图片描述
  3. A-Z->USART1->Mode
    在这里插入图片描述
  4. NVIC设置:
    在这里插入图片描述
  5. 完成项目生成
    • Project配置
      在这里插入图片描述

    • Code Generator
      在这里插入图片描述

    • 项目生成
      在这里插入图片描述

2. Keil代码设置

  1. 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";  // 接收成功信息
  1. while循环发送信息与接收信息
if (Rxflag == 1){ // 若数据接收完成
	Rxflag = 0;  // 清除标志位
	HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF);  // 接收成功信息
	// 发送接收到的字符
	HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
}

  1. 定义回调函数
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库中断方式进行串口通信

;