|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
CC3200AI实验教程 ——疯壳·开发板系列 中断 5 P5 l9 ?8 q4 C' R
7 R& ~( F- O+ g9 }
/ `5 s5 Y) c% y- U6 I0 c; ]. } ?# `# }. Y; l
接口数据传送控制方式有查询、中断和DMA等,中断是重要的接口数据传送控制方式。中断控制分为全局和局部两级,全局中断由NVIC控制,局部中断由外设控制。
, t6 f6 c+ T, ~$ ?3 d# [ 嵌套向量中断控制器NVIC支持多个内部异常和多达240个外部中断。从广义上讲,异常和中断都是暂停正在执行的程序转去执行异常或中断处理程序,然后返回原来的程序继续执行。从狭义上将,异常由内部事件引起,而中断有外部硬件产生。
7 ?7 a; h: j, }0 { 异常和中断的处理与子程序调用有相似之处,但也有下列本质区别:
8 ~( W1 y0 E& Z+ B 什么时候调用子程序是确定的,而什么时候产生异常和中断时不确定的。子程序的起始地址由调用程序给出,而异常和中断程序的起始地址存放在地址表中。. H1 s" ^' w9 p& Y& P
子程序的执行一般是无条件的,而异常和中断处理程序的执行要先使能。
8 `! k; L% B( V# w8 [1 d P- h5 v CC3200的NVIC具有下列特性:
. D/ T6 ~4 }8 Q a、确定的、快速的中断处理,总是12个时钟周期;
7 V1 u8 S2 A- K' K! V7 {; O b、每个中断的优先级可编程(0~7,0表示最高优先级);
. D: \; `) B/ D9 }: F' | c、3~8位优先级配置;
( g2 `1 F4 c! _& c. P; ~, u d、动态重新分配中断优先级;
5 U6 x3 Z, c& c* e& { e、中断优先级分组允许选择中断优先级分组和中断子优先级的数量。低延迟中断和异常处理;6 m* ^" o# T' J2 m
f、中断信号电平和边沿检测。
4 _3 p4 Z( G3 c1 m 1.1寄存器# ^. L. K; ~7 I. N
本小节将使用的GPIO外部中断来实现按键的功能。每个GPIO端口的中断功能通过7个寄存器来进行控制。这些寄存器用来选择中断源、中断优先级和边沿特性。当一个或者多个GPIO输入引起中断时,一个单中断信号输出到整个GPIO端口的中断控制器。9 v) y6 u, i% F1 c* h# g p7 j, m
下面三个寄存器定义了引起中断的边沿或检测:2 G9 d4 q% \9 v1 s# h
a、GPIOIS:GPIO 中断检测寄存器;
# |7 i3 N% u# E b、GPIOIBE:GPIO 中断边沿寄存器;1 b3 O( y) L- G: W
c、GPIOIEV:GPIO 中断时间寄存器。 u/ _/ R+ }* I7 F% }
中断功能通过GPIO中断掩码(GPIOIM)寄存器来进行使能和关闭。3 f1 f s( u$ X# _# n+ L
当一个中断条件产生时,有两个地方可以查看中断信号的状态:GPIO源中断状态(GPIORIS)寄存器和GPIO掩码中断状态(GPIOMIS)寄存器。正如名称暗示的那样,GPIOMIS寄存器只显示可以发送给中断控制器的中断条件。GPIORIS 寄存器表示一个 GPIO引脚达到了产生中断的条件,但是不一定会发送给中断控制器。* G. I% ]+ g/ y" `5 n! q
如果是GPIO电平检测中断,产生中断的电平信号必须保持到中断服务的产生。一旦输入的信号解除中断产生的逻辑信号,对应的GPIORIS寄存器中的源中断寄存器位将被清零。对于GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过向寄存器GPIOICR中的对应位写入1来进行清零。GPIOMIS寄存器中的对应位反应源中断状态位的掩码值。
& U% q8 h3 P' [) K$ O. w: ? 当编辑中断控制寄存器时,应当将中断全部关闭(GPIOIM清零)。如果对应的位使能的话,则写任何中断控制寄存器都会产生不必要的中断
+ D% F& ?# j( D6 L% ~ GPIOIS是中断检测寄存器。置位则对应的引脚进行电平检测,清零则对应的引脚进行边沿检测。在复位时,所有的位清零。如图1.0.1所示。
4 b) H& i+ {0 n+ v" G2 L 注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。
) I- n- N |" e7 _
3 G3 G! g0 o5 e
4 u; m" @" a/ ?
图1.0.1 GPIOIS寄存器: ?- N* T$ M9 B6 H) z ]6 f
GPIOIBE寄存器允许双边沿来触发中断。当GPIOIS寄存器设置为检测边沿时, 则设置GPIOIBE寄存器来配置对应的引脚来检测上升和下降沿,而忽略 GPIOIEV 寄存器中的对应位的配置。清零一位则配置为引脚受GPIOIEV寄存器的控制。复位之后,所有的位都被清零。如图1.0.2所示。
) y* g( A7 L" O1 R' \6 |$ i 注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。/ e' t9 L& [( X! e9 ^% y
' p( s/ q! s# O9 a" D
" f2 Q$ `! D. b. @* C0 f- ]
图1.0.2 GPIOIBE寄存器( l0 V; C2 h8 A( w& ]. G$ Q
GPIOIEV寄存器是中断事件寄存器。置位该寄存器中对应的位来配置对应的引脚检测上升沿或者高电平,这取决于GPIOIS 寄存器对应位的配置。清零该寄存器中的对应位则对应的引脚检测下降沿或者低电平,这取决于GPIOIS寄存器中对应位的配置。复位之后所有的位都清零。如图1.0.3所示。# d: e$ I; t M' O S0 @6 |
& R$ D7 U8 U% v1 @
- ?. L+ ?) R# M. K* g8 O+ K: A, y, x! t
图1.0.3 GPIOIEV寄存器8 |+ w% c) a1 k( {) E
GPIOIM寄存器是中断掩码寄存器。置位该寄存器中的对应位,则对应引脚上产生的中断将通过组合中断信号发送给中断控制器。清零则对应的引脚产生的中断不会发送给中断控制器。复位之后所有的位都清零。如图1.0.4所示。
4 @, p! n6 c( Q# f( u; o i0 u' W$ _& e: e
# K3 Q& r2 b: t
图1.0.4 GPIOIM寄存器
8 ~3 I; y7 n6 R: r9 E: n: x GPIORIS寄存器是源中断状态寄存器。当对应的引脚达到中断条件时,该寄存器中对应的位被置位。如果中断掩码(GPIOIM)寄存器中的对应位被置位, 则发送中断信号到中断控制寄存器。某一位读取为0,则说明对应的引脚没有产生中断。对于电平触发中断,引脚上的中断信号必须保持到中断服务。一旦中断信号达不到中断逻辑检测要求,则GPIOIS寄存器对应的RIS位将被清零。对于一个GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过置位GPIOICR寄存器中对应的位进行清零。GOUIMIS寄存器中的位反映RIS位的掩码值。如图1.0.5所示。
4 b) D! ~" b! J. j |2 Q# P3 K: d4 q! B' B- [( u+ ?5 C3 m& b3 i8 M
p1 D/ F2 E. K1 l! @& K4 H8 Y S( A a
图1.0.5 GPIORIS寄存器' h* W3 u# {5 e2 _! k1 C; [# ?
GPIOMIS寄存器是掩码中断状态寄存器。如果寄存器中对应位被置位,则对应的中断将被发送到中断控制器。如果某一位被清零,则无论是否有中断产生,
9 R$ k' o2 h3 b: v. \- S1 r 中断都会被屏蔽掉。GPIOMIS寄存器是中断掩码之后的状态。如图1.0.6所示。
$ x2 [% E/ w2 {5 T0 C4 i' q
" f0 C: @, l6 C* N
z1 S( H% ?8 U9 D
图1.0.6 GPIOMIS寄存器
2 I- h! a& B8 {/ y GPIOICR寄存器是中断清零寄存器。对于边沿检测中断,置位GPIOICR寄存器中对应的位,则会清除GPIORIS和GPIOMIS寄存器中对应的位。如果中断是电平检测,则该寄存器中的对应位没有影响。另外,向该寄存器中写入0也没有任何影响。如图1.0.7所示。* c! J. U8 g- ~! e# Z K
9 j2 T6 L5 I6 H0 M1 K
2 Y$ d2 t _6 E 图1.0.7 GPIOICR寄存器
# `' V, D3 a) k2 l. ?( ]4 @0 D 1.2实验现象9 Q7 C6 e# D6 B# _& q
本实验在是官方CC3200SDK_1.2.0中Interrupt例程代码的基础上修改得来的,打开Interrupt_Demo,由于本次实验用到串口和按键,所以在mian函数的PinMuxConfig()中配置了串口0的输入输出以及GPIO_13和GPIO_22的方向为输入。/ r3 ^$ D) z' z! k/ S* o$ g' g) U
本次实验的关键是在ButtonIntInit()函数中,该函数如图1.0.8所示。
8 _3 h# M! s" Y
" l, C4 ]3 M0 |# y! K! ]8 E
" S N3 v& e( N+ @# \! Y5 D3 J6 g 图1.0.8 ButtonIntInit()函数+ r2 _6 `1 B0 O) w4 T
在该函数中吧GPIO_13与GOIO_22配置为下降沿触发,触发的中断函数为Button1IntHandler()以及Button2IntHandler(),进入中断后,首先清除标志位,然后通过串口0打印出“Button1”以及“Button2”。
# y( H1 ^3 V4 n# [0 h% ?, b3 I" y 打开Uniflash,把编译后生成bin文件下载到板子上(参考GPIO小节),把串口选择的拨码的第一个“RXD”以及“CH340G_VCC”拨到ON,这里我们用到了串口0的接收,打开串口调试助手,选择对应的串口号,波特率设置为115200,打开串口,a按下复位,可以看到串口打印信息如图1.0.9所示。
* u; n; o" k4 a, b( S
3 g9 O q: d3 N! N
2 S) g# }6 i; g! w" d 图1.0.9 复位时串口打印
( K# e) u3 |$ E0 D r 按下板子上的SW2和SW3可以看到串口打印信息如图1.1.0所示。* n4 y# o& a6 ~8 g. s
" E9 g& [; S4 a* v4 B
/ s3 {/ v! C2 `1 P4 _ F A 图1.1.0 按下按键后串口打印5 M$ J4 p) |8 L# A5 c/ D; e
% r5 V& [ a J7 [1 d7 Z! }: I9 w$ b& }0 P3 K8 l9 a
" h7 w- r- U: i! O" @% Q6 ]
文件下载请点击:
【5】中断.pdf
(758.29 KB, 下载次数: 0)
y" C8 ~% j% j( l5 w
0 W, n5 A. y) J' I; ?. v |
|