|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
中断实验教程 ——疯壳·开发板系列 * A- ?6 C% X" X3 @/ I
7 H- P1 C/ M6 ~2 ~# V0 o
4 L# b6 J& w- o7 z; @+ `' x" e 图1! w: K! W# H$ [4 }3 |) J( I
* r$ K1 ~9 j* ~( j! u 第一节中断硬件电路- N3 W w* Y1 k$ W' |
将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:
( K( ~1 e3 y7 C% Y* b9 a& `3 e# h f+ k+ H1 S
+ a9 W g$ E: E% d, ?
4 A# o+ A8 b+ p% C 图2
) e1 _# @$ i5 k" ]5 e& e. m J: c1 C4 }' Y0 }. f
3 J `) j& ]" A* P 第二节 中断
# k0 J+ ~# L4 x3 g8 ~1 d 2.1 中断介绍
* r- ]0 ~4 v {& y' ~$ \ 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。
) T9 [8 N; g ?3 M( k v" z DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。
/ ~& U( A- F z 2.2 寄存器介绍
9 H* g0 t* Y5 ? 2.2.1 GPIO_IRQ0中断源选择寄存器
2 W+ y; ^" J1 e- X# y+ c7 q8 f/ a' q" Q: h; A/ d. Z- j1 |4 b
, {5 d" l1 Q% H, U3 p
, c) z- E" R( w( h# `6 ? 图3! e5 S& t- j" ^
15:6位:保留不使用;9 Y. `1 S" G* D3 m0 u8 N- V) x
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;8 c+ S/ C2 f6 R# E! p
2.2.2 GPIO_IRQ1中断源选择寄存器
9 g% x" z# K& o2 a! _7 B6 ?$ g
/ L9 _( ^4 h4 s8 K8 i" L: Y
- b5 v( C2 p! [0 J 图4
* S6 r# W9 ^2 c* i* T3 f 15:6位:保留不使用;6 W2 r( T% Q, `* K8 Q
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;2 @: p4 V! V; _" a: V- }
2.2.3 GPIO_IRQ2中断源选择寄存器% R" W1 i/ h1 Y& `3 [( F( c
c; A) b" }, Z7 i: F4 }
7 V5 [. f+ X4 V
图56 t: ^( Y9 z) V. z$ L8 `5 A! G
15:6位:保留不使用;
2 }& k: Y$ _ W" @ 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
0 g: C0 _4 J* O, r 4.2.4 GPIO_IRQ3中断源选择寄存器" G3 d7 q' e& z9 u4 B
) F' U; p" u- l3 S/ K
! x3 W. j- F8 G
图6
( c+ O' L+ g9 m$ R1 C9 h: ] 15:6位:保留不使用;0 D, {8 o( n& D0 Q9 f) c; ^
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;* |* b0 Y" p- C
2.2.5 GPIO_IRQ4中断源选择寄存器
# v8 i8 _8 s2 E1 S; b
- M* W/ h6 ~0 w- J
0 N: R9 }# q9 P% m1 A. T
图78 C8 F7 o/ r% [" j2 y5 }0 k( @( _
5:6位:保留不使用;
4 ^. a- W0 |/ ^) c) } 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
* s y1 q: Z4 d 2.2.6 GPIO延时寄存器
. M% s$ {& Z# @1 J. S3 u, o( u5 `+ n
# {' H$ C2 n, \ z+ ?
图8. d! [/ D+ A D; q1 G' B$ U( B
15:14位:保留不使用;
- R6 T# F8 y( H 13位:使能键盘接口延时计数;
, @4 `. ^. W2 ~ 12位:使能GPIO IRQ4延时计数;
& w0 R' v s d 11位:使能GPIO IRQ3延时计数;7 A3 x' p+ b# f: c
10位:使能GPIO IRQ2延时计数;7 W+ n, C1 h6 B
9位:使能GPIO IRQ1延时计数;
+ U" y7 L1 u# v& K1 {5 f' x! I 8位:使能GPIO IRQ0延时计数;9 f* P! s- H* k0 z
7:6位:保留不使用;
- y: u: q/ w- Z9 A' C 5:0位:延时值,为N毫秒。% [4 ?( y' Q' O6 J; |9 ]' A9 m
2.2.7 GPIO中断复位寄存器
' k7 W3 k: J* Y' W! ?1 s! Z4 N7 ?8 @* u4 ]' x+ L& V0 W( b
I0 k+ ^0 g" I6 D% Z* g2 A) g
图9$ C% F) v( q9 k0 [1 W; M) k
15:6位:保留不使用;
1 P0 A4 t, H } 5位:对该位写1,则复位KBRD中断,读取返回0;
T0 h G# H+ R" m. Z% d6 S 4位:对该位写1,则复位GPIO4中断,读取返回0;
0 g5 r' |) u. K: }- N 3位:对该位写1,则复位GPIO3中断,读取返回0;
% T0 q) |3 L8 x0 D+ x l) K 4位:对该位写1,则复位GPIO2中断,读取返回0;
3 @& j5 w( k% B4 \$ |! u, G 1位:对该位写1,则复位GPIO1中断,读取返回0;( p# x; R* u/ H I
0位:对该位写1,则复位GPIO0中断,读取返回0。- G# X. Z3 w/ u' [+ R/ D, m, ^: D& Z
2.2.8 GPIO中断电平控制寄存器
) c: N( u7 B7 l6 ^' E1 ]! z1 z/ l# n8 r; Y
3 L; L V( C! D/ M: n& r
: R6 `" a* v) S
图106 A ]& `& t$ ]2 e- n
15:14位:保留不使用;! k0 \2 G) I' T; `
12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;( ~; h; H( p# g& N Y6 M0 G6 V
11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;! J" G8 G! {: m/ S+ [
10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;
% Q" |% m& x ~6 C7 N( \0 S 9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;
; o5 h6 y3 }9 Z) | 8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;
; l, R, ~1 p7 ~; } 7:6位:保留不使用;5 F) K, | d% Z9 o% }% ?, c. { D
4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;1 }) G) h0 t" v
3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;
+ E4 t9 X+ N) e \* h) O; j* P 2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;
4 ]5 y+ O' \7 _3 j 1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
( `+ s7 U! v5 a- H" P 0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;# u$ w' z: [& p$ H
注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。" @8 y' J1 i+ l+ ^4 {
2.2.9 键盘中断源选择寄存器0; H0 U2 p8 j' X* Y5 f% y
! d! @5 n' B% l$ M
' p0 v, t; Y1 Q 图11
/ b! t) E% p4 k 15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;& q! l" ?8 L! A8 G
14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;2 r2 u) O+ X8 ?+ w' v9 Z8 O" L+ \
13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;6 [5 w8 V5 V7 ^6 ^5 [! t
7位:使能P07产生键盘中断;
$ ?4 a% z# M- U. W0 ~: T 6位:使能P06产生键盘中断;/ \3 p6 w4 ~0 N' y
5位:使能P05产生键盘中断;. o' T9 [ B" t: \4 U. W$ X
4位:使能P04产生键盘中断;
+ N$ B" j R5 h* {0 @- V% F 3位:使能P03产生键盘中断;
( m3 Q$ B3 x/ p: A; Y2 `4 G 2位:使能P02产生键盘中断;$ {! F4 Q) K! `' g" Y& ]# O
1位:使能P01产生键盘中断;& }3 r7 B6 T3 s, R
0位:使能P00产生键盘中断。
0 X9 j; X% a9 }9 { 2.2.10 键盘中断源选择寄存器1
2 J. p) F) Q' {3 U0 e
; F7 T- k+ ]( M3 f8 [8 C) y* U
8 ^: H) m P# d' S. I3 A 图12
$ m/ O8 `5 c& `0 u0 f7 P) B 15位:使能P15产生键盘中断;
7 Q5 p, W; x- h. l5 J- ~ 14位:使能P14产生键盘中断;
% M3 w& U6 S, {. t" z+ s 13位:使能P13产生键盘中断;
, N. z% s+ o: s% @1 O9 Q 12位:使能P12产生键盘中断;6 E: U7 N, H+ C
11位:使能P11产生键盘中断;4 ?, N2 p; I8 b g; q5 l2 l* D
10位:使能P10产生键盘中断;) q* ^% U- d( v% P# s5 R
9位:使能P29产生键盘中断;& b2 `+ N& Q$ }& t
8位:使能P28产生键盘中断。4 h* V: K9 d/ }( H( w
7位:使能P27产生键盘中断;
; M4 r! c/ ]. w) o% J 6位:使能P26产生键盘中断;
" [% n+ W6 M# G2 p8 @& a 5位:使能P25产生键盘中断;" V: `" g5 u) I6 |) w! a: J
4位:使能P24产生键盘中断;/ B+ E' x; a* S$ X4 ~3 B
3位:使能P23产生键盘中断;
! C+ R. a0 M% ]5 [. r/ i5 R7 z7 A/ v 2位:使能P22产生键盘中断;, F8 D, e$ \, ~% ^
1位:使能P21产生键盘中断;
% a' }7 `, W T- u/ B! c; q 0位:使能P20产生键盘中断。
9 {' H7 s5 C/ u 2.2.11 键盘中断源选择寄存器2
/ Z& K1 G1 O3 o8 P0 h, c Q
9 a! @5 y5 W. e0 e8 j; H3 g
* h; B0 h9 k! ^, ]: `; K 图13
/ N% n0 L5 H. S* U+ I 7位:使能P37产生键盘中断;
) v; [, F: K) t# K5 [ 6位:使能P36产生键盘中断;/ i# |3 X7 f( f1 }
5位:使能P35产生键盘中断;
6 n' Y6 j) n' e 4位:使能P34产生键盘中断;: p# L/ O" b3 W- e: |0 u! S
3位:使能P33产生键盘中断;* x) s' f8 A* N4 G
2位:使能P32产生键盘中断;
5 Z& F& ~, ~" L& i; f$ W# V/ f: c 1位:使能P31产生键盘中断;
2 I' V! k: e9 u+ L- \8 L+ l 0位:使能P30产生键盘中断。
R0 U3 P' J' p7 i" T3 |+ y 2.3 寄存器配置讲解
7 P2 X* r6 S$ @5 A/ ^! E" X9 z #define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
! A9 Q5 J$ M G" _0 u3 Q) f #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402)6 l2 n. N2 I Q& A2 K" X" v
#define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)* I8 p' Y5 l$ q+ c: u, L% `/ ^
#define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406)
6 H% m9 S* v% b/ e% @( q #define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408)
: ]/ z& P8 Y. P #define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C)8 X' c3 O1 G/ f* r
#define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)
, N4 d q7 e& T4 ~) W: d- [# q/ j #define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)
8 {( k: u: [* g$ U: W #define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412)3 y6 {2 h. y6 d6 q. ^ {8 @
#define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414)4 P$ n; m# _1 N. {& v) U
#define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416): x1 J7 G0 I" j+ g8 i$ p4 q$ G4 |
例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:" d! e O% e9 C a3 R2 F
GPIO_IRQ1_IN_SEL_REG =0x0003;
8 o2 V( S/ ] Z- R8 e GPIO_DEBOUNCE_REG =0x0114;- T! @ P; p. R/ ~; J
GPIO_INT_LEVEL_CTRL_REG =0x0202;8 ?/ R6 V& L1 G4 s$ H
GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。
( N) \% h1 ?- r, n6 D& S. l4 C 例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:
N H3 }: d+ w" _ KBRD_IRQ_IN_SEL0_REG =0x4008;% r8 Z/ D; S: l( k0 w# X0 M
KBRD_IRQ_IN_SEL1_REG =0x1100;
9 n4 l# j! B' \7 K GPIO_DEBOUNCE_REG =0x201e;+ D- A- \( p1 O& T9 H+ y* l
键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。
) f/ c% f1 Z3 d" ?, f/ ?7 r/ Y* u3 d* d5 }7 v+ R) [( f3 D; e
- j$ X# N/ E% }+ ?& f 第三节 中断实验2 d3 _3 ?1 k$ V! T- S
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。 I) J e D9 h1 l$ n" w
使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:) V! H' D6 H& Y/ [, ~$ y
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:4 {- W* }) T& h, Y6 _7 |
2 ], W$ ^% }) b
" f- H; x+ ?2 ?( u& P7 U O
图14
3 E9 A" M5 p& ^4 M8 M (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:) T( k4 g0 I2 U- H' m
X; o# b( b9 l2 m# Q5 ^
) a! _1 L% l5 i7 R
图15! o. T' m! Y6 H; f' H
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。6 L4 j! Z) ~( P" J9 d1 l+ J* Q, S
打开中断实验的Keil工程blinky.uvproj,位于目录:
! K' F! m9 c2 m, A' M4 R. I ..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:; _. F1 G' a- J) f
+ h1 G# G* Y$ p! R
5 B5 U R7 ` |# S7 l 图16" h1 Y! b5 {+ |
在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:6 k: w: v0 I- E+ j& U
/ p( | k" x# R# I
. s; d3 x/ x8 i) d9 p% c! |1 Z- z! Z! ?+ R# ?# h, ^" A8 v
$ k) U9 M: W3 _% q& J3 s( D6 Q% ^) e 图17
* R2 s/ _7 F% O 全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。 s4 i4 _0 x4 H( d' ]2 I6 q
; [9 I) w+ C- w& |5 u8 d- l e/ I
+ |9 C6 A4 V3 F) I6 ~
% N( X, Y7 [0 ~* j2 }8 j 配套资料:http://www.fengke.club ( X6 N9 D$ w& @5 I& Q; T U0 L
套件地址:http://shop115904315.taobao.com/
$ P8 C! F3 `- Z v3 g/ ^7 k1 c 文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 0)
2 X6 \ ~2 K2 c# e$ N" [0 R6 R
, W& N0 g% s) ?7 |# N( Q
- }9 m3 ]1 x1 Q- N8 W& f6 M |
|