|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
CC3200AI实验教程 ——疯壳·开发板系列 中断
6 F @3 E( n/ S& p6 y, h* [8 p3 _: L
$ ^5 q$ ~) n: V- e5 N
s P5 }9 T6 n Y$ r7 {5 Y. G
接口数据传送控制方式有查询、中断和DMA等,中断是重要的接口数据传送控制方式。中断控制分为全局和局部两级,全局中断由NVIC控制,局部中断由外设控制。1 k% F% L7 ?) B2 R3 h8 q, P
嵌套向量中断控制器NVIC支持多个内部异常和多达240个外部中断。从广义上讲,异常和中断都是暂停正在执行的程序转去执行异常或中断处理程序,然后返回原来的程序继续执行。从狭义上将,异常由内部事件引起,而中断有外部硬件产生。
2 T J! H) j4 u* ^ 异常和中断的处理与子程序调用有相似之处,但也有下列本质区别:
) e- [9 w: y/ X: @% f: ?. z 什么时候调用子程序是确定的,而什么时候产生异常和中断时不确定的。子程序的起始地址由调用程序给出,而异常和中断程序的起始地址存放在地址表中。/ ?9 S7 v8 `2 y. L2 n
子程序的执行一般是无条件的,而异常和中断处理程序的执行要先使能。9 U' X# j9 u5 f0 W9 R/ b1 z
CC3200的NVIC具有下列特性:. h& j" Z; t% n) U
a、确定的、快速的中断处理,总是12个时钟周期; v# O$ N+ P1 h$ j' a
b、每个中断的优先级可编程(0~7,0表示最高优先级);6 a. e7 t5 {- D9 g
c、3~8位优先级配置;
, \1 Y! K. ~: o/ h" @ d、动态重新分配中断优先级;, J2 Y4 A& r/ ~: a5 R& P) b3 [
e、中断优先级分组允许选择中断优先级分组和中断子优先级的数量。低延迟中断和异常处理;
c& I) \3 q" B( _7 O0 Q f、中断信号电平和边沿检测。5 p9 w4 V% u) O- l% ~
1.1寄存器( l. W7 L- e# h O
本小节将使用的GPIO外部中断来实现按键的功能。每个GPIO端口的中断功能通过7个寄存器来进行控制。这些寄存器用来选择中断源、中断优先级和边沿特性。当一个或者多个GPIO输入引起中断时,一个单中断信号输出到整个GPIO端口的中断控制器。7 L% P1 b: W$ I) R3 _0 S
下面三个寄存器定义了引起中断的边沿或检测:1 S8 I+ S4 L4 @ I
a、GPIOIS:GPIO 中断检测寄存器;/ m1 J$ W% `( f% x: M) ^9 ?+ l
b、GPIOIBE:GPIO 中断边沿寄存器;
7 Q. \: R' ~* ?! {. p8 J0 } W c、GPIOIEV:GPIO 中断时间寄存器。: n C: y* F: L7 z F
中断功能通过GPIO中断掩码(GPIOIM)寄存器来进行使能和关闭。6 u5 r8 B: s6 {' q% @* @
当一个中断条件产生时,有两个地方可以查看中断信号的状态:GPIO源中断状态(GPIORIS)寄存器和GPIO掩码中断状态(GPIOMIS)寄存器。正如名称暗示的那样,GPIOMIS寄存器只显示可以发送给中断控制器的中断条件。GPIORIS 寄存器表示一个 GPIO引脚达到了产生中断的条件,但是不一定会发送给中断控制器。! l. Y1 ^1 w7 e
如果是GPIO电平检测中断,产生中断的电平信号必须保持到中断服务的产生。一旦输入的信号解除中断产生的逻辑信号,对应的GPIORIS寄存器中的源中断寄存器位将被清零。对于GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过向寄存器GPIOICR中的对应位写入1来进行清零。GPIOMIS寄存器中的对应位反应源中断状态位的掩码值。
& k7 \. N' {9 t, p$ X3 k 当编辑中断控制寄存器时,应当将中断全部关闭(GPIOIM清零)。如果对应的位使能的话,则写任何中断控制寄存器都会产生不必要的中断
7 {" V; L+ j: x- X1 L6 a GPIOIS是中断检测寄存器。置位则对应的引脚进行电平检测,清零则对应的引脚进行边沿检测。在复位时,所有的位清零。如图1.0.1所示。 p' r# n5 N; Q3 R, T$ z5 x6 Z& \
注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。
0 V; P/ @8 y9 U. |' R# D/ {* ~% K
& M; T) T% D8 O 图1.0.1 GPIOIS寄存器
. Z G; |/ R0 k0 T" ] GPIOIBE寄存器允许双边沿来触发中断。当GPIOIS寄存器设置为检测边沿时, 则设置GPIOIBE寄存器来配置对应的引脚来检测上升和下降沿,而忽略 GPIOIEV 寄存器中的对应位的配置。清零一位则配置为引脚受GPIOIEV寄存器的控制。复位之后,所有的位都被清零。如图1.0.2所示。- K' A" W/ j0 w8 t- f1 Q7 X
注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。$ T6 V- ~2 `5 O- ~5 S
% {' @. H3 \9 }. q
3 s8 A0 W0 {1 z6 n# c. ]
图1.0.2 GPIOIBE寄存器- f: W2 K0 _% c* W
GPIOIEV寄存器是中断事件寄存器。置位该寄存器中对应的位来配置对应的引脚检测上升沿或者高电平,这取决于GPIOIS 寄存器对应位的配置。清零该寄存器中的对应位则对应的引脚检测下降沿或者低电平,这取决于GPIOIS寄存器中对应位的配置。复位之后所有的位都清零。如图1.0.3所示。
i$ m( s9 Q, Q! J) @$ ^: p6 X0 d* g' |( X
5 X7 D3 ~- u+ r( w3 Z }: r
图1.0.3 GPIOIEV寄存器 \: N' G, o; E
GPIOIM寄存器是中断掩码寄存器。置位该寄存器中的对应位,则对应引脚上产生的中断将通过组合中断信号发送给中断控制器。清零则对应的引脚产生的中断不会发送给中断控制器。复位之后所有的位都清零。如图1.0.4所示。
6 R. Z+ X( ^; c6 r( n- h4 [' `& Z1 D' [0 b
( n6 F, Q0 J6 M) M$ ]2 w
图1.0.4 GPIOIM寄存器& L% f2 O4 O' H/ D
GPIORIS寄存器是源中断状态寄存器。当对应的引脚达到中断条件时,该寄存器中对应的位被置位。如果中断掩码(GPIOIM)寄存器中的对应位被置位, 则发送中断信号到中断控制寄存器。某一位读取为0,则说明对应的引脚没有产生中断。对于电平触发中断,引脚上的中断信号必须保持到中断服务。一旦中断信号达不到中断逻辑检测要求,则GPIOIS寄存器对应的RIS位将被清零。对于一个GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过置位GPIOICR寄存器中对应的位进行清零。GOUIMIS寄存器中的位反映RIS位的掩码值。如图1.0.5所示。
" i$ X! S+ X2 b! E$ `! y4 y. |: z4 J5 i
% r; E1 E" k7 U. ^' s) y3 y
图1.0.5 GPIORIS寄存器" A4 F' H7 M6 { E6 ^/ j
GPIOMIS寄存器是掩码中断状态寄存器。如果寄存器中对应位被置位,则对应的中断将被发送到中断控制器。如果某一位被清零,则无论是否有中断产生,
* m( @- s. f) T7 V, U0 m0 }/ X9 b 中断都会被屏蔽掉。GPIOMIS寄存器是中断掩码之后的状态。如图1.0.6所示。
! X/ G9 c4 o& C" X- H* z+ e* }, a% q* h5 v% I6 T
; D2 H& d" ~) r$ c6 t. k+ E( u
图1.0.6 GPIOMIS寄存器
& l; }% L; [- g GPIOICR寄存器是中断清零寄存器。对于边沿检测中断,置位GPIOICR寄存器中对应的位,则会清除GPIORIS和GPIOMIS寄存器中对应的位。如果中断是电平检测,则该寄存器中的对应位没有影响。另外,向该寄存器中写入0也没有任何影响。如图1.0.7所示。: T# Z4 E1 z1 }& S* D B- l
% {/ s, b; B- ?: c% B) Z; O4 f
( h& s6 h6 T8 A+ G. Y8 X* f3 I' \" Y 图1.0.7 GPIOICR寄存器* K$ u! W, ?# K# D, D; p8 n
1.2实验现象, p w( t) |/ X6 |9 ~
本实验在是官方CC3200SDK_1.2.0中Interrupt例程代码的基础上修改得来的,打开Interrupt_Demo,由于本次实验用到串口和按键,所以在mian函数的PinMuxConfig()中配置了串口0的输入输出以及GPIO_13和GPIO_22的方向为输入。
- ]. j2 i, s M- N, F 本次实验的关键是在ButtonIntInit()函数中,该函数如图1.0.8所示。
( D8 z% c/ }" u, A$ J
1 \5 w' @+ B" a* A
8 v0 F5 \9 g7 p7 T* g% l: p 图1.0.8 ButtonIntInit()函数: Z4 `' O- h! x$ R h t% n
在该函数中吧GPIO_13与GOIO_22配置为下降沿触发,触发的中断函数为Button1IntHandler()以及Button2IntHandler(),进入中断后,首先清除标志位,然后通过串口0打印出“Button1”以及“Button2”。3 q m- U' z$ r3 l% p
打开Uniflash,把编译后生成bin文件下载到板子上(参考GPIO小节),把串口选择的拨码的第一个“RXD”以及“CH340G_VCC”拨到ON,这里我们用到了串口0的接收,打开串口调试助手,选择对应的串口号,波特率设置为115200,打开串口,a按下复位,可以看到串口打印信息如图1.0.9所示。# Q- G9 J4 |) p1 H @( S0 w) W' b
+ ?1 h/ w0 N* X9 O( |5 r, ^
- I! ]+ {3 a6 }4 Z6 p( A
图1.0.9 复位时串口打印
+ A4 C. B+ ?' N" r, N 按下板子上的SW2和SW3可以看到串口打印信息如图1.1.0所示。
5 }( P5 x x7 S/ k$ X
! t; B! G% {* h4 L" L! F: i" q o. a5 B+ J# }
图1.1.0 按下按键后串口打印
6 M. z9 _ |; P* x+ c; L, i" p' G/ C+ W/ Y* }. F/ c% L
- s" w g7 T7 s! Q+ J
) Y4 |% O7 ^" d) Z( h2 w文件下载请点击:
【5】中断.pdf
(758.29 KB, 下载次数: 0)
$ o/ d& ~) R2 m3 x$ _2 H
Y* ~2 V1 w" j- P8 B
|
|