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

单片机的中断功能-简要描述(外部中断为例)(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);}
}

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

相关文章:

  • 聊一聊 Linux 上对函数进行 hook 的两种方式
  • 权限管理设计思路
  • 微波通信干扰设备——成都鼎讯
  • 实战案例-FPGA的JESD204B IP核配置详解
  • FDCAN 与 CAN 对比分析
  • 大数据学习(137)-大数据组件运行时角色
  • Spring Cloud Gateway + OAuth2 + JWT 单点登录(SSO)实现方案
  • Python 实现一个带进度条的 URL 批量下载工具(含 GUI 界面)
  • SKE 与 SM2、SM3、SM4 的关系 ,SPDM协议的详细解析
  • 伊吖学C笔记(6、数、求和、排列)
  • 亚远景-ASPICE认证流程全解析:从准备到通过的关键步骤
  • 从数学到代码:一文详解埃拉托色尼筛法(埃式筛)
  • 远程管理命令:网卡和IP地址的概念
  • SLAM文献之-Degeneracy-Aware Factors with Applications to Underwater SLAM
  • 解决office各种疑难杂症
  • Vue3+TypeScript实现状态模式
  • 力扣100- 环形链表
  • oracle 23ai对象注释新特性ANNOTATIONS
  • HALCON第六讲->测量和检测
  • 图书管理系统的功能与性能测试
  • 单位门户网站建设存在问题/网销怎么做
  • 做电影网站被抓/饥饿营销的十大案例
  • 佛山怎么做网站/怎样建网站赚钱
  • 做网站如何避免商标侵权/免费打广告网站
  • 乌兰察布做网站公司/免费刷赞网站推广免费
  • 网站读取错误时怎样做/南宁seo营销推广