打印
[应用相关]

STM32中断

[复制链接]
645|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、STM32中断
1. 概念

中断是由内核外部产生的,一般由硬件引起,比如外设中断和外部中断等。
2. 中断响应过程
1.中断源发出中断请求2.判断处理器是否允许中断,以及该中断源是否被屏蔽
3.中断优先级排队
4.处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序
5.执行中断服务程序
6.恢复被保护的状态,执行中断返回指令,回到被中断的程序

中断全过程



中断分为同步中断和异步中断:

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

3. 中断优先级




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

使用特权

评论回复
沙发
elephant00|  楼主 | 2022-11-7 14:46 | 只看该作者
二、仿中断高低电平控制LED灯
1. CubeMx
进入STM32CubeMX新建项目



检索所需芯片,并完成项目的基础创建



点击sys,将debug->Serial Wire



Rcc->HSE->Crystal/Ceramic Resonator



将PB0选为外部中断触发器,PA2控制led灯的->GPIO_output




使用特权

评论回复
板凳
elephant00|  楼主 | 2022-11-7 14:51 | 只看该作者
设置中断触发器B0



PLLCLK,晶振频率最大值改为72M赫兹



NVIC设置:



完成项目生成
Project配置



Code Generator



项目生成



2. 控制代码编写

打开工程,搜索HAL_GPIO_EXTI_Callback函数:


弱函数,需要重写


使用特权

评论回复
地板
elephant00|  楼主 | 2022-11-7 14:52 | 只看该作者
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   // 接收缓冲区大小

复制代码




使用特权

评论回复
5
elephant00|  楼主 | 2022-11-7 14:54 | 只看该作者
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";  // 接收成功信息

复制代码


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

复制代码


5.定义回调函数
  • 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的运行效率,可以处理突发事件

使用特权

评论回复
6
在曼谷的春| | 2022-11-20 23:22 | 只看该作者
说实话,就裸机用中断用的多些,能让单片机突出一些性能

使用特权

评论回复
7
月亮一键变蓝| | 2022-11-20 23:54 | 只看该作者
中断用得好,MCU会很好的处理程序逻辑的

使用特权

评论回复
8
她已醉| | 2022-11-21 00:26 | 只看该作者
其实我觉得中断就是操作系统的一种工具吧,让单线程看着像能处理多线程一样

使用特权

评论回复
9
春日负喧| | 2022-11-21 00:58 | 只看该作者
ST的中断还挺丰富的,很好用的

使用特权

评论回复
10
故意相遇| | 2022-11-21 01:30 | 只看该作者
好好用中断吧,以后开发STM32会经常遇到的

使用特权

评论回复
11
一只眠羊| | 2022-11-21 02:02 | 只看该作者
中断用好不容易的,用不好很容易冲突,导致程序跑飞的

使用特权

评论回复
12
未说出口的像你| | 2022-11-21 02:34 | 只看该作者
楼主可以多讲讲HAL操作,其实cubemx要是用好了,也行,很省时间

使用特权

评论回复
13
我吃小朋友| | 2022-11-21 03:06 | 只看该作者
一般都是串口中断,定时中断和外部触发中断用的比较多

使用特权

评论回复
14
将爱藏于深海| | 2022-11-21 03:38 | 只看该作者
我想知道,中断和操作系统是不是一个东西,就是操作系统是不是也是靠中断实现的时间片轮呢?

使用特权

评论回复
15
风凉| | 2022-11-21 04:10 | 只看该作者
中断还有唤醒等操作呢,其实楼主也可以多玩玩中断方面,挺有意思的

使用特权

评论回复
16
jf101| | 2024-6-23 15:18 | 只看该作者
中断对于系统故障处理能够快速响应

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

945

主题

2688

帖子

5

粉丝