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

STM32:中断的详细介绍及使用流程

[复制链接]
攻城狮Melo 发布时间:2022-11-9 14:48
一、中断介绍
' a! h/ g, d6 p1、中断概念

4 n/ J  v: e( D5 t  `+ D》》CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。引发中断的事件称为中断源。比如:看电视时突然门铃响,那么门铃响就相当于中断源,有些中断还能够被其它高优先级的中断所中断,那么这种情况又叫做中断的嵌套。
: G& L: B4 u+ F》》 STM32F10x芯片有84个中断通道,包括16个内核中断和68个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。可以参考《STM32F10x中文参考手册》-9 中断和事件章节。' Y) p, ^3 N: H  d: ~9 J6 t/ M6 z
2、NVIC介绍! e6 s- v/ B" J& b4 R. [* f* ?! p
》》NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的中断相关功能。由于ARM给NVIC预留了非常多的功能,但对于使用M3内核设计芯片的公司可能就不需要这么多功能,于是就需要在NVIC上裁剪。ST公司的STM32F103芯片内部中断数量就是NVIC裁剪后的结果。* |: W1 m3 J. f' i
》》中断控制相关寄存器在固件库core_cm3.h文件NVIC结构体内。可打开任意库函数工程即可查看到。
# g, [) F. }8 Z7 M7 ~
% y5 Y( H% ~; K* k" g, d4 J: a3、中断优先级$ _2 u1 B$ [$ `* |3 i& j
》》STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位,高4位有效),用于表达优先级的高4位又被分为组成抢占式优先级和响应式优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
" `; W% u( _$ f》》高抢占式优先级的中断事件会打断当前的主程序或中断程序运行,俗称中断嵌套。在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。& R; c& x& K3 m
》》当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等待前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
: X; l  X4 ~9 s》》STM32F103中指定中断优先级的寄存器位有4位,这4位的分组方式如下:(4个优先级描述位可以有5中组合方式)
$ Z$ B( u4 G6 b2 ~" g9 v+ h& G" A7 z3 p0 C2 k' F/ w2 ?
336a82ed51e1450b9d0d1dcaede03a6a.png
7 ?* B! F) B& f+ @, o) Z9 r1 o# f- Q, p
设置优先级分组可调用库函数NVIC_PriorityGroupConfig(),在misc.c中可以查看。$ R; N9 Y( F) `  G" V; H

$ v& O/ L$ {1 y. S: I6 I  ?/ c: A
& w( T0 e. l1 C& W& e二、中断配置步骤

4 i9 K0 e: {( Y5 l$ W  X》》要使用中断我们就需要先配置它,通常都需经过这几步:
- v2 S. d1 L" B8 L% c3 F1、使能外设某个中断
& W0 {$ Q1 @- y4 W2、使能中断优先级分组(NVIC_PriorityGroupConfig()),然后初始化NVIC_InitTypeDef结构体# U+ i! O# N2 u, L0 ^
typedef struct* a' X6 O+ O+ O1 M* Q1 e5 g& p' x
{
" M1 i& `6 I! t: V, j. d$ g1 `uint8_t NVIC_IRQChannel;//中断源
( l: W0 [' R( [; k. K4 F6 h0 auint8_t NVIC_IRQChannelPreemptionPriority;//抢占优先级5 i6 z6 v$ @! P6 m6 P$ V
uint8_t NVIC_IRQChannelSubPriority;//响应优先级
+ I% c/ |; x, _; rFunctionalState NVIC_IRQChannelCmd;//中断使能(ENABLE)或失能(DISABLE)2 P2 T+ }" N( n0 ~3 J$ V
} NVIC_InitTypeDef;% E5 s  a! k1 D, G% l* \3 I; L, @
3、编写中断服务函数7 f( ]3 I# k7 E# a8 y6 ^
* J. L1 U$ @$ r3 N9 W* A7 [
三、外部中断介绍
0 W& g0 B9 Q9 l* E1、EXTI简介

( |$ _9 Z# U, N/ R! B& S》》STM32F10x外部中断/事件控制器(EXTI)包含多达20个用于产生事件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。$ r2 C" M0 O& j+ @! F
外部中断/事件控制器框图如下:! @( O9 {6 V9 O- K
, i) E7 v( Z4 s2 W6 e) @* _; _% c
5fdbc96303fa4819aa0ca5554f061107.png 6 b3 W% i. b  [8 S% U( r

; N, b/ ]# L4 Q: C它总共有两条路,一条是:1-2-3-4-5,用来产生中断;另一条是:1-2-3-6-7-8,用来产生事件
6 I. q2 L2 c( X, o+ H& L% O4 {& p6 z4 h0 t+ ]! E# u; i/ ~/ t" I
2、外部中断/事件线映射
# ^, J) k! x* oSTM32F10x的EXTI具有20个中断/事件线,如下:
# H* X& b2 D1 J  N- u" }
. C) P$ `: w0 V8 l* J d4f4ff5ab71244adbe7c19ef0754e00a.png
; n0 k/ @. B, O2 u; J; r; D
, a9 v% c2 t: D; U) i3、外部中断配置步骤: p7 O, n6 K! b$ C5 [% h" l
》》要使用外部中断我们就需要先配置它,通常都需经过这几步:(EXTI相关库函数在stm32f10x_exti.c和stm32f10x_exti.h文件中)
* w2 E5 m7 A$ O) d' ?1 I1 z(1)使能IO口时钟,配置IO口模式为输入
7 f5 v2 \/ ^+ s, ~( f(2)开启AFIO时钟,设置IO口与中断线的映射关系(将GPIO端口映射到EXTI中断线上)! k7 z4 }# }/ v4 W" [$ O6 C
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);7 O+ e/ o" K- `, t8 }- h0 G
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource);: f. u7 n( l7 n$ O
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource);
+ N/ N2 b" P  r; [- @) R0 [(3)配置中断分组(NVIC),使能中断1 O, j. t  `- q3 L; a% C' Y
(4)初始化EXTI,选择出发方式) a0 K- f& X$ D3 k8 `
void EXTI_Init(EXTI_InitTypeDef * EXTI_InitStruct);6 e& W0 H/ F" Q$ ~- [
typedef struct
* G  B6 s! |* u: b. x( a$ X! X{
, R: W. V3 o% X, G# Euint32_t EXTI_Line; //中断/事件线
: A; [( ^0 x* ^$ J. kEXTIMode_TypeDef EXTI_Mode;//EXTI模式. l! Z/ ?" N( i* f3 W# ?) C
EXTITrigger_TypeDef EXTI_Trigger;//EXTI出发方式
. f# A: @* `6 i1 }4 kFunctionalState EXTI_LineCmd;//中断线使能或失能. C( |3 C+ M: N% p+ p: L) }7 ^/ I- K
}
5 U- }& m: [4 E: f(5)编写EXTI中断服务函数
. G* s- W; r& zEXTI0_IRQHandler
* Z4 r0 W& O) ^& @EXTI1_IRQHandler
0 u& Y$ C2 {9 @7 F8 \EXTI2_IRQHandler$ d6 x" b0 C5 P+ S+ D3 m
EXTI3_IRQHandler! w: @: R6 ^! b" k0 U: ^
EXTI4_IRQHandler9 i: @: v: M  S, q0 O- l7 s
EXTI9_5_IRQHandler(中断线5-9的写法)
$ e9 D( e! ]/ cEXTI15_10_IRQHandler(中断线10-15的写法)
0 C( a& X2 K" R+ N. l7 x0 h: k  H: _5 B+ R  c  I
4、编写外部中断控制程序2 O7 F# h' f& o2 Y- u4 ^6 @- e
要实现外部中断方式控制LED,程序框架如下:
3 W7 m* ~& E+ t- s7 k7 a4 V(1)初始化对应端口的EXTI9 o% w/ p- h" y- r4 G
(2)编写EXTI中断函数" _- \7 c) U- A4 f) x6 g- a
(3)编写主函数
: Q' \1 G$ W$ H: I1 L& z/ f( _0 C2 A————————————————
% [, |% N+ d% s- O  i1 p版权声明:Cheems_Pak Choi1 q2 b3 ^# ]) H# f1 F+ T! \

8 ~" o$ o3 N& V8 f3 x) o" x
+ f* E9 b1 ^0 L8 n
收藏 评论0 发布时间:2022-11-9 14:48

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版