|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
中断实验教程 ——疯壳·开发板系列
+ {/ d+ y$ G; J7 @; F z9 L: ^' R0 N8 _+ d
1 v$ ]- l0 V3 ^( j8 v( x4 p4 D0 g
图1
5 e) ]9 Y: L6 x: A4 A& @" ]5 s# S' n# j6 X+ a$ v
第一节中断硬件电路
. f& N$ Z1 k+ S 将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:
% M) F# e- v0 k) Q8 o, G; d) g8 K \0 U( f. G
1 A( E5 O n2 _! |# f
: [' t7 C* ~1 u6 U) ^: p
图2
- J1 Z! p3 ?5 W6 b( n |! g, _5 j4 Q. W. V5 o; ^
( B( d: Y3 j: l, m
第二节 中断
% K; {& G" v3 j: l 2.1 中断介绍
6 B' [! H$ N8 t( N: Z 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。* M$ i4 F& T- b; P, X( a4 Q2 U" D
DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。# w# ]+ i3 P8 a/ a
2.2 寄存器介绍 ~6 X$ ]! E8 _1 ^8 y
2.2.1 GPIO_IRQ0中断源选择寄存器
, E4 j; k/ k5 B( \9 H# n
6 w9 Y% }7 }+ r8 o4 k# x
3 d) }& @2 H) j* @7 |* x0 v
" Q! U8 Y) Z- A- q+ ^ ~
图3
; }7 P i, j2 y. E. D ~1 n) M9 \ 15:6位:保留不使用;
+ x( |& L; D, k$ i 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
6 V2 p. b& @8 X5 ?" F" \1 _ 2.2.2 GPIO_IRQ1中断源选择寄存器, H) U) H, D1 _5 s, X) w0 V; J. z
6 D; q; F# X' u& U5 R
; ^- z: _' t# l) e H4 o& l
图48 R# c o9 b$ Z9 Y# [$ u! W
15:6位:保留不使用;% e& G0 R8 T7 Y
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
, G* B. p. {" r* t3 f 2.2.3 GPIO_IRQ2中断源选择寄存器
" t, n) k) p6 J! b8 o
, C) d# x8 ]; e) K4 }
( C1 R6 [& I" S/ ~8 X5 W0 c) a: g
图5; I) d, T! d/ w: ?
15:6位:保留不使用;
% u- j2 {, Q; c- X# \8 e 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
. p% H* a' N) o+ V) g4 C 4.2.4 GPIO_IRQ3中断源选择寄存器6 y3 G4 m' P$ F/ [' r5 p: g$ p
; K; L" M+ _8 A) N" M
: E& b% r+ H+ ^0 a C# u( o 图69 n. o) D2 x- Z) P$ a
15:6位:保留不使用;
0 [. s6 |# G0 |, O 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;$ `; a0 A i+ U v3 V# A# m+ ~
2.2.5 GPIO_IRQ4中断源选择寄存器. g: M1 @% y$ f- }
9 _3 P" ]4 D) y$ K3 W" [
6 N( u; U7 K5 k% N, J; v
图7
. x' o8 p# t" ^+ C. N% m3 r 5:6位:保留不使用;5 z. B3 H6 G: K
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
, q6 H, ]. U2 l, E* Z. e 2.2.6 GPIO延时寄存器0 o" G& z" g: P1 K6 X* u
" Q4 U: S: c8 q9 k4 g
* j$ j/ ]. E* E! q7 [7 `
图89 a5 Q! C4 v: C5 [* r
15:14位:保留不使用;
8 F+ H; Q. D* R' U6 u5 Y 13位:使能键盘接口延时计数; V f6 C& ^% o$ S
12位:使能GPIO IRQ4延时计数;* U6 f; O, H; J* u% v* o$ q
11位:使能GPIO IRQ3延时计数;+ m& h* P% a6 H, S, \
10位:使能GPIO IRQ2延时计数;
( l1 N$ K2 G- Z6 p+ R( I H 9位:使能GPIO IRQ1延时计数;
1 h9 T& L A, x: y1 M9 w5 y% y3 e 8位:使能GPIO IRQ0延时计数;8 {- Z6 G6 I- [9 I4 t
7:6位:保留不使用;0 M( ]; N- \, R# A% d$ v% L2 _* ?" K
5:0位:延时值,为N毫秒。) B/ K! `1 e: k/ P' P! u
2.2.7 GPIO中断复位寄存器! N. K H* ?; L
& e' u, a: W( x) G
1 V1 x& X# j- K" x, z& E: f/ V: p 图9
6 `( o9 {2 | R( q' f3 @8 @( O! p 15:6位:保留不使用;# c5 o( K6 O2 L. K
5位:对该位写1,则复位KBRD中断,读取返回0;
1 I5 x% [) {- m 4位:对该位写1,则复位GPIO4中断,读取返回0;% C' a, M& `, @! x; ^8 g. p
3位:对该位写1,则复位GPIO3中断,读取返回0;
% x, O% j5 \8 a7 a5 A% x 4位:对该位写1,则复位GPIO2中断,读取返回0;4 x" j* T* u* I- c% `* l
1位:对该位写1,则复位GPIO1中断,读取返回0;
* r) u" n- M4 O& x 0位:对该位写1,则复位GPIO0中断,读取返回0。
$ h# P# r+ B% Z( ~% y) } 2.2.8 GPIO中断电平控制寄存器4 N# C* e! Y5 i4 T. v
% f% i+ A5 X! d9 S- k
0 `# Z6 e8 @0 {2 J- _5 K( i
: p5 z i+ l1 j3 y1 z' |! @& d4 H 图10( J7 W/ b9 o3 q3 _; v1 w' c4 d
15:14位:保留不使用;
6 F5 D9 y, M6 q9 @" D 12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;
+ c+ W# l+ _( s8 C 11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;
% o6 p. R6 }' X! }9 h% W+ X 10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;, g* A& R+ T6 V
9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;9 o5 f% ]9 D c8 y6 ~9 d( h' q! _
8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;
/ w# g, ~. A" O T4 N Y 7:6位:保留不使用;6 r6 b3 B2 t% l
4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;" U Z8 Z0 U2 c
3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;
' |6 P+ v" B9 d( t 2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;
9 j9 o8 _& Q) Z- g+ T8 x, g+ @ 1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
( k4 L, }0 z- p8 h% m, H, y2 N0 h 0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;
6 h2 ?: n5 Q( n- c2 f* | 注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。
8 f- _. M- i# o/ A. u& W2 Z- W 2.2.9 键盘中断源选择寄存器0 l7 d" a. S/ g M |. u% k) e
0 s6 Z- \0 k" ^$ x
$ a6 V7 o* N6 J V" ` 图11
/ d7 M; F o K. n( ?/ R 15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;
4 _0 D. S* f8 ]/ P% G8 O 14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;
. s2 F+ ]: N8 _4 ? 13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;: V6 f+ e! W K/ s6 u
7位:使能P07产生键盘中断;
4 x: e$ x. u" _2 M+ \% G+ t 6位:使能P06产生键盘中断;
6 j1 M2 F9 b/ `& w( V 5位:使能P05产生键盘中断;
4 E$ X( X% o3 _- R W6 ^4 P0 K2 V 4位:使能P04产生键盘中断;
" k; f2 V$ H% K3 N1 }, U/ O 3位:使能P03产生键盘中断;
4 O5 u" X/ \* ^& O" g7 } R 2位:使能P02产生键盘中断;
3 [* }- y; Y$ u- K9 c) Q5 ? 1位:使能P01产生键盘中断;
4 W. K/ _) u0 e" K/ Z+ h/ a 0位:使能P00产生键盘中断。- W3 Q; n# z1 \
2.2.10 键盘中断源选择寄存器1# c8 l% d1 X& b8 x5 j% y
w- ]8 d: U, N! E ], E; }
& \" m; g/ d. i6 h$ K
图12
; \& N+ f$ P5 T+ v) H! c 15位:使能P15产生键盘中断;
$ Q# y+ n2 i1 G; G; q1 o+ X 14位:使能P14产生键盘中断;2 n( ^& J* F5 g; ~
13位:使能P13产生键盘中断;1 m( V" s4 e, C" h$ B/ q9 N% }
12位:使能P12产生键盘中断;3 T' ~! E4 L. Q3 H A! D- x
11位:使能P11产生键盘中断;
2 ~* L# ] Q( N( {- L0 }% K& i 10位:使能P10产生键盘中断;; p; P/ u$ o. g0 W" X
9位:使能P29产生键盘中断;! n* s7 t: S5 K, g. h7 P
8位:使能P28产生键盘中断。* h$ ^* D% w# u5 J( B6 `' e
7位:使能P27产生键盘中断;
, m) T8 l( o4 c4 B 6位:使能P26产生键盘中断;. a' y7 Y9 i" r, U O
5位:使能P25产生键盘中断;
. o3 A+ x4 k$ d& M" w 4位:使能P24产生键盘中断;
! K; |# c# O2 w6 p* \& r) ^; H 3位:使能P23产生键盘中断;
* G/ _" o: E9 o! D: x g" y 2位:使能P22产生键盘中断;
' x2 M8 {+ n9 t4 f1 d2 n" a3 { 1位:使能P21产生键盘中断;/ Y4 E# V* z; b L
0位:使能P20产生键盘中断。
* O1 F$ h4 M+ H+ y, C 2.2.11 键盘中断源选择寄存器2
. X1 x9 Z' H/ P4 h6 ]3 K4 z- R0 V- N( ~
# C( Y" Q$ F5 S* q
图130 A+ _0 S2 |% e( f' X/ p1 i
7位:使能P37产生键盘中断;
# E+ T" C( w( D! P 6位:使能P36产生键盘中断;
* W! `8 X% b9 o j9 k* p 5位:使能P35产生键盘中断;
3 Z% N; E+ E7 h0 T) Y5 m. D" N 4位:使能P34产生键盘中断;
7 d, W1 p# ^5 X; Z5 Q7 `# { 3位:使能P33产生键盘中断;/ N3 b2 J* h% I z4 o6 c& Q8 _
2位:使能P32产生键盘中断; e. s6 Q' O2 a3 d5 u
1位:使能P31产生键盘中断;) w) Z+ I5 z' m/ w
0位:使能P30产生键盘中断。
$ T" i5 u; E( d- W' V W 2.3 寄存器配置讲解+ e, t0 a! T: r; v J4 D% |
#define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
6 I9 J+ T8 Y# F" Y #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402)
+ e1 t* A: ?$ y/ Y #define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)
1 G; d% ~2 w+ N x #define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406). m" q8 z! V4 c" p; b
#define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408)
9 v. T: ]) M* R+ A& E/ O #define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C)
7 K5 H# `+ T7 m8 y: u$ q! F #define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)
. o7 K9 Z: n: G' ]# V #define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)
$ V4 l* I0 |' ?# M: G! ^' Y! V: y* p& o #define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412): U6 A0 q3 y$ {+ x: A
#define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414), |* N' N+ [# F j( ~! K6 j& C4 T5 S
#define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416)
" ~* i# }1 Q4 z+ |$ \; ? 例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:
I' o, d1 ~6 y9 @ GPIO_IRQ1_IN_SEL_REG =0x0003;: h, \# q8 x6 Z2 l
GPIO_DEBOUNCE_REG =0x0114;2 Z- s0 a) ~ c" p
GPIO_INT_LEVEL_CTRL_REG =0x0202;
8 O, @' A% u% x+ \ U: o GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。
1 g. L* u8 G4 ^( J! b, t& S8 E/ Z 例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:6 y5 N1 P P& ?# n% m9 ^
KBRD_IRQ_IN_SEL0_REG =0x4008;) ~, T' \! S6 ?% e3 X- F& K
KBRD_IRQ_IN_SEL1_REG =0x1100;. A+ ~3 j, A# R8 W& Y( S
GPIO_DEBOUNCE_REG =0x201e;
- f; [/ L" s. F% A0 x 键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。& j. r6 P( ^: `2 _! Z" y& V
) L0 J7 L$ s3 f3 k" {- J& q2 E: b
. B3 V, e% x, H 第三节 中断实验5 ?" [" G/ v$ t. W4 P. Y
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。
1 h: `6 t, ?1 o, ]. D5 r2 o% R* A( E 使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:
& f8 n' z7 w$ f (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:( J" Y: [9 {0 y
8 e& M# N# o6 K# ^3 L9 e+ [
0 q1 y) H+ p0 N5 ^9 o 图14- h+ Z8 A2 ~2 W" s2 G9 J
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
. j+ m7 j6 I9 J. ~
- j/ Z! x5 v9 u8 s$ ] V/ |
& P: o8 Y0 r( N. m& P 图152 _; m7 ?7 y" v/ s N0 y
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。" m) ]) C% g3 v* I1 R. F
打开中断实验的Keil工程blinky.uvproj,位于目录:( y) w+ U8 |' m$ C, D1 }
..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:
j% _2 D9 H( ~; J0 i% M
4 o% P2 e& T [7 h. o' G
# q# \0 W g8 V* z, e, r 图16. n4 H, O; X7 i5 ?, O- ]6 ]9 N# G, ~
在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:- L* z3 c( H! R0 }# I$ |+ z
- V0 T+ U4 k* I; E' Y. \$ @
( u; E# H* g" Z& E& D7 C, c
$ `- g: C% e0 ?
, r- N, K3 Z+ m* O& P$ ] 图175 {4 P, w6 e* H* ^# ~& n
全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。
8 f6 C$ T$ U" ?( E+ \: x/ V& ]8 d* r+ q6 v
?$ K+ i) `$ k$ v( q0 t& n
- Y, r# R% g( w9 F( _2 V* g7 K- f, J 配套资料:http://www.fengke.club " i. _1 b" v' e8 p6 `7 N
套件地址:http://shop115904315.taobao.com/% h7 p4 x& F+ E y; W% g' z/ Y7 R4 x
文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 0)
4 w+ v1 D4 i( H9 u
5 n% D8 G+ {( o/ L$ g
+ [ G* J& [7 ] |
|