STMCU小助手
发布时间:2022-5-6 11:10
|
前言9 Y0 x+ n. `! p/ G5 J& M. ` STM32单片机的一个强大之处在于用于庞大的中断体系,掌握STM32对中断优先级的定义是学好STM32中断的前提。本次我们讲解STM32关于中断优先级NVIC的定义。我们以基本原理、寄存器介绍和库函数配置这一 顺序来讲解。0 o) I5 F$ S) A9 G 1 x; A% H% V4 m) G( i2 S* A8 f1 n8 r- b5 [ 一、基础知识 1.NVIC基础知识 CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 在STM32F103系列上面又只有60个可屏蔽中断(在107系列才有68个)' a* Z( ?% X4 g* x( a/ ? 2.抢占优先级&响应优先级 抢占优先级也就是先占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断抢占优先级如果没有后触发的中断抢占优先级更高,就会先处理抢占优先级高的中断。也就是说又有较高的抢占优先级的中断可以打断抢占优先级较低的中断。这是实现中断嵌套的基础。+ G% n" {& V" l+ f" p* F2 s 响应优先级,也就是次占优先级,只在同一抢占优先级的中断同时触发时起作用,抢占优先级相同,则优先执行响应优先级较高的中断。响应优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。 3.中断向量表9 t, |4 X; l# i/ k! v1 ] 6 {* K! W6 q" X" {# i; _( F# n
, j* G6 ]) Y6 Z5 S f5 \0 Q# @7 ] (图片来自STM32中文参考手册) ' t; V" ^. l/ N* c6 C 4.中断优先级分组 看到中断向量表后,想必大家都会心生疑问:STM32有几十个中断,怎么管理呢?7 v! j+ r- y- P6 R. u; | O$ ?/ n 这就要讲解中断管理方法了,首先对STM32的中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。3 z1 U2 b* S/ Q* e4 c: \6 A . k$ {) Z, m* A' w0 h1 z 分组配置是在寄存器SCB->AIRCR中配置:2 Q" m* s* d( y
二、配置中断相关寄存器 以下是位于CM3内核中的与NVIC分组相关的寄存器:
中断优先级控制的寄存器组:IP[240]& A6 R7 _. I& R % o/ D+ R% I: v' h" u 全称是:Interrupt Priority Registers。240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]。每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。 & C- [: l4 P3 g4 [ 中断失能寄存器组:ICER[8]# K I9 J: a& V( Z: g9 C' I9 b ( m7 _ }8 [: \/ e 作用:用来失能中断。32位寄存器,每个位控制一个中断的失能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。ICER[0]的bit0~bit31分别对应中断0~31。ICER[1]的bit0~27对应中断32~59;配置方法跟ISER一样。0 f3 W6 X3 V* ?9 @ 中断挂起控制寄存器组:ISPR[8] M6 W; K/ |0 H0 s4 ^9 S" l7 I( @ 作用:用来挂起中断 : t: j* J6 ]8 }* }5 R 中断解挂控制寄存器组:ICPR[8] ' N6 j8 h3 `. s 作用:用来解挂中断# ^" l8 n6 `. g 中断激活标志位寄存器组:IABR[8] 作用:只读,通过它可以知道当前在执行的中断是哪一个。如果对应位为1,说明该中断正在执行 8 x6 G. }) \2 k2 P 三、库函数配置+ J" I! ?% K, A/ L+ c# H 1.中断参数初始化函数
2.中断优先级设置步骤 ①系统运行后先设置中断优先级分组,调用函数:4 p! L. }, o- c4 u ) X: j/ |! f3 q& V void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); 整个系统执行过程中,只设置一次中断分组。2 w' J% |- _, p% E' x1 ` , [. B2 S! d& m+ Z _ ②针对每个中断,设置对应的抢占优先级和响应优先级: 4 a8 I0 J, t* t" X0 I1 q void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);$ A5 x3 }5 }- S/ N T 7 @: ?7 {! h8 E, g" H! P, q) l ③ 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。 % ?3 k9 O. m% G7 Q# b 总结 要想学习STM32中断,要先掌握STM32对优先级的分组。本讲以原理、相关寄存器介绍和库函数配置的顺序对STM32的NVIC中断优先级进行讲解,希望读者反复研究,为以后的学习打好基础。 2 Q1 F4 @/ W' D# q |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版