抢占优先级(pre-emption priority):执行一个中断时,来了抢占优先级更高的中断,会暂停当前中断,先执行高级中断. 排队优先级(sub-priority):一个中断执行完后,有多个抢占优先级相同的中断,先执行排队优先级最高的.如果排队优先级相同,或内核不支持排队优先级,先执行中断号最小的.: Z l/ M& n4 I5 y6 ]6 g' F: B9 j 8 k( r* p3 S# P' s STM32F1有16个优先级,可配置为16抢占,或4抢占4排队,等等.使用起来很方便. STM32F0只有4个抢占优先级,没有排队优先级.在响应多种输入有些不便. 我找到一个方法,可以在STM32F0上实现排队优先级.+ E# n& _$ G! k3 }% P& z ! D# H/ h& r" w3 t9 v 比如我有两个中断,RTC_IRQn和USART2_IRQn.按照中断号的顺序,RTC_IRQn在前.) v5 w7 r. l7 Z) F" l 但是我认为串口输入需要更快得到响应,要让RTC_IRQn在USART2_IRQn之后./ U2 Z& }# s& o/ c- u# v 7 G* z7 c. M+ T: W, p 找一个未使用的中断,中断号要大于USART2_IRQn.比如CEC_CAN_IRQn,给他取个新的名字 #define RTC_LP_IRQn CEC_CAN_IRQn ( o# G2 S* C$ \0 D& P$ m 设置各中断的优先级 NVIC_SetPriority(RTC_IRQn, 1); NVIC_SetPriority(RTC_LP_IRQn, 2); NVIC_SetPriority(USART2_IRQn, 2);0 r6 s2 y/ d! S4 k4 v1 A# T: D % l5 G$ J+ q3 S; o M4 b# D 在RTC_IRQn中清除中断标志并触发RTC_LP_IRQn% q3 @& D- D% ~ `' P3 k ISR(RTC_IRQn) {- U" c) d$ x7 c RTC->ISR &=~ RTC_ISR_ALRAF;- Y2 K5 t$ {3 Z! J EXTI->PR = 1 << 17; NVIC_SetPendingIRQ(RTC_LP_IRQn);$ o5 E/ P1 Y8 E }! k! ]# Q: I+ k; i6 C8 v * E1 l# t/ w+ k" S 在RTC_LP_IRQn中, 干些低优先级的事情., R9 M0 j& |( `% s 7 ]/ G, Z% I1 g; z 关于ISR宏, 请见https://www.stmcu.org.cn/module/f ... =616105&pid=2353177 老样子,来点福利 ( M4 m# n( ?! [+ ]; O! u, {: |0 j |
STM32固件库分享,超全系列整理
三创电子(Tcreate)-STM32F030核心板代码
STM32F0 ADC(DMA中断)多通道,注释超详细
FreeRTOS在STM32F030上的移植
基于STM32移植而引发的疑问经验分享
分享STM32F051中文参考手册(重制书签版)
游名:STM32F0+Trinamic智能步进驱动芯片TMC5160(最高20A)参考原...
【MCU实战经验】+STM32F030的步进电机加减速
STM32F0的中文技术参考手册(标签处理过)
基于STM32F030硬件SPI经验分享