你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在STM32F0上实现排队优先级

[复制链接]
yangc9 发布时间:2019-10-11 13:18
抢占优先级(pre-emption priority):执行一个中断时,来了抢占优先级更高的中断,会暂停当前中断,先执行高级中断.' p9 L2 P! i9 O- R
排队优先级(sub-priority):一个中断执行完后,有多个抢占优先级相同的中断,先执行排队优先级最高的.如果排队优先级相同,或内核不支持排队优先级,先执行中断号最小的.- u) y4 u7 u) ~3 Z9 a# a- H( L
7 N1 f8 p3 o4 @. y6 c1 S0 H# {
STM32F1有16个优先级,可配置为16抢占,或4抢占4排队,等等.使用起来很方便.
- i* J$ V1 n. lSTM32F0只有4个抢占优先级,没有排队优先级.在响应多种输入有些不便.' s# b/ j2 @% A
我找到一个方法,可以在STM32F0上实现排队优先级.
; I  E9 R* A- Q+ ~+ H/ v3 c9 _8 X: y9 t/ I0 z
比如我有两个中断,RTC_IRQn和USART2_IRQn.按照中断号的顺序,RTC_IRQn在前.; ]6 K! S* v/ }1 |
但是我认为串口输入需要更快得到响应,要让RTC_IRQn在USART2_IRQn之后.2 m, J! m$ }9 R, Q7 R7 F6 n+ _
' R; \. T* X+ P0 a2 V
找一个未使用的中断,中断号要大于USART2_IRQn.比如CEC_CAN_IRQn,给他取个新的名字
5 M6 j, K$ `/ g2 j) k: O#define RTC_LP_IRQn CEC_CAN_IRQn/ \1 M8 O0 N& s$ J

$ Q- L- {' `/ W+ E0 a; A设置各中断的优先级8 K% t* ^- F3 y+ J* i
NVIC_SetPriority(RTC_IRQn, 1);
0 I! L5 C* [4 o3 ~! A% C' yNVIC_SetPriority(RTC_LP_IRQn, 2);
# }6 y7 g" P# b3 \- ZNVIC_SetPriority(USART2_IRQn, 2);7 j- T: o1 M! D( l  [+ E
) H( V& w7 k# e( _- O" w
在RTC_IRQn中清除中断标志并触发RTC_LP_IRQn
4 S3 N4 d& h) {( ^2 X$ C/ \. V3 cISR(RTC_IRQn); T; Z& n! E/ r" ~
{
$ L/ ~6 j. z: ?: ^5 w/ g( F        RTC->ISR &=~ RTC_ISR_ALRAF;  u6 |* J( E8 W
        EXTI->PR = 1 << 17;
2 d0 |. g. I( j: c: O        NVIC_SetPendingIRQ(RTC_LP_IRQn);
# R3 i  D$ Q0 d' D+ Q8 j+ K6 |}0 n, F( V$ q$ ~' p0 x
& o# o$ q% r4 a- S
在RTC_LP_IRQn中, 干些低优先级的事情.3 {5 k  F- E. s1 r1 {' N

( P8 u* B, F8 f3 Q, i关于ISR宏, 请见https://www.stmcu.org.cn/module/f ... =616105&pid=2353177
, q0 J# R) T9 X% l老样子,来点福利3 j% J4 L3 N: B* p% K( o
! Q1 ~6 g( j  n, t
* J. ~: Y9 ^( W4 e) Z$ I$ Q3 b# o
收藏 评论0 发布时间:2019-10-11 13:18

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版