当前位置: 首页 > java >正文

单片机的中断功能-简要描述(外部中断为例)(8)

一、中断的原理:
中断是一种机制,允许单片机在执行主程序时,被外部事件或内部事件打断,执行特定的处理程序(中断服务程序,ISR)。中断处理完成后,单片机返回到原来的任务继续执行。
二、中断也分优先级:
STM32F103C8T6支持中断优先级配置,允许高优先级的中断打断低优先级的中断。
优先级分为两个部分:
抢占优先级(Preemption Priority):高优先级的中断可以打断低优先级的中断。
子优先级(Sub Priority):当两个中断具有相同的抢占优先级时,子优先级较高的中断先执行。
三、中断处理过程
中断请求:外部事件或内部事件触发中断。
中断响应:单片机保存当前上下文,跳转到中断服务程序(ISR)。
中断处理:执行ISR中的代码。
中断返回:执行完ISR后,恢复上下文,返回到原来的任务。
四、案例:
按键中断是外部中断的常见应用之一。通过配置GPIO引脚为外部中断,可以实现按键按下时的即时响应,避免轮询检测。

当然电机控制中还有霍尔输入中断检测

STM32外部中断输入配置参考:

#include "stm32f10x.h"void EXTI_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 使能GPIOA和AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);// 配置PA0为浮空输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置EXTI线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// 配置EXTI中断EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  // 下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 配置NVIC中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}// EXTI0中断处理函数
void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 处理按键中断// ...// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line0);}
}int main(void) {EXTI_Init();  // 初始化外部中断while (1) {// 主循环}
}

五、中断使用注意事项:
(1)在不需要中断功能时,可以关闭相关GPIO引脚的时钟,进入低功耗模式,减少系统功耗。
(2)在某些情况下,多个GPIO引脚可以共享同一个中断线。例如,PA0、PA1、PA2可以共享EXTI0_IRQn中断。通过检查中断标志位,可以确定是哪个引脚触发了中断。
例:

void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 处理PA0中断EXTI_ClearITPendingBit(EXTI_Line0);}if (EXTI_GetITStatus(EXTI_Line1) != RESET) {// 处理PA1中断EXTI_ClearITPendingBit(EXTI_Line1);}if (EXTI_GetITStatus(EXTI_Line2) != RESET) {// 处理PA2中断EXTI_ClearITPendingBit(EXTI_Line2);}
}

(3)中断的嵌套应用:
在某些复杂的应用场景中,可能需要支持中断嵌套。通过合理配置中断优先级,可以实现高优先级中断打断低优先级中断。高优先级不能一直触发,不然低优先级始终得不到响应,具体看实际应用。
例:

// 配置高优先级中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 配置低优先级中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

(4)中断响应
在某些实时性要求较高的应用中,中断延迟是一个关键指标。通过优化中断处理函数,减少不必要的操作,可以降低中断延迟。
(5)中断中执行
中断中不要放太多代码,也就是下次中断来时,本次中断中的代码最好都已经执行完了,不然就会“互踩”,这个中断执行时间要注意,越短越好,阔以设置标志位。

// 优化的中断处理函数
void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 快速处理中断g_interrupt_flag=1; //中断进入标志  别的循环扫描中去清除并执行中断程序EXTI_ClearITPendingBit(EXTI_Line0);}
}

抛砖引玉,学海无涯,继续努力。

http://www.xdnf.cn/news/13650.html

相关文章:

  • ArkUI-X在Android上使用Fragment开发指南
  • 多节点并行处理架构
  • Linux 下 pcie 初始化设备枚举流程代码分析
  • 【软件开发】上位机 下位机概念
  • C++11 Type Aliases:从入门到精通
  • Linux笔记之Ubuntu22.04安装 fcitx5 输入法
  • pandas 字符串列迁移至 PyArrow 完整指南:从 object 到 string[pyarrow]
  • Nodejs特训专栏-基础篇:2. JavaScript核心知识在Node.js中的应用
  • STM32 开发 - STM32CubeMX 下载、安装、连接服务器
  • AUTOSAR图解==>AUTOSAR_TR_FrancaIntegration
  • oracle 表空间超过最大限度,清理数据释放内存
  • apple苹果商务管理联合验证使用自定义身份提供方
  • uniapp——input 禁止输入 ,但是可以点击(禁用、可点击)
  • 每日算法刷题Day29 6.12:leetcode二分答案4道题,用时1h10min
  • 给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(上)
  • 《TCP/IP协议卷1》TCP协议TCP连接建立和释放
  • IDEA2025(2025.1.1)都更新了什么???
  • Golang实现分布式Masscan任务调度系统
  • 力扣hot100-lc34在排序数组中查找元素的第一个和最后一个位置/lc153寻找旋转排序数组中的最小值/lc33搜索旋转排序数组
  • 岗位竞聘竞选报告个人简历PPT模版分享
  • 基于GeoTools的道路相交多个点容差冗余计算实战
  • MediaPipe如何训练自己的手势数据
  • Java异步编程:提升性能的实战秘籍
  • TruBit Pro:深化全球布局,拓展战略合作
  • (十三)计算机视觉中的深度学习:特征表示、模型架构与视觉认知原理
  • node-red的http-request组件调研三方接口请求参数为form-data解决方案
  • 数据分析入门初解
  • AbMole| Angiotensin II human(M6240;血管紧张素Ⅱ)
  • Vue.js 中 “require is not defined“
  • 大模型面试题:多模态处理多分辨率输入有哪些方法?