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

stm32——STM32 中断

[复制链接]
feixiang20 发布时间:2018-1-16 18:25
本帖最后由 feixiang20 于 2018-1-16 20:33 编辑
, `8 k( I- \- G0 ?8 P2 b% I* p/ G
- }' _0 _8 I; C这次实验,我们将学习如何使用 STM32 的外部输入中断。在前几次的学习中,我们掌握了 STM32 的 IO 口最基本的操作。 本次实验我们将介绍如何将STM32 的 IO 口作为外部中断输入,在本实验中,我们将以中断的方式,实现按键控制 LED 亮灭的功能 。 实验目标:+ u3 I- V- {$ x) `8 U7 z
1、 了解 STM32 的中断模式 NVIC 。
3 ^; T6 l3 {5 i6 O& E* e$ F6 I/ s, d2、 了解外部中断的使用方式 。
& v% F) {6 |. x7 G( f. v$ Q+ G# b8 H3 R- I! B0 @
中断的概念3 ~0 u0 n) c! [
如果学员有单片机的基础,那么就会知道中断的概念。所谓中断是指 CPU 在执行当前程序的过程中,由于某种随机出现的外设请求或 CPU 内部的异常事件,使 CPU 暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理 程序运行完毕后,CPU 再返回到暂停处继续执行原来的程序。 而有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。! ^' t4 l$ a! F( O) g

' C1 R$ k6 S) I& g, RSTM32  的中断1) STM32  中断分组
4 C9 G) m; T5 GSTM32 的中断一共有 68 个可屏蔽中断通道16 个可编程的优先等级;什么叫做可编程等级呢? 首先我们来看一下STM32 中断等级式,STM32 使用一个 4 位寄存器 来设置中断等级的,4 位长度可以设置 16 个优先等级(2 的 4 次方等于 16); 而这个优先等级是可以设置的,所以叫做可编程等级。而且呢,这个 4 位长 度的优先等级还可以分为两部分,一部分叫做抢占优先级,一部分叫做响应 优先(些资料也叫做亚优先级) (比如说: 4 位里面设置 1 位抢占优先级,3 位的响应优先级。)在这里大家可能有点糊涂了,分成抢占优先级和响应优先级又是什么用呢?
6 U% r: ]2 m. v8 e/ B! `在 STM32 的 NVIC 中规定: 抢占优先级高的可以中断抢占优先级比它低 的中断函数,不过相同抢占优先级的之间是不能相互中断的。响应优先级 之间是不能相互中断的,有人或许既然都不能中断了,那响应优先级还有什 么意义呢?如果这两个中断同时到达,则中断控制根据他们的响应优先级 高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等, 则根据他们在中断表中的排位顺序决定先处理哪一个。4 S; e2 y3 E1 g- }3 N- i

) V3 }$ ]/ Q, i! H: fSTM32 的中断分组可以有 5 种分组:如图! v2 p6 {! [# T8 Y

) N; H; h. C1 B( _ 1.jpg
9 e. I1 h+ W& s7 V0 W0 k$ D. f/ ^9 f
STM32  中断分组库函数
4 O# Q: n2 T1 a5 t6 ]+ cNVIC_PriorityGroupConfig()
# r- A5 J: P% v4 {% ENVIC_PriorityGroup 这个参数是用来选择设置分组的参数,我们知道它一共 可以分为 5 个组别如下图
$ _+ F- B; M4 v1 E) c. r; ^7 p$ Z* d8 R1 c$ _
2.jpg
8 D) B, d0 {8 u, ~. R4 I" O4 D% `7 N: y0 I; p- L
EXTI  外部中断
2 f( M- ^- e4 }5 j  r, h7 [- P! bSTM32 的外部中断是有 16 条外部中断 通道,分别对应着每组 IO 口的 Px0 到 Px15。STM32 的每个 IO 口都能用作外部中断,一次性同时使用的外部 中断只能有16 个, 而且同时做外部中断的 IO 口序号也是不能相同的, 你使用 PA0做外部中断了,就不能同时使用 PB0 做外部中断了。
- @" ]& H3 Z* F" V8 p! P1 H; g3 L$ |+ C! k2 X) ^& F
外部中断的设置步骤:! q  b* R" ?2 i0 ?) y4 i
1) 设置中断分组。
2 n# ]2 S/ p0 v6 `2 y6 ~2) 配置 IO 口的模式。(比如你要使用下降沿触发,那么就选择上拉输入 模式,要使用上升沿触发,那么就选择下拉输入模式。)
( u+ H+ t' ~& i( G2 v3) 选择要用作外部中断的 IO 口作为输入。( Q/ X5 H* X2 E- {- p
4) 开启要使用的中断通道并设置外部中断的参数(中断优先级、中 断触发模式)2 F$ _, I  Y0 s( v) K

6 m" H/ g# q4 k* V/ |关于外部中断库函数介绍5 f9 L: p8 s$ M# k
1) RCC_APB2PeriphClockCmd()  我们要打开 GPIOE 及管脚复用的时钟。& n" |& ^+ M. `+ ?% a) P% z
2) GPIO_Init() 函数   IO 模式设置为上拉输入:
. U9 k" ?. E5 B: p; B  c7 [& `3) GPIO_EXTILineConfig() 函数
& N: X( H$ \9 X这个函数用来设置作为输入的 IO 口,它有两个输入参数: 第一个参数是使用选择 GPIO 的组别,我们要使用的是 PE2,所以设 置为:GPIO_PortSourceGPIOE。 第二个参数是设置 IO 的序号,我们使用的是 PE2,所以我们为:8 B8 o' Q3 I7 p( T8 |1 U6 K
GPIO_PinSource2 所以设置代码为:' Y) Y0 }0 u; p6 l7 S7 ]" U* b) y
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);1 \  ^& _2 \2 E7 S) \

' o- l" Y8 D7 K3 o4) NVIC_Init() 函数  设置中断的优先级和打开总中断
' o: z6 [; q( u  z6 J' Q4 L  B4 K  {5) EXTI_Init() 函数  初始化外部中断1 x% B, R5 j4 j3 \, Z. e0 U9 L' D0 S
6) EXTI_GetITStatus() 函数7 Y- c4 m- G. |+ ~0 U7 z5 |
7) 外部中断的中断函数
2 F* M# z! X3 K0 h4 `   EXTI0_IRQHandler
/ A% z; E6 w) ]( z6 Q, m% G   EXTI1_IRQHandler
* q- Z; `/ F* {   EXTI2_IRQHandler8 ~& }0 M2 g8 D9 V" ~
   EXTI3_IRQHandler
% S* U) D) r& r6 p- \- y8) EXTI_GetITStatus() 函数
: M) T8 m7 h6 b- R( H! J& Q) t, O
9) EXTI_ClearITPendingBit() 函数
! [( [* ?# ?' h% [! }4 m/ r7 m9 y
# ?* q, a6 [/ h( `* a2 V1)  初始化函数
7 o" L2 S$ G" f3 Gvoid exti_init() //外部中断初始化) U; u3 J' B7 v, |
{
" Z# E3 d! M( R( w6 V, XGPIO_InitTypeDef GPIO_InitStructure;, k' m  Z9 Z/ A4 P& u0 N
EXTI_InitTypeDef EXTI_InitStructure;
+ m7 S& ?9 P+ l# @$ s/ r$ G  e8 SNVIC_InitTypeDef NVIC_InitStructure;! I7 ]* g( H; Z
/* 开启 GPIO 时钟 */
6 E5 ]* T9 q0 C8 ?9 M* A. [% |RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);6 m* V, _& ]5 j' c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);" b) ~. `1 g) _4 p
GPIO_InitStructure.GPIO_Pin=k_left;9 L- ?9 v* l+ C! L# ~
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;' r% r+ Y4 e2 g0 ?! x
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
) T+ C/ ^0 L9 A4 [% kGPIO_Init(GPIOE,&GPIO_InitStructure);
+ k* }6 ?0 q  V* I5 t! uGPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择! ]- a/ R7 h) c: |3 K
GPIO 管脚用作外部中断线路: ~! W; e( N) `
//此处一定要记住给端口管脚加上中断外部线路
) d9 Y; k- g- {0 \! Y2 ^& @- a6 X4 y/* 设置外部中断的模式 */, g) H; L- G$ ]" j, R
EXTI_InitStructure.EXTI_Line=EXTI_Line2;( W  Q+ f7 [6 s4 K5 `; x; [: U
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
! [7 M+ L" ]5 p* H- n6 UEXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
( X+ H. b! w; c. C3 v+ CEXTI_InitStructure.EXTI_LineCmd = ENABLE;, z: n7 o- v. e) e
EXTI_Init(&EXTI_InitStructure);
4 b) L  R! y; {' }- ]$ L  C+ n5 k/* 设置 NVIC 参数 */
+ T- j8 u8 V- hNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
2 r. v. G8 A* b2 ~NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开 EXTI2
5 o( H( p; K6 K2 @的全局中断: f8 s2 }/ ^9 B, ]1 N5 c$ G, [2 d8 m
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优: w8 J4 V1 E$ g% @
先级为 0) K' n4 O8 B6 l/ ]+ \" f
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应
2 V+ k- n: e. v+ ^# A4 L优先级为 0
- X( Z5 w& j" V2 M7 _2 Q" zNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
' j2 L  O; O0 l, S4 U6 ONVIC_Init(&NVIC_InitStructure);
+ F/ Y1 F3 \2 M) V) K% }3 p7 m}
9 x4 |/ `) k& Z9 m. z6 B4 T$ S3 R- [% t
2)  中断函数0 Q. i7 x; M2 u  |6 A
void EXTI2_IRQHandler() //外部中断 2 中断函数$ {& }7 p+ [7 ^$ C( e7 t
{; L' \# D+ D( T; v; Z* O
if(EXTI_GetITStatus(EXTI_Line2)==SET)
- u. B+ ?, W6 h, _$ J) k- E{2 M* M7 p1 @; d
EXTI_ClearITPendingBit(EXTI_Line0);//清除 EXTI 线路挂起位
) L) \2 k; {2 l# y5 bdelay_ms(10);//消抖处理
2 X( v* J- y* Y$ Tif(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET)/ h# W% K( }% M- k$ V
//k_left 按键按下/ R5 B; p4 n: y; j  R
{$ T( H* ^4 i/ f. r+ m
if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET)
9 l* D# A) K( D" K" W$ U: `( n{( W3 s. ^/ I2 c; O, T
//LED 熄灭
# D$ ?4 E' c9 b. ]$ oGPIO_SetBits(GPIOC,GPIO_Pin_0);" f, A$ I) ^0 J4 C/ y/ s. \% T0 V
}
" q/ I8 n1 q2 k2 [* felse8 s- Z5 f9 D8 @0 }2 \( o+ k
{
+ X* {1 C& k1 q, i/ r8 w; ?//LED 发光
- s" U" Y4 {, A9 |4 v  EGPIO_ResetBits(GPIOC,GPIO_Pin_0);0 e+ A# _0 m: g: m5 q
}. J, C0 ]* H7 J- G) Z
}
5 A1 Y9 m: n7 R8 ^while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);7 }/ M. c& U) R' u9 D9 g
}
5 Z! h6 t4 d% T% H}9 O- j# S9 [9 ]: s* H

  L0 C. e4 }# e, P

评分

参与人数 1 ST金币 -5 收起 理由
Inc_brza -5

查看全部评分

赞 收藏 评论1 发布时间:2018-1-16 18:25

举报

1个回答
Inc_brza 回答时间:2018-1-16 18:57:43
标题不合格,请尽快修改
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版