硬件模块常使用的外部中断及中断优先级
😝硬件模块常使用的外部中断及中断优先级😝
- 例1:旋转编码器的输出信号:
- 例2:红外遥控接收头的输出:
- 例3:按键
- 总结:
- 中断优先级:
对于STM32来说,想要获取的信号是外部驱动的很快的突发信号
例1:旋转编码器的输出信号:
- 可能很久都不会拧它,不需要STM32做任何事情
- 但是一拧它,就会有很多脉冲波形需要STM32接收
- 信号是突发的,STM32不知道什么时候会来
- 外部驱动的,STM32只能被动读取
- 信号非常快,STM32稍微晚一点来读取,就会错过很多波形
例2:红外遥控接收头的输出:
- 接收到遥控数据后,它会输出一段波形,这个波形转瞬即逝,并且不会等你
例3:按键
- 外部驱动的突发事件
- 但是并不推荐使用中断来读取按键,因为外部中断不好处理按键抖动和松手检测的问题
- 对于按键来说,输出波形也不是转瞬即逝的
- 要求不高的话可以在主程序中循环读取
- 如果不想用主循环读取,可以考虑定时器中断读取的方式
- 这样既可以做到后台读取按键值、不阻塞主程序,也可以很好地处理按键抖动和松手检测的问题
总结:
使用外部中断的硬件模块所具有的特性可能包括:
- 信号是突发的
- 信号速度非常快,转瞬即逝,难以捕捉
- 没有信号过来时,SMT32不需要做任何事情
- 在中断内部时不需要做很复杂的事情
- 注意:建议在中断和主函数中不要操作同一个外设,避免发生异常:可以在中断里操作变量或者标志位,当中断返回时,再对这个变量进行显示和操作,这样既能保证中断函数的简短快速,又能保证不产生冲突的硬件操作
在其他地方,也可以多用变量或者标志位,来减少代码之间的耦合性,让各部分代码相互独立。
仅用变量、标志位或者函数作为接口,能使程序更加清洗,代码更加强健。
中断优先级:
-
pre-emption priority 先占优先级——抢占优先级
抢占优先级是中断能否打断其他中断的属性。
在STM32中,中断服务函数正在执行时,如果发生了一个更高抢占优先级的中断,当前中断会被新的中断打断,形成中断嵌套。抢占优先级由NVIC_IRQChannelPreemptionPriority参数配置,优先级数值越小,优先级越高。 -
subpriority 从占优先级——响应优先级
响应优先级在抢占优先级相同的情况下起作用。当两个抢占优先级相同的中断同时发生时,响应优先级高的中断会先得到处理。响应优先级由NVIC_IRQChannelSubPriority参数配置,数值越小,优先级越高。 -
优先级分组(Priority Grouping)
STM32通过NVIC_PriorityGroupConfig函数设置优先级分组,这决定了抢占优先级和响应优先级在中断优先级寄存器中的位分配。分组有五种方案,从第0组到第4组,分别对应不同的抢占优先级和响应优先级的位数配置。例如,第2组配置中,抢占优先级有4个等级(0-3),响应优先级也有4个等级(0~3)。