[应用相关] STM32中断

[复制链接]
1160|19
 楼主| elephant00 发表于 2022-11-7 14:43 | 显示全部楼层 |阅读模式
一、STM32中断
1. 概念

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

中断全过程

214247r0zp7a1pp3oabb6o.png

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

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

3. 中断优先级


214326l56ek5eew2n86686.png

多个中断同时出现时,处理器先响应高优先级的中断
低优先级中断的ISR执行时,可以被高优先级中断再次打断
ISR比App Code拥有更高的执行优先级
 楼主| elephant00 发表于 2022-11-7 14:46 | 显示全部楼层
二、仿中断高低电平控制LED灯
1. CubeMx
进入STM32CubeMX新建项目

214247xwmhl66jtsesnzse.png

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

214247tvwofx33yhx3aozw.png

点击sys,将debug->Serial Wire

214251vd67xt1tcpxyb6gx.png

Rcc->HSE->Crystal/Ceramic Resonator

214251ahhdsbbuu3vwz1h4.png

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

214247iqtql6r03qvo776t.png

214248xkx100v7glsxmiz6.png
 楼主| elephant00 发表于 2022-11-7 14:51 | 显示全部楼层
设置中断触发器B0

214248e31k3kcqk18hzhjw.png

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

215723hwxrffprfxtfrm9k.png

NVIC设置:

214252zj6i7u2w0bb8t67b.png

完成项目生成
Project配置

215758tfen8gjr2fqa22j8.png

Code Generator

214254js8bn8kxaabbdvev.png

项目生成

214254zx916of8z559nhnh.png

2. 控制代码编写

打开工程,搜索HAL_GPIO_EXTI_Callback函数:

214248ra119oezkeioq1jr.png
弱函数,需要重写

214248t8rq88drxux9nd3b.png
 楼主| 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;
  •         }
  • }

复制代码


214248dbnrvmd8bmxx6jrn.png

3. 编译并烧录

214248bmbwmtkjfk9jwiht.png

使用mscuip进行烧录

214249vskxksptguepvf5t.png

4. 运行结果

214303c4h991gedowggzwk.gif

三、HAL库中断方式进行串口通信
1. CudeMX配置项目
点击sys,将debug->Serial Wire



Rcc->HSE->Crystal/Ceramic Resonator



A-Z->USART1->Mode

220336vsngfos2w9zoorvo.png

NVIC设置:



完成项目生成
Project配置

214253qwqsxo21umgwmscs.png

Code Generator



项目生成



2. Keil代码设置
main函数定义缓冲区大小
  • #define LENGTH 10   // 接收缓冲区大小

复制代码


214254n6zjuz82p2j7jt0z.png

 楼主| elephant00 发表于 2022-11-7 14:54 | 显示全部楼层
2. 定义缓冲区和标志位

  • uint8_t RxBuffer[LENGTH];   // 接收缓冲区
  • uint8_t Rxflag = 0;    // 标志位,0为接收未完成,1为接收完成

复制代码


214255o7787gdblg7ypwdr.png

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); // 使能接收中断
  •         }
  • }

复制代码


220737nrqjd2u2ni3wt2qo.png

6. 编译烧录

214256uq721955fkd92hc9.png

7. 运行效果

220808ibl0fh03dr8z7lh8.png

四、总结
中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。
提高Cpu的运行效率,可以处理突发事件
在曼谷的春 发表于 2022-11-20 23:22 | 显示全部楼层
说实话,就裸机用中断用的多些,能让单片机突出一些性能

月亮一键变蓝 发表于 2022-11-20 23:54 | 显示全部楼层
中断用得好,MCU会很好的处理程序逻辑的

她已醉 发表于 2022-11-21 00:26 | 显示全部楼层
其实我觉得中断就是操作系统的一种工具吧,让单线程看着像能处理多线程一样

春日负喧 发表于 2022-11-21 00:58 | 显示全部楼层
ST的中断还挺丰富的,很好用的

故意相遇 发表于 2022-11-21 01:30 | 显示全部楼层
好好用中断吧,以后开发STM32会经常遇到的

一只眠羊 发表于 2022-11-21 02:02 | 显示全部楼层
中断用好不容易的,用不好很容易冲突,导致程序跑飞的

未说出口的像你 发表于 2022-11-21 02:34 | 显示全部楼层
楼主可以多讲讲HAL操作,其实cubemx要是用好了,也行,很省时间

我吃小朋友 发表于 2022-11-21 03:06 | 显示全部楼层
一般都是串口中断,定时中断和外部触发中断用的比较多

将爱藏于深海 发表于 2022-11-21 03:38 | 显示全部楼层
我想知道,中断和操作系统是不是一个东西,就是操作系统是不是也是靠中断实现的时间片轮呢?

风凉 发表于 2022-11-21 04:10 | 显示全部楼层
中断还有唤醒等操作呢,其实楼主也可以多玩玩中断方面,挺有意思的

jf101 发表于 2024-6-23 15:18 | 显示全部楼层
中断对于系统故障处理能够快速响应
童雨竹 发表于 2024-11-16 08:10 | 显示全部楼层

引线长度就决定了其响应信号的波长
Wordsworth 发表于 2024-11-16 09:13 | 显示全部楼层

数字电压表(DVM)或仪器来测量效率
Clyde011 发表于 2024-11-16 10:16 | 显示全部楼层

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流
公羊子丹 发表于 2024-11-16 11:09 | 显示全部楼层

任何一条PCB引线都可能成为天线
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1031

主题

4001

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部