中断触发方式的比较

本文介绍了中断触发的两种主要方式——沿触发与电平触发,并详细分析了它们的特点及适用场景。探讨了不同触发方式对系统性能的影响,尤其是在带有操作系统的环境中如何正确处理中断,避免出现错误结果。
中断触发方式的比较
      在前后台系统或者带有OS的系统,中断处理程序是相对比较难的,对系统的性能影响比较大。在带有OS的系统中,中断作为一个异步使剑,还可以引发任务调 度。在带有OS的系统中我们经常会关闭中断,而在ISR中我们常常也需要关闭一些中断,关闭中断如果处理得不好,很可能会出现很多想不到的结果,所以处理 好中断非常的 关键。
      在这里对中断的触发方式进行介绍,不同的触发方式应用场合是不同的。一般中断分为电平触发和沿触发两种方式。
    沿触发: 这是很最常见的触发方式,我们可以用数字电路的方法来解释它的特性。沿触发应该应触发器来描述:  输入引脚(当作触发器的CLK) ----> 触发器------> 中断控制器 ,当输入引脚的相应的沿到来时,就会将触发器置1,并触发中断,触发器会一直保持电平1除非在ISR中用一条语句清0,否则会不断的触发中断,这也就是每 次触发中断都要清0的原因。当有高优先级的中断运行后退出时,处理器检测到触发器的值为1,所以依然会进入中断服务程序。
    电平触发: 有的时候,边沿触发很容易产生毛刺并导致误中断,这时候就要使用电平触发,电平触发是持续触发,可以用数字电路的缓冲器来描述
     输入引脚 ----> 缓冲器 ----> 中断控制器  , 缓冲器的作用就是对信号整形,并增加驱动能力,缓冲器输出的数据和输入的数据相同,可以看出输入引脚的电平直接放映到输出引脚,以高电平触发为例,只要输 入引脚的电平为高就立即触发中断,当ISR退出时如果电平依然为高则会再次触发中断,这也就是持续触发的来由,所以采用电平触发时必须保证电平的持续时间 不能太长,在ISR中可能需要适当的延时操作保证退出时电平为低,或者读出电平值,电平变低时才退出。 在带用 OS的系统中,很多关键的数据或者代码区(临界区)都需要关闭中断,那么它对中断有什么影响呢?  电平触发如果电平的持续时间比较短,很可能在关闭中断后再开中断之前电平已经变低,结果开中断后中断就没有触发,结果是这次中断被漏掉了,所以在带OS的 系统中一定不能关闭中断太久,在允许中断嵌套的情况下必须保证高优先级的中断执行时间不能超过电平的持续时间。 综合考虑,电平触发的持续时间不能太短也不能太长,在自己的系统中要仔细地考虑好中断地持续时间。
      另外,开关中断也是很讲究的,在我的开发中我就发现一种“ISR优先级翻转现象”,比如我有三个ISR,按照优先级的高低次序一次是 ISR0   ISR1  ISR2,我在ISR3 关闭ISR0的中断(因为共享数据需要互斥),可知ISR3 运行时ISR0不能得到响应,然而ISR1的优先级高于ISR2,所以在支持嵌套的情况下ISR1会打断ISR2的执行,显然这时即使ISR0中断到来也 不会得到响应,这也就是我遇到的ISR优先级翻转问题,当然这可能是我编写程序的风格不好,但是分析起来也是很有趣的,类似于任务的优先级翻转。
    编写ISR一般要求尽可能的简短,网上有不少这方面的资料吧,这里就不罗嗦了。
ADC中断触发方式主要分为**内部中断触发**和**外部中断触发**两种类型,具体实现方式取决于应用需求和硬件设计。 ### 内部中断触发 在STM32微控制器中,ADC模块具备内部中断功能,能够在特定事件发生时(如转换完成、溢出或错误)生成中断请求。该中断请求直接由ADC模块内部产生,并发送至NVIC(嵌套向量中断控制器),用于通知CPU处理相关事件。例如,当一次ADC转换完成后,若启用了转换完成中断,则ADC模块将触发一个中断,CPU可在中断服务程序中读取转换结果或进行其他处理[^1]。 ### 外部中断触发 外部中断触发是指通过外部信号源来启动ADC的转换过程。这种触发方式常用于需要与外部事件同步的场合,例如定时器事件、外部按键或传感器信号等。 - **定时器触发**:通过配置定时器的输出比较事件或更新事件作为ADC的触发源,实现周期性ADC采样。例如,使用TIM6的更新事件触发ADC1进行转换,可以实现固定时间间隔的电压检测[^2]。 - **外部引脚中断触发**:某些MCU支持使用外部中断线(如EXTI)触发ADC转换。例如,在GD32F103C8T6中,可以使用外部中断IT11触发ADC规则组通道的转换,IT15触发注入组通道的转换[^3]。 ### 软件触发中断触发的结合 在实际应用中,ADC的触发方式可以灵活组合使用。例如: - **软件触发**用于手动启动ADC转换,适用于单次采样或调试阶段。 - **中断触发**则用于自动化采样,尤其是需要与外部事件同步的场景。 在蓝桥杯嵌入式竞赛的示例中,ADC1_IN11(PB12)用于通过定时器中断触发采样R38电压,而ADC2_IN15(PB15)则通过软件触发方式采样R37电压。这种设计结合了两种触发方式的优点,既能实现周期性自动采样,又保留了手动控制的灵活性。 ### 示例代码(基于STM32 HAL库) 以下是一个使用定时器触发ADC转换的代码片段: ```c // 配置ADC为外部触发模式 adcHandle.Instance = ADC1; adcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T6_TRGO; // 使用TIM6 TRGO触发 adcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; HAL_ADC_Init(&adcHandle); // 配置定时器TIM6 htim6.Instance = TIM6; htim6.Init.Prescaler = 72 - 1; // 72MHz / 72 = 1MHz htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 1000 - 1; // 1MHz / 1000 = 1kHz -> 1ms周期 HAL_TIM_Base_Init(&htim6); HAL_TIM_Base_Start(&htim6); // 启动ADC转换 HAL_ADC_Start(&adcHandle); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值