|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
CC3200AI实验教程 ——疯壳·开发板系列 中断 ) [9 r3 H) u5 a# j- W
+ Q. M" b' d* V8 c1 b8 _/ y5 W$ O- Y2 T7 d/ S1 d( g
( ]0 e! ^! P: \9 _$ p" L. c
接口数据传送控制方式有查询、中断和DMA等,中断是重要的接口数据传送控制方式。中断控制分为全局和局部两级,全局中断由NVIC控制,局部中断由外设控制。- R7 f) q1 J& T8 @$ `/ X* x
嵌套向量中断控制器NVIC支持多个内部异常和多达240个外部中断。从广义上讲,异常和中断都是暂停正在执行的程序转去执行异常或中断处理程序,然后返回原来的程序继续执行。从狭义上将,异常由内部事件引起,而中断有外部硬件产生。3 @$ k2 w- v; C$ y0 I; J$ ~- m
异常和中断的处理与子程序调用有相似之处,但也有下列本质区别:
: ~( F; N* [: x, x 什么时候调用子程序是确定的,而什么时候产生异常和中断时不确定的。子程序的起始地址由调用程序给出,而异常和中断程序的起始地址存放在地址表中。
+ { s' Y( Y" A" P! | 子程序的执行一般是无条件的,而异常和中断处理程序的执行要先使能。$ s( ~% X6 I, W' n3 U+ T; ~% K
CC3200的NVIC具有下列特性:
; _. Z8 I# d" a+ r. M a、确定的、快速的中断处理,总是12个时钟周期;# Z! c/ @" g- a: W1 _1 }9 K$ n
b、每个中断的优先级可编程(0~7,0表示最高优先级);
) f: z" x% Z( } c、3~8位优先级配置;
1 ]7 X8 e9 p8 O: X1 q6 z d、动态重新分配中断优先级;# e* ^" f: N c7 M- U& M2 O3 `& l
e、中断优先级分组允许选择中断优先级分组和中断子优先级的数量。低延迟中断和异常处理;2 W. P) n- z# e% t
f、中断信号电平和边沿检测。
# }+ u" F$ r; O$ A) b, \1 v 1.1寄存器
3 d( e% k, s5 e 本小节将使用的GPIO外部中断来实现按键的功能。每个GPIO端口的中断功能通过7个寄存器来进行控制。这些寄存器用来选择中断源、中断优先级和边沿特性。当一个或者多个GPIO输入引起中断时,一个单中断信号输出到整个GPIO端口的中断控制器。
" m/ {& v5 B) | I" h 下面三个寄存器定义了引起中断的边沿或检测:3 a% n* T) e3 }+ d# G. J' M$ K
a、GPIOIS:GPIO 中断检测寄存器;$ o, A, K! z, [! T# M- V$ [
b、GPIOIBE:GPIO 中断边沿寄存器;9 o% l" y( v3 a) d. m/ r
c、GPIOIEV:GPIO 中断时间寄存器。
6 U- p. k/ ?) l W2 K 中断功能通过GPIO中断掩码(GPIOIM)寄存器来进行使能和关闭。
5 E' r0 X* _3 u& ]$ h# y 当一个中断条件产生时,有两个地方可以查看中断信号的状态:GPIO源中断状态(GPIORIS)寄存器和GPIO掩码中断状态(GPIOMIS)寄存器。正如名称暗示的那样,GPIOMIS寄存器只显示可以发送给中断控制器的中断条件。GPIORIS 寄存器表示一个 GPIO引脚达到了产生中断的条件,但是不一定会发送给中断控制器。
9 O4 K' o( e2 x7 i 如果是GPIO电平检测中断,产生中断的电平信号必须保持到中断服务的产生。一旦输入的信号解除中断产生的逻辑信号,对应的GPIORIS寄存器中的源中断寄存器位将被清零。对于GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过向寄存器GPIOICR中的对应位写入1来进行清零。GPIOMIS寄存器中的对应位反应源中断状态位的掩码值。
$ b. d+ M: @ A$ a1 X 当编辑中断控制寄存器时,应当将中断全部关闭(GPIOIM清零)。如果对应的位使能的话,则写任何中断控制寄存器都会产生不必要的中断
; d) A% A& M% I( T6 H e2 M0 K! n; k' U GPIOIS是中断检测寄存器。置位则对应的引脚进行电平检测,清零则对应的引脚进行边沿检测。在复位时,所有的位清零。如图1.0.1所示。3 Y1 O; s- V% @- P" J: I, s
注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。" x3 A* a x) J. q( M7 d& Y9 V
1 [' {& W' I+ k
+ h! r/ ^# i6 ^
图1.0.1 GPIOIS寄存器
6 A, x" L% J1 d# f1 S2 ~ GPIOIBE寄存器允许双边沿来触发中断。当GPIOIS寄存器设置为检测边沿时, 则设置GPIOIBE寄存器来配置对应的引脚来检测上升和下降沿,而忽略 GPIOIEV 寄存器中的对应位的配置。清零一位则配置为引脚受GPIOIEV寄存器的控制。复位之后,所有的位都被清零。如图1.0.2所示。
# w. a j! k2 G2 u( b 注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。
, h6 j5 J. F: E: @5 z' n P4 q z# ?- ?, S8 v% m0 v
/ d: x# V7 L$ l- l! w/ |) i, N! ~ 图1.0.2 GPIOIBE寄存器 Y8 Q0 d4 {: x0 w( G2 H8 ]* L
GPIOIEV寄存器是中断事件寄存器。置位该寄存器中对应的位来配置对应的引脚检测上升沿或者高电平,这取决于GPIOIS 寄存器对应位的配置。清零该寄存器中的对应位则对应的引脚检测下降沿或者低电平,这取决于GPIOIS寄存器中对应位的配置。复位之后所有的位都清零。如图1.0.3所示。
$ s) r. F" [2 `0 n ?% u! ~) F2 T. E7 I1 X* f8 L6 r
( A: g9 u: C, M7 L4 K# F( O, O 图1.0.3 GPIOIEV寄存器4 b8 e& A3 }% J& S! W6 o' j
GPIOIM寄存器是中断掩码寄存器。置位该寄存器中的对应位,则对应引脚上产生的中断将通过组合中断信号发送给中断控制器。清零则对应的引脚产生的中断不会发送给中断控制器。复位之后所有的位都清零。如图1.0.4所示。
9 g7 ?; d4 Y' Z; {* z$ a) D% h3 [' e) a; F4 E- \
! B- F1 ~7 n& h
图1.0.4 GPIOIM寄存器
6 X# ^ O, R1 {1 p GPIORIS寄存器是源中断状态寄存器。当对应的引脚达到中断条件时,该寄存器中对应的位被置位。如果中断掩码(GPIOIM)寄存器中的对应位被置位, 则发送中断信号到中断控制寄存器。某一位读取为0,则说明对应的引脚没有产生中断。对于电平触发中断,引脚上的中断信号必须保持到中断服务。一旦中断信号达不到中断逻辑检测要求,则GPIOIS寄存器对应的RIS位将被清零。对于一个GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过置位GPIOICR寄存器中对应的位进行清零。GOUIMIS寄存器中的位反映RIS位的掩码值。如图1.0.5所示。
) F- d( N3 n) ]- v# A/ p" `
$ j3 B' D+ {/ @7 ~1 O
4 u5 Z: _% j5 ?& R
图1.0.5 GPIORIS寄存器 D# M% @1 u) ?. X; h
GPIOMIS寄存器是掩码中断状态寄存器。如果寄存器中对应位被置位,则对应的中断将被发送到中断控制器。如果某一位被清零,则无论是否有中断产生,
. j+ K2 @) @$ F9 P/ I 中断都会被屏蔽掉。GPIOMIS寄存器是中断掩码之后的状态。如图1.0.6所示。
: N$ Y: `0 H- @7 `# j/ a3 W8 F& r( `( r/ H- G
, x6 L) G( L% e% c4 j$ e4 k
图1.0.6 GPIOMIS寄存器1 A5 `3 @; J, s* k! Z
GPIOICR寄存器是中断清零寄存器。对于边沿检测中断,置位GPIOICR寄存器中对应的位,则会清除GPIORIS和GPIOMIS寄存器中对应的位。如果中断是电平检测,则该寄存器中的对应位没有影响。另外,向该寄存器中写入0也没有任何影响。如图1.0.7所示。, e+ z( s# j0 l# Y& W5 K
; l6 g0 u I. `) K& f6 [/ c
) W2 p8 f/ ]0 T; D6 K% K7 g 图1.0.7 GPIOICR寄存器
z* H% a: v. ^9 z% X6 ?- v4 K 1.2实验现象
. [$ T" U; D8 C 本实验在是官方CC3200SDK_1.2.0中Interrupt例程代码的基础上修改得来的,打开Interrupt_Demo,由于本次实验用到串口和按键,所以在mian函数的PinMuxConfig()中配置了串口0的输入输出以及GPIO_13和GPIO_22的方向为输入。
' u4 M! r! I6 b. | 本次实验的关键是在ButtonIntInit()函数中,该函数如图1.0.8所示。, I0 R4 k1 T3 p; O9 B
7 `9 e9 Z( w7 y6 Q
; c) K7 T/ c5 r: L
图1.0.8 ButtonIntInit()函数* m: q; F% O( a& j
在该函数中吧GPIO_13与GOIO_22配置为下降沿触发,触发的中断函数为Button1IntHandler()以及Button2IntHandler(),进入中断后,首先清除标志位,然后通过串口0打印出“Button1”以及“Button2”。6 x X+ b5 [) O; M+ h( j
打开Uniflash,把编译后生成bin文件下载到板子上(参考GPIO小节),把串口选择的拨码的第一个“RXD”以及“CH340G_VCC”拨到ON,这里我们用到了串口0的接收,打开串口调试助手,选择对应的串口号,波特率设置为115200,打开串口,a按下复位,可以看到串口打印信息如图1.0.9所示。3 m8 H7 \6 w4 J t y% ^
; e- F9 H$ ]8 o4 f
8 R E% X# `3 q, p9 ^1 K2 Y
图1.0.9 复位时串口打印7 r, K/ B, Q$ u
按下板子上的SW2和SW3可以看到串口打印信息如图1.1.0所示。( H' y: J0 [# I t3 W4 A2 i% j
% A; w, A: k9 w. l( \6 w |
- V* R9 L# U4 F0 s* W: X 图1.1.0 按下按键后串口打印
. O1 z+ z" v( Y# ?, t j- i) [9 w5 ]* K' C- ?' t' ?. l
B! `$ i( t# h: U6 S- a+ g
. P* d/ n* d a- D- P文件下载请点击:
【5】中断.pdf
(758.29 KB, 下载次数: 0)
/ h; J0 f6 a: ?2 c1 o. D( J, f
- w1 @7 R; [& O& p: F' j7 l% @+ k0 f! a |
|