|
抢占优先级(pre-emption priority):执行一个中断时,来了抢占优先级更高的中断,会暂停当前中断,先执行高级中断.) Q) M5 M/ E- k4 a6 X) z/ O$ l 排队优先级(sub-priority):一个中断执行完后,有多个抢占优先级相同的中断,先执行排队优先级最高的.如果排队优先级相同,或内核不支持排队优先级,先执行中断号最小的.% X& Y* `7 M$ a# J+ z- Q9 J STM32F1有16个优先级,可配置为16抢占,或4抢占4排队,等等.使用起来很方便." ?- S9 t+ K; I7 Z4 P# u STM32F0只有4个抢占优先级,没有排队优先级.在响应多种输入有些不便. 我找到一个方法,可以在STM32F0上实现排队优先级.0 a, G% x4 q7 H& ?% f0 `' ~! L( h ) A' |8 \& U* D! f* I4 Y 比如我有两个中断,RTC_IRQn和USART2_IRQn.按照中断号的顺序,RTC_IRQn在前.6 f3 E. s1 C* ^+ j/ b 但是我认为串口输入需要更快得到响应,要让RTC_IRQn在USART2_IRQn之后. 找一个未使用的中断,中断号要大于USART2_IRQn.比如CEC_CAN_IRQn,给他取个新的名字 #define RTC_LP_IRQn CEC_CAN_IRQn! \ X4 E* C, Y) z3 e K/ { 设置各中断的优先级- M J {6 X1 R* b. { NVIC_SetPriority(RTC_IRQn, 1);1 {% Y" G1 }% S) e ], Y) ^ NVIC_SetPriority(RTC_LP_IRQn, 2); NVIC_SetPriority(USART2_IRQn, 2); : F* M5 k$ H* c: t+ c+ ` 在RTC_IRQn中清除中断标志并触发RTC_LP_IRQn8 l6 h1 K4 g2 w7 [ ISR(RTC_IRQn) { RTC->ISR &=~ RTC_ISR_ALRAF;& r0 Z& {# n1 ~! R EXTI->PR = 1 << 17; NVIC_SetPendingIRQ(RTC_LP_IRQn);& [% R1 M" i* ?; Y! V! D& c }+ ~5 X% j- [$ I. i$ t& V / l4 g( S0 i8 [" L: L 在RTC_LP_IRQn中, 干些低优先级的事情.% ]. @; ?5 p8 [7 a" ^# s+ j5 G, h 关于ISR宏, 请见https://www.stmcu.org.cn/module/f ... =616105&pid=23531773 v0 ~) V$ A! F0 w" x; S 老样子,来点福利% q* @+ ^" u3 Q 4 T0 n; \: D- k8 B! W4 }' i+ i; P4 z2 k! }5 |1 e% p- H: f9 k. T |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版