STMCU小助手
发布时间:2022-12-26 15:00
|
Cortex M3内核支持256个中断,其中包含:$ ]/ T. e! F6 Y x* w& [ 16个内核中断( _1 `+ }6 D1 S8 D4 } 240个外部中断 并且具有256级可编程中断设置 STM32F1并没有使用Cortex M3的全部6 x/ p4 X7 G! ~5 Q7 T% A; S 8 F" Q# Q$ b1 \+ W4 F STM32有84个中断,其中包括: 16个内核中断 68个外部中断(可屏蔽中断). N' h: V' N K. ~ STM32F103系列只有60个可屏蔽中断 # ?( q0 `5 W: N' {8 J8 C5 E1 Z2 ? 2 K7 {8 K0 d8 A6 \$ ^ 中断优先级分组 首先,对STM32中断进行分组(在系统初始化时就分好组),组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值 分组配置是在寄存器SCB->AIRCR中进行配置8 G' C# e0 a7 C. ]( _4 R1 U
在SCB的AIRCR寄存器的8到10位可以对中断进行分组 Y7 v8 j$ s+ f! T k5 D3 w 假设被分到组2,意味着每个中断可以设置2位抢占优先级,2位响应优先级: t1 t" U7 z$ s# c 对于每个中断,他有一个IP寄存器,4到7位,相当于一共4个位可以用来设置抢占和响应 % c( ]) V) I( `4 q- U9 u+ h STM32F103具有16级可编程的中断优先级,为什么是16级呢?! v$ P9 |' M5 {; T* Z7 }( V' A W' _ l! H& I. ~* A 因为4个位可以用来设置抢占和响应7 T7 z* b L# R. \ 2的4次方就是16! y& q2 B6 _0 ]1 U3 m 抢占优先级与响应优先级的区别: K( _3 l1 s* g7 c 抢占优先级是指,两个中断,抢占优先级谁高,谁就可以抢占另外一个正在执行的中断,可以打断# w: L, N. ^$ i9 w/ ? 1 j( B: X5 `- I( ~ N6 w; S 例如A中断的抢占优先级为0(优先级高),B中断的抢占优先级为3(低优先级),B正在发生,正在执行B中断的中断服务函数,如果A发生了,那么A是可以打断B的,执行完了再回去B* R0 f8 _7 a, d. T$ K: q4 L6 G ! ^+ Q7 A8 H% V" \2 h, Q 抢占优先级相同的中断,高响应优先级的中断不可以打断低响应优先级的中断& T( S' p7 J" v# |4 n3 V 7 j) S5 e' W3 F, x% {$ T 抢占优先级相同的中断,当两个中断同时发生时,哪个的优先级高,哪个就先执行 ' J2 s, u- @8 G 中断优先级分组函数 misc.c
- B9 H7 r6 J; A 中断优先级设置寄存器( d8 U$ Q% W7 v' H! v core_cm3.h3 v; f" s# i. j. j+ |% b
可以看到,有240个IP寄存器,即Interrupt Priority Register% v. K/ ]. V+ i! k- p j / q& a) u3 v/ Q- p8 V7 y) _) G. N 240个8位寄存器,每个中断使用一个寄存器来确定优先级 STM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]
" H; }2 j: X3 y8 l$ [. @0 j NVIC初始化 misc.c 3 l. [) d( }4 S1 ^# }: K! k' s0 A 0 @4 O& O( q# B4 k6 ^- u* z4 P
misc.h4 i! l6 q0 g" o. L$ x
# o0 e( G3 C- h1 C7 n( z' y
/ I( d5 N+ o. m: [! i, ]; k
) K$ z! R- u' X. E2 V 中断使能寄存器ISER寄存器 ISER[8]用于使能中断,共有8个32位寄存器2 ] F6 n, |( ~" Q" L8 J 32位的寄存器,每个位控制一个中断的使能 $ P3 G: t2 J% ?+ r L7 } STM32F10x只有60个可屏蔽中断,因此只能收了第1个和第2个寄存器,即ISER[0]和ISER[1]. r' w, k$ a8 H$ {/ ?& w# I ) Q t8 X' @$ }. F$ a/ @5 a ISER[0]的bit 0~31分别对应中断0~31/ _' b7 Q# m# U6 D# A3 r' a ISER[1]的bit 0~27分别对应中断32~59% ~0 V" w0 e3 ]2 f 0 q, i6 C4 w0 Z$ [: K 中断失能寄存器ICER寄存器 ICER[8] 3 H O* V; g' W5 h2 X0 k! r( m 其余上同 中断挂起控制寄存器ISPR ISPR[8]
# X3 j4 Z/ ]* s$ ^ 4 Z2 U L8 N m0 }0 E% E 中断解挂控制寄存器ICPR6 t! x' |& L7 Y* J: | ICPR[8]
中断激活标志位寄存器组IABR- W: d8 b! z6 d( K7 B9 p IABR[8] c$ |0 A) v4 g# w 只读,通过读取该寄存器可以知道当前执行的中断是哪一个,如果对应的位为1,则说明该中断正在执行' L! \) u* ~) V- A! G0 v& Y
0 d" y U) m4 W 中断配置步骤总结, X+ f6 D' m+ o; _* i* b 1. 首先设置中断优先级分组,确定系统的分组级别,知道有几位抢占优先级和几位响应优先级可以设置(这里只需要设置一次); \4 X; [& `, N$ l4 |" q 2. 针对每个中断,调NVIC_init函数,给定想要的抢占优先级和响应优先级,对中断进行设置- U# t# _" p- Z/ y! a, _8 q( g; j2 ^ & ~4 }: w x e+ g 3. 如果需要挂起或解挂,查看中断当前的激活状态,调用相关函数即可# }* l3 a0 B- e0 O0 T, |8 b+ I 4 f: d) [9 _7 s0 C, Y# r" a4 R0 ? 举例: main.c
exit.c
. H: ]9 v& P3 u; t ———————————————— 版权声明:CodeForCoffee * f2 |! \# e3 f" W0 }4 T |
【福利三:雨露均沾·逢7狂欢】之一:STM32F1外部中断异常故障的解决办法
STM32中断响应延迟优化:从NVIC配置到DMA加速的极致性能调优
基于STM32串口中断之缓存区溢出卡死经验分享
基于STM32数组越界异常中断经验分享
基于STM32之数组越界异常中断经验分享
基于STM32连接参数更新进程后导致断连的问题分析
基于STM32连接参数更新进程后导致断连的问题分析
基于STM32的定时器不按设定超时产生中断
基于STM32利用TIMER事件和栈帧体验中断响应经验分享
基于STM32外部中断原理和配置代码经验分享
微信公众号
手机版