|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
中断实验教程 ——疯壳·开发板系列
4 N! |. [ C9 E2 w+ k& |0 e4 ^3 t) \+ z6 B6 `5 h( [
% [0 q3 @3 n% J9 c2 {' L" D! H 图1
* U D% C1 ^9 j6 A# Z5 K4 D; X2 M4 X
8 @/ c( c0 U9 v! u' H/ K6 n% D 第一节中断硬件电路
+ w/ N# ?- q* E6 {1 ~+ p 将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:
6 c. e8 f# ?4 {. J7 O: s& ^7 o7 U, h; e" j. }
9 g0 f& N& n# W1 c
! S+ I. A% F2 f b 图2. z# @5 o' R. Z7 W7 _: V
' N; t; }' F# g% c5 T* ]. [5 j6 F, ~' L7 ?
第二节 中断5 \' O; ~5 i: ^0 c5 w$ ?9 G
2.1 中断介绍
?7 x% }4 n) w7 [ 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。
0 x0 {3 n( B7 |3 J( ?* P6 D DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。
' A# q! a. f9 B& [: U 2.2 寄存器介绍
7 j8 h M; q4 k; X. w q4 N 2.2.1 GPIO_IRQ0中断源选择寄存器
9 s3 t: |! u2 d5 O+ G9 g5 v" K' X ]: z. D
" p/ l2 N2 ?( A- W# X
# o* z% ?! o+ Z' b9 L/ r7 B 图3
: \) u; ]5 ^: K! i0 ~0 B 15:6位:保留不使用;( C7 b: l$ X T' U, q! {! ]" Z( F
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
0 o% t7 S) V# Z- t Z 2.2.2 GPIO_IRQ1中断源选择寄存器7 }) V! u5 ]; ]9 L3 I$ G( r2 B
( d8 e; P5 v( j) _' o' s! R
9 {2 l! X1 u" W# x3 D
图4
) x3 g' Q: o1 a1 } 15:6位:保留不使用;0 y+ O+ F! Z0 ^1 Y/ h$ ~8 j
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;! x: |( {& o4 Z: u$ T
2.2.3 GPIO_IRQ2中断源选择寄存器
" Y- X2 }- n+ N1 t6 Z7 y8 K) T1 Q3 I
) C1 K) [2 v3 O. C 图5" L& Y- e- M7 |' t* ]
15:6位:保留不使用;2 e2 G6 _9 u t3 |
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
! t d7 S. e4 Z) A ] 4.2.4 GPIO_IRQ3中断源选择寄存器3 |# Z7 u. r' @# a
. u" N" T; |) m5 l$ d, J
' M6 |) {/ i% Q9 [7 x 图6
2 y4 I- w& w, O6 T 15:6位:保留不使用;! X$ F. X6 x+ h. z
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
1 ?6 y+ a7 v3 K- }' U! P/ m7 F 2.2.5 GPIO_IRQ4中断源选择寄存器
# K7 X0 M6 |% l: q: F8 \% j0 h* Z( \
* l% V3 K. V1 Z0 ~ 图7" {6 y6 x/ E1 {$ `! X" R
5:6位:保留不使用;
5 R7 C- b. g: ^6 D7 X! W' n 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;8 t& A7 b8 x: D
2.2.6 GPIO延时寄存器
8 H% v, V% {" ?% L2 l& k% X# W2 O" x- f" ~. M H; w# p
! P" |1 f5 e- x7 H( K( s3 b
图8
% a! L! L4 U; O$ f: W) i 15:14位:保留不使用;
" H, V& G8 z: D) J9 L; l6 E% \ 13位:使能键盘接口延时计数;4 K# D9 O* w* N c! Y: f9 j
12位:使能GPIO IRQ4延时计数;& j* ~6 [* {5 R
11位:使能GPIO IRQ3延时计数;
: S9 B J! \4 ], j- l1 Q 10位:使能GPIO IRQ2延时计数;; E" [$ t# n' t& o
9位:使能GPIO IRQ1延时计数;# ?/ a& p% l* m
8位:使能GPIO IRQ0延时计数;
: ]/ z3 [' ?9 v o' F 7:6位:保留不使用;/ U* D" L0 t( t# |( W' p$ _$ X+ U
5:0位:延时值,为N毫秒。, H$ P0 `+ A+ W
2.2.7 GPIO中断复位寄存器
, Y; _# _" a& {0 O1 `# m9 A" x! y& W: ^) h% c. S7 D6 G! M
$ ~. Y3 j* ^4 {, y' u 图9" k4 _9 l- A5 v2 U: C5 R9 G
15:6位:保留不使用;
9 Y! q) h& O; s! T 5位:对该位写1,则复位KBRD中断,读取返回0;5 E9 t: G- Q7 x4 P0 e# v/ F$ L
4位:对该位写1,则复位GPIO4中断,读取返回0;$ P9 ^& J6 J4 @2 A9 b
3位:对该位写1,则复位GPIO3中断,读取返回0;
; r! d2 h) U5 }2 ?1 ]0 x7 s 4位:对该位写1,则复位GPIO2中断,读取返回0;' f: B/ y: b% _- r. t: Q
1位:对该位写1,则复位GPIO1中断,读取返回0;
, A3 A/ h. e8 t5 \ 0位:对该位写1,则复位GPIO0中断,读取返回0。) T5 T. o) _, ?, d
2.2.8 GPIO中断电平控制寄存器
+ Z) u9 g1 v# \+ n; R3 C5 H9 n% @
: J1 O, D, C3 Z7 N- c X9 T2 P# f, C
u: S( l$ Y- k* n; L" f L
$ K. }' `2 s& _- N
图10. n! i8 Z' S1 {" P4 P
15:14位:保留不使用;
. k7 S7 M; f8 Z9 ?- `0 Y$ U 12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;' D6 x' ]0 b& H# [0 v
11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;& }6 ~2 k' H; S
10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;
) f6 |4 P3 Z. j1 D 9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;0 V* |% u5 [7 Z5 Z+ u
8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;
. J& i) w _/ D4 I 7:6位:保留不使用;8 B( F, G+ P+ e0 \) \
4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;) |* f5 N7 ?8 i2 {; P% }1 C N
3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;
b8 Q) o0 ]0 C$ P6 S 2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;' Z* t+ X9 V; |% }8 X
1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
7 t/ ]+ J, U: i; d 0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;
3 F {- q; L$ X2 C$ n1 ` 注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。% {. {1 E3 N: J! j+ m3 H
2.2.9 键盘中断源选择寄存器0
+ H5 [' Q r; L' o6 s0 ]8 [4 [ r6 q- s! H
0 \6 Q* e; ]6 O. J+ A2 e. T
图11+ K2 N. j' A* m! m. S
15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;/ v7 F i+ W. o) Y7 V4 V
14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;
' ]6 u, M5 f4 Y6 I) n 13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;
/ y: V. f+ N3 o2 ?0 Z3 [ 7位:使能P07产生键盘中断;
* a/ y% G& h; J- z 6位:使能P06产生键盘中断;* C! ?1 X3 p( R" z# g u
5位:使能P05产生键盘中断;
# I/ @# ^" S- Y* U 4位:使能P04产生键盘中断;6 G! A9 _/ Z, k* ~; L
3位:使能P03产生键盘中断;
0 l( k5 c( }. X 2位:使能P02产生键盘中断;* I; V2 l( A" X0 O0 N
1位:使能P01产生键盘中断;
3 W$ |7 q4 h( P 0位:使能P00产生键盘中断。
3 E& k1 @! l1 ~: i5 n 2.2.10 键盘中断源选择寄存器1
9 s/ t7 X, n" I. A' O3 s N* ^3 f4 _6 I" W* ~% W3 h8 V" t
3 R# h4 j$ V' n! K$ v 图12! `, g" Z7 ~7 Q- v' s/ u) g# F
15位:使能P15产生键盘中断;3 F6 [: M( E* I7 X3 w3 ~1 E6 o
14位:使能P14产生键盘中断;# w# o6 ]" M0 G8 h" ]( [3 x. h$ D
13位:使能P13产生键盘中断;
7 _& F/ I, u( L5 C/ M2 L3 F) z 12位:使能P12产生键盘中断;
8 O* f0 Q, T5 V 11位:使能P11产生键盘中断;& z8 v: n! B3 Y& l" D' ^
10位:使能P10产生键盘中断;
* ^+ k# D; B; V+ z8 q+ Q* O0 F* F 9位:使能P29产生键盘中断;
8 q K/ B; g5 R) ]5 k4 l+ v 8位:使能P28产生键盘中断。$ I* @. u+ H8 A. C# K
7位:使能P27产生键盘中断;
& o4 t; F& f: }; o/ i 6位:使能P26产生键盘中断;8 G/ }4 P! A* x
5位:使能P25产生键盘中断;( l8 A0 u- {! J. y
4位:使能P24产生键盘中断;- ^- e9 }) V$ m7 g# o7 [/ \ Q# x
3位:使能P23产生键盘中断;
% W/ o: P% b) R. d8 z 2位:使能P22产生键盘中断;, A% P0 ]: x" k3 y: c8 L
1位:使能P21产生键盘中断;
' y# W! P9 f7 ?1 R/ ^# t 0位:使能P20产生键盘中断。
$ F8 J! \1 ?! N x 2.2.11 键盘中断源选择寄存器2
+ e& D4 ]# @5 V7 Q8 k: S
6 a$ @0 `6 e& c
7 |9 D1 l: ^' W+ x. J7 N 图13! P# Y: a: r6 g5 }+ e3 I0 j
7位:使能P37产生键盘中断;
/ ?. }, Z$ M7 [' F 6位:使能P36产生键盘中断;$ [: x! w$ Q' |& N2 w
5位:使能P35产生键盘中断;
2 C, |. w1 i$ D0 d( P5 q 4位:使能P34产生键盘中断;
8 I# \7 t; y( | 3位:使能P33产生键盘中断;
$ E- I) b/ S* B0 s 2位:使能P32产生键盘中断;4 o6 C. R3 S& p+ v) G2 d! O
1位:使能P31产生键盘中断;
3 ?1 g+ x% a- q1 [0 @ 0位:使能P30产生键盘中断。% r$ ~7 P& @0 D; c9 R2 P/ N8 J
2.3 寄存器配置讲解* h; R* d7 o" L d+ g& ~2 u
#define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
% |7 _5 N9 z( [2 k, O8 u5 b" k9 ? #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402)) ~ Z9 @' g! T: ~' T
#define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)
6 G; `3 n* D; ^$ n% D #define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406)0 j5 m8 w3 w/ Z( k- ?2 s* U5 W
#define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408); ]( h) P2 o2 y( K
#define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C)3 a6 D# M' P" X( t( g+ `" A. Z
#define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)8 a; Q* @1 z) H% |$ W' C2 {1 _
#define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)
6 V: d, A* U5 G$ Q% i7 N #define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412)- {! O1 t$ z' @5 t" K7 {4 R6 M( G
#define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414) ]5 m! ]; c# A7 @8 R, \) ]
#define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416)
/ U; O1 O/ r7 z2 ?. H 例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:
# u2 j3 `9 O4 X+ e GPIO_IRQ1_IN_SEL_REG =0x0003;) s: h7 t! E2 f# ]
GPIO_DEBOUNCE_REG =0x0114;
k# a8 x# j) j, s8 o* M* ~) W GPIO_INT_LEVEL_CTRL_REG =0x0202;
7 F' C* H k7 s3 D0 K2 x B GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。
" y, V. A, Q# p; G4 E: I 例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:
& ?8 N' u7 S1 J- ~, e. l- b9 n KBRD_IRQ_IN_SEL0_REG =0x4008;
( ^9 `2 S" a: r* m9 M KBRD_IRQ_IN_SEL1_REG =0x1100;
9 k- n! W8 D% _ GPIO_DEBOUNCE_REG =0x201e; r6 S9 ]% ^) o/ C* T9 I4 _; K( w
键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。
- p+ v/ ^# H6 q9 z& z2 X' ?) K+ q. h' I+ P" {( a
1 \/ M9 d) Q6 h: H5 P
第三节 中断实验; F" E+ w' }) t2 i+ l! ^
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。4 ~) L/ V2 l. c: G
使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:8 m( l; ^4 F/ O$ r1 d- j
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
3 U7 `; d, F7 q& p$ [! |3 F3 q: n8 u4 ^9 F% D) Z
1 [8 x8 u- a" M2 s3 w2 P+ Y
图14
3 e& Z0 S* ?1 h/ i: z5 J- V7 h (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
4 y1 M5 B v: q" b
+ @4 i! o. \7 N7 O1 N
3 W% |3 g3 q4 `4 v5 r6 s" @9 z 图15. g; f s( x8 T' v6 R
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
* Y) P# L: j- q |0 E 打开中断实验的Keil工程blinky.uvproj,位于目录:
. P4 B0 D% H C, k ..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:5 U6 X' r! d, N' Q* F
$ o8 H1 a7 E4 m4 @
$ Q, @9 r; j5 H$ y
图16
4 m- A. R" [; X/ ` 在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:
# u _# @4 o2 v$ ?* T
" u% a# }. e2 E4 Q9 D) I2 n9 K: E" C) Z
, D1 t* {! m! _
+ o: I% n: ~2 [& h+ L) t% D
* B5 O8 ~6 D' o4 @
图17
. ]7 i# Y0 e, M 全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。
5 D+ c! q) Y& ^$ c% f* p9 V/ m3 E( H5 v, ^% h( p: P1 O- V, X) E" j' V
- X# V8 ?/ ]9 u, U$ d6 } c
$ l3 O9 X; H P
配套资料:http://www.fengke.club , D- r3 {( w* T4 [2 ?' j2 F/ {4 k
套件地址:http://shop115904315.taobao.com/: E/ Y3 t8 n- l2 e6 Y
文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 0)
U( b# z9 N3 T! ~ P& v
% D9 P4 W1 K j" g9 z! D
( s/ d7 t- m6 A2 O |
|