你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32中断

[复制链接]
攻城狮Melo 发布时间:2022-11-6 21:41
一、STM32中断
1. 概念

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

中断全过程

b1c6a0b37133478a8f7facb7e2b607af.png

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

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

3. 中断优先级


9ac750d605af496cafec186dcfa61283.png

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

二、仿中断高低电平控制LED灯
1. CubeMx
进入STM32CubeMX新建项目

ac89a960cc594635b3477dda249c242d.png

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

b743484b91884d90976453ef3fc0f5cb.png

点击sys,将debug->Serial Wire

554ad4be75104802ae4197b7643601a7.png

Rcc->HSE->Crystal/Ceramic Resonator

f1c15c1207264f56ad907504e19a3998.png

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

8b901c6462164213883cd80738394665.png

9032f9a4de0e40c38b4869d35b2c56b3.png

设置中断触发器B0

7249775abf3f427d96916fc0f5dcf164.png

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

6a27cd33d09b4ff2a70188c0bd491ddd.png

NVIC设置:

e2c0949cd0fa4335989373616da4489c.png

完成项目生成
Project配置

d65255db5a524c2994a6e357ddb6cc1e.png

Code Generator

61ec552ceb494e589130b1d739bb152f.png

项目生成

2aa6ea99c3c14bafb6532b6eae5b8e7e.png

2. 控制代码编写

打开工程,搜索HAL_GPIO_EXTI_Callback函数:

55ea77097b1b4bbfbab3fc95fd9e5037.png

弱函数,需要重写

bc16521577e347a8ab7416de94e6e8a2.png

main.c中编写回调函数
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
  2.         GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);  // 读取b0的状态
  3.         switch (GPIO_Pin){
  4.                 case GPIO_PIN_0:
  5.                         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, b0_pin);  // 将a2写入与b0相同的电位
  6.                         break;
  7.         }        
  8. }
复制代码

475d801d9fec4ec6969ff58d66130b42.png

3. 编译并烧录

ebd7b55dec014e1a8e02309d7096dac0.png

使用mscuip进行烧录

6fbfc026914646bb8aab784b431cedc5.png

4. 运行结果

525526bb85974bf588de9d0c100ab505.gif

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



Rcc->HSE->Crystal/Ceramic Resonator



A-Z->USART1->Mode

af8ee2665df144ff8e722ceaf0b69505.png

NVIC设置:



完成项目生成
Project配置

cb50d1b09d734550b9260c6c9e228330.png

Code Generator



项目生成



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

0adac8f666d14e68bbef6a6ad5cae614.png

2. 定义缓冲区和标志位

  1. uint8_t RxBuffer[LENGTH];   // 接收缓冲区
  2. uint8_t Rxflag = 0;    // 标志位,0为接收未完成,1为接收完成
复制代码

0682b4fd3e644ea4a88ecad018e4c4c9.png

3. 定义接收成功信息

  1. HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);  // 使能接收中断
  2. char data[] = "\nReveive Success\n";  // 接收成功信息
复制代码

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

5.定义回调函数
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  2.         if (huart->Instance == USART1){
  3.                 Rxflag = 1;  // 设置标志位为1
  4.                 HAL_UART_Receive_IT(&huart1, (uint8_t*)&RxBuffer, LENGTH); // 使能接收中断
  5.         }
  6. }
复制代码

443d080f8e914ef1bbd14b6d22791825.png

6. 编译烧录

4b94fdc1fa804253bcf67d0c46f6d48f.png

7. 运行效果

972bd69780164f9880b645f46faa6635.png

四、总结
中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。
提高Cpu的运行效率,可以处理突发事件
————————————————
版权声明:Tarbet


收藏 评论0 发布时间:2022-11-6 21:41

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版