|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
CC3200AI实验教程 ——疯壳·开发板系列 中断 8 z( I' y7 {5 [7 L% y2 u3 x+ G
! Y5 G! B9 {7 |& U% i0 w: A( E
: L+ t( Y! L4 N% Y( a
1 O: P. F! G! F1 `; {6 C! d
接口数据传送控制方式有查询、中断和DMA等,中断是重要的接口数据传送控制方式。中断控制分为全局和局部两级,全局中断由NVIC控制,局部中断由外设控制。
/ P, q" {- c# b; X 嵌套向量中断控制器NVIC支持多个内部异常和多达240个外部中断。从广义上讲,异常和中断都是暂停正在执行的程序转去执行异常或中断处理程序,然后返回原来的程序继续执行。从狭义上将,异常由内部事件引起,而中断有外部硬件产生。* \( K3 J8 K3 u$ [2 [# z
异常和中断的处理与子程序调用有相似之处,但也有下列本质区别:
& T: H8 _3 {, t0 M) { 什么时候调用子程序是确定的,而什么时候产生异常和中断时不确定的。子程序的起始地址由调用程序给出,而异常和中断程序的起始地址存放在地址表中。( Q9 x `7 Z6 B! D6 K' ]
子程序的执行一般是无条件的,而异常和中断处理程序的执行要先使能。7 S- Y- d6 R. C
CC3200的NVIC具有下列特性:
5 p L$ M" r# a* p( C4 ^ f0 a' J a、确定的、快速的中断处理,总是12个时钟周期;$ P4 i% @2 D. p% T- O2 H) Z
b、每个中断的优先级可编程(0~7,0表示最高优先级);% Z g" Y; P& }
c、3~8位优先级配置;
$ A3 M d8 h4 @+ j: y5 W d、动态重新分配中断优先级;
4 l4 J- m3 l5 R! g4 X. g0 S e、中断优先级分组允许选择中断优先级分组和中断子优先级的数量。低延迟中断和异常处理;$ z c2 p3 b+ L# @9 f. n% t& `) F
f、中断信号电平和边沿检测。1 E! J, s& t( o
1.1寄存器
Q' ]* x/ X3 w* m4 ?2 ?5 j/ A 本小节将使用的GPIO外部中断来实现按键的功能。每个GPIO端口的中断功能通过7个寄存器来进行控制。这些寄存器用来选择中断源、中断优先级和边沿特性。当一个或者多个GPIO输入引起中断时,一个单中断信号输出到整个GPIO端口的中断控制器。% I g( @. j, t$ v0 d' j2 j+ M
下面三个寄存器定义了引起中断的边沿或检测:
/ {4 w6 j& ^) E q" }* Z7 w a、GPIOIS:GPIO 中断检测寄存器;4 F/ a7 R. _2 k: N
b、GPIOIBE:GPIO 中断边沿寄存器;! _' K6 a( s, h! _
c、GPIOIEV:GPIO 中断时间寄存器。
0 W: N$ G& H0 x5 G: F 中断功能通过GPIO中断掩码(GPIOIM)寄存器来进行使能和关闭。
" h; L$ O! P2 G; t9 ]- C 当一个中断条件产生时,有两个地方可以查看中断信号的状态:GPIO源中断状态(GPIORIS)寄存器和GPIO掩码中断状态(GPIOMIS)寄存器。正如名称暗示的那样,GPIOMIS寄存器只显示可以发送给中断控制器的中断条件。GPIORIS 寄存器表示一个 GPIO引脚达到了产生中断的条件,但是不一定会发送给中断控制器。
4 C+ s6 }8 T8 }7 F, \1 `# @ 如果是GPIO电平检测中断,产生中断的电平信号必须保持到中断服务的产生。一旦输入的信号解除中断产生的逻辑信号,对应的GPIORIS寄存器中的源中断寄存器位将被清零。对于GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过向寄存器GPIOICR中的对应位写入1来进行清零。GPIOMIS寄存器中的对应位反应源中断状态位的掩码值。
, y9 Q, O2 I. }! Y4 m# [' N) i5 a 当编辑中断控制寄存器时,应当将中断全部关闭(GPIOIM清零)。如果对应的位使能的话,则写任何中断控制寄存器都会产生不必要的中断$ e/ \$ _. U% A& X6 g5 P
GPIOIS是中断检测寄存器。置位则对应的引脚进行电平检测,清零则对应的引脚进行边沿检测。在复位时,所有的位清零。如图1.0.1所示。
$ `9 J$ u3 Q# q9 x 注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。
/ X8 h2 x3 f T% p! r1 D
$ R8 I8 d0 C- {7 C6 B, V
9 w: I, c X8 t; l 图1.0.1 GPIOIS寄存器, w, v5 {4 x8 S4 Y, C: n- o
GPIOIBE寄存器允许双边沿来触发中断。当GPIOIS寄存器设置为检测边沿时, 则设置GPIOIBE寄存器来配置对应的引脚来检测上升和下降沿,而忽略 GPIOIEV 寄存器中的对应位的配置。清零一位则配置为引脚受GPIOIEV寄存器的控制。复位之后,所有的位都被清零。如图1.0.2所示。
2 D% B2 n6 {/ Y! L 注意:为了防止产生错误的中断,在配置中断检测寄存器和边沿寄存器的时候,应当清零GPIOIM寄存器中的IME位来屏蔽中断引脚。配置GPIOIS寄存器的IS位和GPIOIBE寄存器的IBE位。清除GPIORIS寄存器。最后通过置位GPIOIM寄存器中的IME位来打开引脚。
( C1 G" B6 y, f
4 ~) q6 b$ I0 H* X+ j
4 l) d) s& J2 K. x4 g z9 G& O 图1.0.2 GPIOIBE寄存器
. p! `* f* E8 E" R p GPIOIEV寄存器是中断事件寄存器。置位该寄存器中对应的位来配置对应的引脚检测上升沿或者高电平,这取决于GPIOIS 寄存器对应位的配置。清零该寄存器中的对应位则对应的引脚检测下降沿或者低电平,这取决于GPIOIS寄存器中对应位的配置。复位之后所有的位都清零。如图1.0.3所示。' R) ?- G6 z+ K, {6 Z
; V7 N: @: s* [. ]3 U) b2 v
. ]! A9 ]7 x! J, z0 v: {
图1.0.3 GPIOIEV寄存器
+ d5 ?% A& i/ p& v7 j& \ GPIOIM寄存器是中断掩码寄存器。置位该寄存器中的对应位,则对应引脚上产生的中断将通过组合中断信号发送给中断控制器。清零则对应的引脚产生的中断不会发送给中断控制器。复位之后所有的位都清零。如图1.0.4所示。
! |1 ]$ K0 ~, N, l9 j; s/ w# L% R5 B1 h8 V- r) Y" f; n4 ]6 o! G. r
- f6 _& ~6 F G% }5 M4 w ?
图1.0.4 GPIOIM寄存器
' c5 W. v# x* [# e GPIORIS寄存器是源中断状态寄存器。当对应的引脚达到中断条件时,该寄存器中对应的位被置位。如果中断掩码(GPIOIM)寄存器中的对应位被置位, 则发送中断信号到中断控制寄存器。某一位读取为0,则说明对应的引脚没有产生中断。对于电平触发中断,引脚上的中断信号必须保持到中断服务。一旦中断信号达不到中断逻辑检测要求,则GPIOIS寄存器对应的RIS位将被清零。对于一个GPIO边沿检测中断,GPIORIS寄存器中的RIS位通过置位GPIOICR寄存器中对应的位进行清零。GOUIMIS寄存器中的位反映RIS位的掩码值。如图1.0.5所示。
# F, a: S; L7 S( ?* s( _2 s: C: O+ V: s
0 V4 M, t" Z$ R& y4 v
- u! ~! m. ^" X' i. b: J; T 图1.0.5 GPIORIS寄存器
/ b8 C5 Y& p' h2 E: A. T* A GPIOMIS寄存器是掩码中断状态寄存器。如果寄存器中对应位被置位,则对应的中断将被发送到中断控制器。如果某一位被清零,则无论是否有中断产生,/ _( X: ~. v E/ s- M& ?7 }
中断都会被屏蔽掉。GPIOMIS寄存器是中断掩码之后的状态。如图1.0.6所示。
1 E0 @9 H# Q# O7 c/ G/ L2 S' r" k& D. E0 o! ]) b
) e, K$ J, W) q0 J' ?; Z# g: X4 \ H 图1.0.6 GPIOMIS寄存器
- g n/ }; _% A i& E2 Y! p2 b3 G GPIOICR寄存器是中断清零寄存器。对于边沿检测中断,置位GPIOICR寄存器中对应的位,则会清除GPIORIS和GPIOMIS寄存器中对应的位。如果中断是电平检测,则该寄存器中的对应位没有影响。另外,向该寄存器中写入0也没有任何影响。如图1.0.7所示。
) X% J3 s- E y: G6 A- n6 m
( F2 B% e5 ^; ?
* Y' r! o9 ~& d, E 图1.0.7 GPIOICR寄存器
: g' |5 T% H6 S! Q7 { 1.2实验现象) {0 V9 ^( {# O
本实验在是官方CC3200SDK_1.2.0中Interrupt例程代码的基础上修改得来的,打开Interrupt_Demo,由于本次实验用到串口和按键,所以在mian函数的PinMuxConfig()中配置了串口0的输入输出以及GPIO_13和GPIO_22的方向为输入。4 d/ ?) W/ F& J( N
本次实验的关键是在ButtonIntInit()函数中,该函数如图1.0.8所示。
4 ^+ A0 H5 @: v& x1 v8 D
" h8 i% U3 w( _) s. y
$ F- i) e. Y8 A) L0 T 图1.0.8 ButtonIntInit()函数8 E0 K* u3 l# g+ r
在该函数中吧GPIO_13与GOIO_22配置为下降沿触发,触发的中断函数为Button1IntHandler()以及Button2IntHandler(),进入中断后,首先清除标志位,然后通过串口0打印出“Button1”以及“Button2”。; M, {/ J% `0 n' l2 Z
打开Uniflash,把编译后生成bin文件下载到板子上(参考GPIO小节),把串口选择的拨码的第一个“RXD”以及“CH340G_VCC”拨到ON,这里我们用到了串口0的接收,打开串口调试助手,选择对应的串口号,波特率设置为115200,打开串口,a按下复位,可以看到串口打印信息如图1.0.9所示。3 ]" D% T4 M A" |
& S! c; e i. _% x
& U) @; q+ d3 ]% T( a d+ h" ?; ` 图1.0.9 复位时串口打印, E8 A, E% V( t+ O7 V- ~0 \
按下板子上的SW2和SW3可以看到串口打印信息如图1.1.0所示。
. U4 w7 t" K3 S4 I( U. \8 }0 h1 a w9 o
$ q$ X+ z9 }8 O( H. D. p
图1.1.0 按下按键后串口打印7 T( D* S& ]0 Z: A
! M5 D u2 e: ?0 x1 a8 [1 w& p
6 g u( a' E- L5 ^+ C# B# V文件下载请点击:
【5】中断.pdf
(758.29 KB, 下载次数: 0)
7 I; p7 Q; i% b) X
; ^9 [- ^0 C' v5 k: N! ~ |
|