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

stm32——STM32 中断

[复制链接]
feixiang20 发布时间:2018-1-16 18:25
本帖最后由 feixiang20 于 2018-1-16 20:33 编辑 ' }5 d4 @" o; N. k

; ?7 ]* D& w6 M6 l这次实验,我们将学习如何使用 STM32 的外部输入中断。在前几次的学习中,我们掌握了 STM32 的 IO 口最基本的操作。 本次实验我们将介绍如何将STM32 的 IO 口作为外部中断输入,在本实验中,我们将以中断的方式,实现按键控制 LED 亮灭的功能 。 实验目标:2 f! C7 c# X  d3 V
1、 了解 STM32 的中断模式 NVIC 。3 ~7 h" ~) m- @( u
2、 了解外部中断的使用方式 。( f6 w" v$ p. V3 h
: N" ?! r8 `: t" [! d4 U/ N
中断的概念8 w9 ?9 Z1 a8 _9 |& _
如果学员有单片机的基础,那么就会知道中断的概念。所谓中断是指 CPU 在执行当前程序的过程中,由于某种随机出现的外设请求或 CPU 内部的异常事件,使 CPU 暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理 程序运行完毕后,CPU 再返回到暂停处继续执行原来的程序。 而有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。: \% S$ t5 V) `1 H) N( K6 z

& x5 ]- L$ y7 ^+ \/ G/ j0 WSTM32  的中断1) STM32  中断分组
8 o' Q7 K  h+ S. e. i  i$ v* ESTM32 的中断一共有 68 个可屏蔽中断通道16 个可编程的优先等级;什么叫做可编程等级呢? 首先我们来看一下STM32 中断等级式,STM32 使用一个 4 位寄存器 来设置中断等级的,4 位长度可以设置 16 个优先等级(2 的 4 次方等于 16); 而这个优先等级是可以设置的,所以叫做可编程等级。而且呢,这个 4 位长 度的优先等级还可以分为两部分,一部分叫做抢占优先级,一部分叫做响应 优先(些资料也叫做亚优先级) (比如说: 4 位里面设置 1 位抢占优先级,3 位的响应优先级。)在这里大家可能有点糊涂了,分成抢占优先级和响应优先级又是什么用呢?
3 p1 b4 |8 `0 Q4 @- E在 STM32 的 NVIC 中规定: 抢占优先级高的可以中断抢占优先级比它低 的中断函数,不过相同抢占优先级的之间是不能相互中断的。响应优先级 之间是不能相互中断的,有人或许既然都不能中断了,那响应优先级还有什 么意义呢?如果这两个中断同时到达,则中断控制根据他们的响应优先级 高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等, 则根据他们在中断表中的排位顺序决定先处理哪一个。7 [- Z" @  e! z

5 C. }. s" n; B2 m* l6 QSTM32 的中断分组可以有 5 种分组:如图
! o9 m/ x& x* A. h. l& f2 P. \9 d2 p7 W! D9 R# R' F
1.jpg
# r( ^; ]3 `9 G' [
6 I$ j! W1 w4 w* W- p7 h* c: ]STM32  中断分组库函数
5 q4 P- W1 \- NNVIC_PriorityGroupConfig()# e" }' ^& q  G0 w4 v  g3 X' H
NVIC_PriorityGroup 这个参数是用来选择设置分组的参数,我们知道它一共 可以分为 5 个组别如下图4 p# t" P: {# Q  q# m" t5 t' t

5 e# ?3 T$ K/ Y4 g  M% G( q 2.jpg - l- _  ~! ]7 m7 h9 @- _. r8 a4 o

7 E' O1 M" g' ~% zEXTI  外部中断
5 r) L. d7 I' U( F- USTM32 的外部中断是有 16 条外部中断 通道,分别对应着每组 IO 口的 Px0 到 Px15。STM32 的每个 IO 口都能用作外部中断,一次性同时使用的外部 中断只能有16 个, 而且同时做外部中断的 IO 口序号也是不能相同的, 你使用 PA0做外部中断了,就不能同时使用 PB0 做外部中断了。
! H2 ~: @( U8 y: O
" e! ^  q' C, G外部中断的设置步骤:5 ?) s' Y9 I$ d: d) ]5 G' `7 {
1) 设置中断分组。 8 s! j+ p% c8 o, Z  E
2) 配置 IO 口的模式。(比如你要使用下降沿触发,那么就选择上拉输入 模式,要使用上升沿触发,那么就选择下拉输入模式。)+ n4 Z% z7 u2 J. r3 E7 ^
3) 选择要用作外部中断的 IO 口作为输入。" C' }) }% M2 I9 [5 \0 ^
4) 开启要使用的中断通道并设置外部中断的参数(中断优先级、中 断触发模式)
6 C& h. E7 E, W  J& w& P9 G" w5 ?" _% V+ _
关于外部中断库函数介绍
4 M9 t( Y+ }$ f. G1 I: K1) RCC_APB2PeriphClockCmd()  我们要打开 GPIOE 及管脚复用的时钟。
8 O$ `7 H! Z3 e2) GPIO_Init() 函数   IO 模式设置为上拉输入:
) C6 _% h0 P$ R* _3) GPIO_EXTILineConfig() 函数
" D& b" V. N- G1 w这个函数用来设置作为输入的 IO 口,它有两个输入参数: 第一个参数是使用选择 GPIO 的组别,我们要使用的是 PE2,所以设 置为:GPIO_PortSourceGPIOE。 第二个参数是设置 IO 的序号,我们使用的是 PE2,所以我们为:
# y+ Z& G7 H8 w4 |& p2 |& `2 m+ U5 hGPIO_PinSource2 所以设置代码为:& D* h4 J" i  z- @7 S! i* f( V# c! Y
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
( S7 c: f6 H+ _) X/ @8 s6 v) L! c3 f* Y! H- |6 X, o
4) NVIC_Init() 函数  设置中断的优先级和打开总中断5 s, \+ N$ ?1 J) k
5) EXTI_Init() 函数  初始化外部中断3 N4 |$ b% ?$ q) p/ X  D( h3 c( T
6) EXTI_GetITStatus() 函数
4 H5 c4 h, E  E/ f6 Y, n+ _1 @6 {7) 外部中断的中断函数
% c  [3 j$ M. V& I' e* r! G  C   EXTI0_IRQHandler6 o. U7 ?/ b. i/ s  q
   EXTI1_IRQHandler
8 J! B/ f9 c7 T0 O4 `+ x& v   EXTI2_IRQHandler
1 K# Y' A" _: _' m% _" M   EXTI3_IRQHandler: w6 ^7 L+ A; V6 ]
8) EXTI_GetITStatus() 函数5 ~1 G" ]8 ?& l/ p% i( }
8 m4 p  k. J/ S$ i  S
9) EXTI_ClearITPendingBit() 函数$ E6 |7 z7 E' ]5 K3 l; u

& i( j- m: ^: X7 V1)  初始化函数
3 L* c+ r7 g$ evoid exti_init() //外部中断初始化
. d+ n4 D2 B. @. {{
1 [4 N+ j6 }0 k% iGPIO_InitTypeDef GPIO_InitStructure;/ M+ b! W* a2 s& R* s& ~; h
EXTI_InitTypeDef EXTI_InitStructure;
! [; S  v$ ?9 J! T+ CNVIC_InitTypeDef NVIC_InitStructure;
, s$ J2 p  S. l, A# ]! [1 A8 S/ r' a/* 开启 GPIO 时钟 */
4 j7 ?. Q  @6 S# Q# nRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);+ f4 E5 W) e  ?8 G. G1 V
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
# w  v$ W6 L: BGPIO_InitStructure.GPIO_Pin=k_left;
6 G0 S; j% r+ \; e8 nGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;& m% m4 D6 }4 f% N
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;0 P7 ~3 Y! p2 [6 q. j! u
GPIO_Init(GPIOE,&GPIO_InitStructure);% Z7 [% r. p! ^7 p! Y
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择0 C+ y2 A& e# M1 P$ ]; ], E
GPIO 管脚用作外部中断线路* F6 R! P  N3 a( y+ c5 `6 k
//此处一定要记住给端口管脚加上中断外部线路
) }7 Q. `7 q7 l" U1 A1 e/ }! N/* 设置外部中断的模式 */
2 K, Z) }' C$ E) N. J( j$ s$ X; D2 @EXTI_InitStructure.EXTI_Line=EXTI_Line2;
" i( u% S3 f! l& U8 jEXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
/ y4 k3 w+ T5 u. `+ PEXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
1 z% P3 [7 E" K& aEXTI_InitStructure.EXTI_LineCmd = ENABLE;
* {+ d: n6 Y) V8 u$ h" Y) EEXTI_Init(&EXTI_InitStructure);
- j% @$ c7 {8 ~& |& L; A8 v/* 设置 NVIC 参数 */
+ n3 t2 x% K, Y( Y4 m1 K6 Y+ @NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);( Y, Z- Q1 p' G$ F- X% b/ y. A
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开 EXTI22 u$ x& q7 x- n' }
的全局中断$ w" g- m  {' B$ l
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优6 ?# a/ l6 v, G
先级为 04 @+ a1 m1 E. b0 ^5 z* G% W
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应
+ W. |( `, g% s3 L! D+ P* f优先级为 0- h: c/ O7 Z8 k" t1 A8 \* S
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
/ N! j9 E& L) T/ S* nNVIC_Init(&NVIC_InitStructure);
! m5 ^% L( z9 z7 T}0 C& _/ q* P# L

. f6 Q2 [. e2 b" D0 p2)  中断函数, z3 f5 o: Y1 U: _0 [4 R
void EXTI2_IRQHandler() //外部中断 2 中断函数* H$ i' u; y' c# Z1 z" C- w" A
{8 X: y7 U8 J4 t. M8 U+ X. k
if(EXTI_GetITStatus(EXTI_Line2)==SET)
1 W, {( V$ s- e  u! d) J{
5 _2 k- l( B0 TEXTI_ClearITPendingBit(EXTI_Line0);//清除 EXTI 线路挂起位. K% e+ ]3 Q# a! K& E$ V9 T
delay_ms(10);//消抖处理7 F/ I4 T0 o( u( U
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET); O% I& j# x9 ]6 `
//k_left 按键按下
' n% d- S2 }3 W& p3 ]# Y* @8 h. {# I{
, J; Y  H$ v5 M/ k6 q1 W6 x. Jif(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET); _1 U( ^: W4 t4 X2 a* V2 d
{" F6 d2 J& }# w
//LED 熄灭% @. P' r$ n; e7 o' V
GPIO_SetBits(GPIOC,GPIO_Pin_0);
# ?% L  Z8 L9 C% q& {: ^- v}
9 L" }0 f" e' D1 W  relse
9 E2 P0 d3 {8 ?5 h{
9 Z# @: Y$ `  ]. U2 d  Z//LED 发光0 x2 I( {: X4 L, `/ ?; j! j
GPIO_ResetBits(GPIOC,GPIO_Pin_0);& p+ ~: Q+ _8 v
}
. ~( b6 T' Z. c* e}; D+ @, i/ o& b+ J; _7 [5 O
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
& Y+ e% [7 ^3 F4 O& {1 c% P. T4 A}8 ~. s: ~. b( t, H) K: x2 p: _
}6 q  p  Q6 c& g/ {0 b
2 v) I0 U# R# P/ Q" ^. k

评分

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

查看全部评分

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

举报

1个回答
Inc_brza 回答时间:2018-1-16 18:57:43
标题不合格,请尽快修改

所属标签

相似分享

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