|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
中断实验教程 ——疯壳·开发板系列 $ X9 x- n6 H: J" ^" h
$ V5 z2 M% ]+ g
* v: Q7 i G3 I9 S: }2 y( O% Z 图1
/ ?. L( f7 ?6 b3 U" S" ~. J9 F: _' r& k" [) k3 D
第一节中断硬件电路
; R4 p, h/ N. u 将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:, m+ z# z/ n$ E# z" e, K
+ E3 |" \) |: H1 ?
1 [' P' d- n8 F$ H' P" k6 A* O
) F( c2 Y* m8 K" e7 N5 Z6 C: I 图2% ]8 w. y3 N) Q' z
w) n" L$ J4 W' B1 z9 p
" I( ~& E+ ^( Y$ W& @# J 第二节 中断$ s; _' G& P# U! r5 q/ V) k$ j
2.1 中断介绍
% g7 M) G. P1 z. y 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。
0 e1 a( [/ f6 m6 t' s DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。2 a9 r* r0 y9 W
2.2 寄存器介绍* g# j4 t" m4 V/ M/ o, }/ j$ y5 s
2.2.1 GPIO_IRQ0中断源选择寄存器" N$ I( B6 n8 _) [0 i# G/ Y0 k
% t6 A+ b8 n4 X; c" \0 ^" N
0 |4 r* _) M" P$ X5 b0 Z
& T( H! e1 G( _: `) g 图3. o- N9 o. f8 r+ z7 U; c
15:6位:保留不使用;- u# C: N6 j+ j1 [5 g# B) x
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
$ _. U/ g- z9 \! p; e" u7 M 2.2.2 GPIO_IRQ1中断源选择寄存器
$ E1 R# |6 I& a2 i0 a0 ~4 i5 [9 K& X0 E- R# m) Q$ N- T
; x5 v+ A9 B; p* c+ n4 \ 图49 p" [4 M" G5 F9 S" a9 i2 m- o
15:6位:保留不使用;, R* S' q( @" M; ^
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
1 s) M, d6 x/ ]% i! ?* q& o 2.2.3 GPIO_IRQ2中断源选择寄存器9 t) N; \1 \) l, E# P/ U$ A" n2 s
+ a4 e; h6 y9 _! t% _ M
0 V6 d- J" m% l* \7 k* q1 N 图58 |) G% s+ q% P/ O6 D; D5 A
15:6位:保留不使用; H* P; h |1 o' ?* g& [2 s% T
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
4 X8 U0 ]1 K: p( Y 4.2.4 GPIO_IRQ3中断源选择寄存器
- S: w- v2 o5 n. t; i [9 L- V# O! v% [. S8 ^$ ^/ V9 t
! T7 f# g- }# u: i$ z( Y: I" y" \
图6. [% m$ K" e" F# f5 w7 C6 n8 Q4 G
15:6位:保留不使用;
0 g4 Z- o! `6 f; Q 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
: {5 T/ k" G& D4 W5 U 2.2.5 GPIO_IRQ4中断源选择寄存器 b- Y8 W' ]: I- {3 ^
( q1 ~2 Z! u1 I4 T. Y1 v
/ F, I7 }% k. Q/ U9 y, S. a% L
图7( b; v: [0 F+ y# \2 \$ w
5:6位:保留不使用;& C- T& n7 N& A3 f8 {
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;& g* @5 a: K5 r. i
2.2.6 GPIO延时寄存器/ K$ [: h W( ^3 d* b' c
9 L$ ~, v# f% K# F# A U3 ]
" k1 V7 g9 I# q n
图8
/ j0 {+ A1 Y$ ?' V- e 15:14位:保留不使用;
4 @$ z9 |/ D+ K# D& w 13位:使能键盘接口延时计数;
$ H) L- U2 p. A+ O, B! m# ]" W2 m 12位:使能GPIO IRQ4延时计数;5 I3 T4 O6 I; U
11位:使能GPIO IRQ3延时计数;
3 C1 O& ?: b, M6 [* X 10位:使能GPIO IRQ2延时计数;4 j' X0 T+ C" N# P- ^- z N8 M
9位:使能GPIO IRQ1延时计数;
6 ~0 C- f* y% }$ o- H( F 8位:使能GPIO IRQ0延时计数;! N8 \- s6 O. P( ]
7:6位:保留不使用;( C1 {6 v. s: h1 H4 C+ ^5 p
5:0位:延时值,为N毫秒。' e- A' ? _6 p5 j
2.2.7 GPIO中断复位寄存器
! m" y: i9 {4 h2 @
. n0 n3 ~% i& L" U9 P2 `
/ _4 S( ~7 W& J! F
图9* f, ^0 [0 e/ S
15:6位:保留不使用;) ?2 p3 q7 p s5 S) n& s
5位:对该位写1,则复位KBRD中断,读取返回0;& Z2 [6 _" `' A$ d% L
4位:对该位写1,则复位GPIO4中断,读取返回0;* {- X7 F0 Q" ^' [4 W/ \# {
3位:对该位写1,则复位GPIO3中断,读取返回0;- ^+ c: h K3 c9 s' u7 h
4位:对该位写1,则复位GPIO2中断,读取返回0;4 a5 r( G% [; R& ^1 I! j
1位:对该位写1,则复位GPIO1中断,读取返回0;
" v6 c% R$ ^2 t9 w2 v 0位:对该位写1,则复位GPIO0中断,读取返回0。1 h0 |1 d0 k" y( O& S
2.2.8 GPIO中断电平控制寄存器( p& ~% Y) b+ a; U5 {7 Y9 Q9 @
" }5 j4 q; \6 }
. {8 C" h6 ]' D' O* ~
8 b+ |; W' ?% Y6 H8 [( \& o9 W 图10( k' ^; h( v3 d. _& U, D
15:14位:保留不使用;
9 }& W2 T+ v3 C) ?. r' f 12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;& ^ d+ |- S! d6 Z$ b* s/ s c
11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;
+ C' A0 K9 l0 M" Q) l 10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;
+ z f: e( U9 N5 B 9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;$ K# J$ @$ O2 J( `. i, E. ~$ b
8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;
( d; _ s9 u7 _( x- p& j! Z! f 7:6位:保留不使用;
4 A. I0 O- R* f$ P# s' D# v; N 4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;
8 { G, \. q, ^2 d, N# e 3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;+ _1 e% x) B% a" a
2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;
( `: q L0 X. K C( ^ 1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
% V2 h( ~; o/ y% h3 A- u! r 0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;
& ~5 D2 v4 [* U! f. I. | 注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。
; r9 Q8 H7 a4 b* x2 x 2.2.9 键盘中断源选择寄存器0
0 a1 [9 d, N. G. x8 Q, }1 N5 U
2 w) M! o/ Q* j% w7 u; ?9 H/ L
' b+ A+ H3 ?5 f2 ~7 ` 图11
+ V: m, H4 R( } 15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;. ]( a$ n9 r; ]" B* M
14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;1 E8 k5 E1 j& J) |) \2 n8 x
13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;- U3 J! k% O/ Z! \) v+ f. z
7位:使能P07产生键盘中断;, ?) G9 ?# t, e0 T9 s3 @9 W
6位:使能P06产生键盘中断;! J) E: V J, R9 |9 Y5 v% K
5位:使能P05产生键盘中断;# W% O2 J9 ~( f6 C
4位:使能P04产生键盘中断;8 @1 A1 A8 R$ x2 @" ^5 J
3位:使能P03产生键盘中断;
% z# P3 U$ s5 s) W. Y1 w 2位:使能P02产生键盘中断;
* V. {: `8 Q* m6 B. ` 1位:使能P01产生键盘中断;
( P7 {: r9 g) P7 s 0位:使能P00产生键盘中断。
* a! u( g% Y+ b4 E, d& n1 [ 2.2.10 键盘中断源选择寄存器12 t% \5 K& ]+ l, A( ?# }
2 k C5 n9 t3 ^- b" P
$ I% ^7 g2 ^9 l/ S- L+ g 图12
7 e& w/ ~7 j. A$ n 15位:使能P15产生键盘中断;- |; [" L7 t- y; I5 `
14位:使能P14产生键盘中断;
6 K1 y# m7 I0 ?, K2 X+ N% i8 L 13位:使能P13产生键盘中断;
5 k5 h! a: H8 h9 V* g 12位:使能P12产生键盘中断;! c( E1 b: y! R7 }' _3 d
11位:使能P11产生键盘中断;
0 G2 @% k5 p7 ~. Y 10位:使能P10产生键盘中断;* u k4 v, x$ ?: l
9位:使能P29产生键盘中断;# E9 O( l3 C5 J. U4 `1 l; X
8位:使能P28产生键盘中断。4 t8 I; f+ {9 E6 H
7位:使能P27产生键盘中断;2 K" O2 e; h4 X0 d& i
6位:使能P26产生键盘中断;4 l* I( G: k) S# q% h
5位:使能P25产生键盘中断;& K+ p! W- x0 K) r
4位:使能P24产生键盘中断;. a9 v5 R: G% z2 W, E$ D$ f; D
3位:使能P23产生键盘中断;# B* }) g6 m) X P8 O* d9 A, @
2位:使能P22产生键盘中断;
* }5 h: ^, s% X* ~ 1位:使能P21产生键盘中断;2 i1 Q/ S* r7 Y2 T. I* w5 ?: ?- d
0位:使能P20产生键盘中断。/ C a9 v, K$ H1 b8 C* e( w
2.2.11 键盘中断源选择寄存器2
6 b& K" Z4 e- U+ o6 D L
- O& D$ Z7 q/ ]8 J+ y. k+ i, ?4 Z% G
( s1 i4 q- s+ c) P6 }6 L1 f
图13& r/ v; Q0 i/ [8 L F8 m
7位:使能P37产生键盘中断;
: d# y2 r3 y% ^) d* E 6位:使能P36产生键盘中断;
/ l9 V6 x1 G- z+ l( y3 |+ Z( l 5位:使能P35产生键盘中断;
2 |! H7 z! }7 B. V1 c' E7 P 4位:使能P34产生键盘中断;0 ^- F, h) ]) Q
3位:使能P33产生键盘中断;; d1 c( a' W& `- X! \* w
2位:使能P32产生键盘中断;
* U; ^1 f2 {8 H P+ F* u- m7 A 1位:使能P31产生键盘中断;
& s2 N$ w$ w% v+ p4 }# w 0位:使能P30产生键盘中断。
) J3 a% H9 h8 C; J 2.3 寄存器配置讲解: M# q' _$ p+ ~5 y: ]$ g
#define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
7 W, {2 }6 D& g f0 ^0 D t #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402)
1 R' A; {' k2 T0 S% p# Z$ M* v #define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)
4 b( y1 `1 |6 L' k: q; |$ F7 a #define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406)4 \- b; w2 b; O, M# g h
#define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408)5 K: _/ y; h1 E% [/ Y* x; n
#define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C)
8 L: D( l6 ~3 F5 ` #define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)
& m0 v" S$ p/ |2 ? y* n5 l #define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)
) X3 Z* _- J' o8 Q, @ #define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412)
. v6 Z: o o+ Q+ K1 q #define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414)
) b% D' u P# N, }- l+ D #define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416)* S& y$ H" d1 F, `1 j% G1 W
例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:3 N' ?3 a6 I7 `) ~) w
GPIO_IRQ1_IN_SEL_REG =0x0003;
4 [' `0 a) h8 j2 t P GPIO_DEBOUNCE_REG =0x0114;# {, a3 d& Y, e- J+ N% c A& a
GPIO_INT_LEVEL_CTRL_REG =0x0202;# B1 O9 B; r, \+ V' k" n3 R; ?
GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。0 M8 d1 n* D: C0 g
例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:
$ c0 R" |4 a* i5 Z0 B% Q* U; @8 v KBRD_IRQ_IN_SEL0_REG =0x4008; u, ]( Z. B+ `; w
KBRD_IRQ_IN_SEL1_REG =0x1100;
, J' y8 N- c' x" b# j9 _ GPIO_DEBOUNCE_REG =0x201e;
% a" ^ o; N, O% f 键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。$ E/ p: _1 J4 a* I r8 T; U# o A
9 c" F! Z( U5 m- ~6 \$ T& E/ a' g0 f7 J& L' d7 ?9 T' o
第三节 中断实验( E: @2 @# N; z! i) M
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。% D+ y; T) ]& J/ P% c( ]
使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:1 ]# F8 {" g/ }+ V/ B
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
! |6 C) i, l/ i+ U# c) }. ?+ `4 ^% M4 s$ @+ a
* i e' y* |1 r 图14
% ?0 k. F1 e( t& [' i# d# Q (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:, b0 |, v, o: C- T0 X4 u! ^) @
- k) w0 S, o) _) f5 b( W" k4 J
. \$ Q3 d' D9 W0 @7 A, u6 e4 R 图159 o! U- U6 e9 U& ]0 L/ ^' \8 `% R, o
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。/ r- U8 q" O9 K
打开中断实验的Keil工程blinky.uvproj,位于目录:3 ? s! _' q9 W3 X- a5 ^; P- a
..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:
. K) P0 `, U1 n3 a8 E9 [% _- Z9 u5 a# d& C; J
+ _7 d- m5 {3 h& f2 X
图16
# {+ r% l" ~; {' D* q. U 在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:
7 n' a! G* ^. R; h/ v9 m
& ~: e/ }0 u9 z2 T0 D0 n( m3 f
X) S X% T! P4 b8 B( H) S
( ]+ V a2 ^0 r' V% F z1 ]+ I
: |8 ~( ~3 V! A) m6 p9 V4 q8 N 图17
' f0 N( Z5 O# s5 M 全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。
: v# I8 [7 a% d% C, w0 N" F( }( K8 _% |1 ~& T& P4 S( d4 ` n
$ h6 t6 c+ [3 {. H
6 o' X5 b8 U6 w. V5 |6 w: D 配套资料:http://www.fengke.club 7 h' }) O' c ], h. ~
套件地址:http://shop115904315.taobao.com/5 d1 l& o3 _0 w7 u
文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 0)
5 U. O4 K3 j$ L/ J" e# ]
9 L, p- X' z+ O% E4 o) B
0 `$ q' m. N- }
|
|