|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2022-8-31 16:08 编辑
. \% o, [! e7 D+ t1 ?" P3 A2 |) O5 r9 y8 x, u3 A7 \5 H3 E
7 ?" e2 A" P8 c( ]: M" B5 V5 Y! R/ v- n5 t x+ G$ d
. w" k0 K4 z) L1 H. c' I5 S; ?2 ]
! F1 \% Y! D8 B7 w" x
图1
, i% h7 I0 e' r9 m2 z: M; `
8 X# K, H* R) l7 \- i; S) |/ r* z 第一节中断硬件电路: j/ W* e/ H0 R0 b' l
将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:
1 \: Z- H9 N9 \/ k" N0 O% j. L' _% Z4 l0 I
. _' A0 \+ k4 C# k( t6 T# A
7 n% z- { f; |! ~5 x4 }8 v" n 图25 c- |- _) y0 S f+ |- w C6 j
2 g& `& r" [/ ]
& I* g, V$ b8 y# j; n2 a" I# l& p 第二节 中断/ j& ^, |4 w9 n# P5 A1 c
2.1 中断介绍
0 c/ i$ _9 a6 ]% N 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。2 |6 F0 q0 q- Q' w3 d a
DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。
+ {2 z5 A/ W8 F$ ? 2.2 寄存器介绍
6 @$ Z8 ]8 i8 B$ l3 y& e 2.2.1 GPIO_IRQ0中断源选择寄存器
3 o I$ `7 ]2 F; H) x) x8 j+ x# S; w
. R" R) |1 b0 {# E& b+ k- b
$ `6 F1 G! F# |/ _! h2 x
: X& B- Z2 c* o* X& p 图3
4 k( C9 Y6 h; T# j 15:6位:保留不使用;3 I9 F: V! m% T, n; U- l
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;2 o4 A4 ?. A. _$ X
2.2.2 GPIO_IRQ1中断源选择寄存器; U9 _4 }" g$ U/ Y2 |; m" C. A1 n" i
/ z3 a% B) d5 |$ a+ q3 _( w, F
% z9 S/ F$ ? V& d5 C- y
图4
5 N+ f n% n7 B- U/ ~/ S" @0 @8 O( N8 h 15:6位:保留不使用;# R' I2 y g8 U& Q5 x
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;) w9 V6 v; o( i8 m3 _
2.2.3 GPIO_IRQ2中断源选择寄存器 Z& n- L& ?. S7 E
0 `$ g% {7 Z% C' p6 b& O
" R) i8 L$ l- _( ^1 Q5 @3 E0 I
图5
" p/ d- O% |, I# W! y 15:6位:保留不使用;
5 ^- C+ ^6 r. u* ?- `5 l( S 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;, W0 P. {4 s2 b, T
4.2.4 GPIO_IRQ3中断源选择寄存器! {) K+ a, `2 @8 V
; }7 q2 y0 D1 |/ a. ~0 B! k5 T
4 t9 k) E2 s1 ~: m2 Y& H
图6; s( S4 Z1 ]" B
15:6位:保留不使用;% n$ @: h. v6 J/ R4 M3 f0 }
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
1 Z% k6 s0 t* |- J- c6 V+ K& x; J 2.2.5 GPIO_IRQ4中断源选择寄存器
5 p4 w% H5 d3 D8 t$ E5 X
|2 N1 Y" ~2 G$ ?+ s% u
4 d5 f$ K6 L% e* d0 N9 G! I: `; h 图7
6 s( E- q: Y4 ` 5:6位:保留不使用;! N9 N# |" y. [7 j& a; S) f$ s( J
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;2 J6 a! _; T A1 j. O
2.2.6 GPIO延时寄存器
' h7 W! @+ X: z7 H1 G/ y: g' f9 W6 O& Z& m0 H7 q2 F% A2 W
8 X+ S. r* y+ V$ R6 e9 O* s8 _ 图8( w# Q8 a# x y }7 ^
15:14位:保留不使用;
) O$ p8 f3 U$ [9 B/ T 13位:使能键盘接口延时计数;5 ^% F+ c9 G5 h: x2 o& @/ Z! W
12位:使能GPIO IRQ4延时计数;
: y5 ]) y4 P! d! w; N3 \ 11位:使能GPIO IRQ3延时计数;
0 A, m, {' q$ }1 q( R, Q+ ? 10位:使能GPIO IRQ2延时计数;
$ i- J0 f: {3 ^- t* s6 T- r# Y 9位:使能GPIO IRQ1延时计数;4 W6 \7 {' A; I9 A" Z, d$ }9 a1 C5 L, A
8位:使能GPIO IRQ0延时计数;
- G5 K: L/ Q, v! N) G. c, D8 S 7:6位:保留不使用; `% g- L- W4 U) t9 k3 E+ _
5:0位:延时值,为N毫秒。
" w+ B- M" L7 { 2.2.7 GPIO中断复位寄存器% g) Y8 t* Z+ _ S. n
. a' N" _& ?8 O' M. u: T
$ F5 B* i3 J( H1 Y7 {5 b6 H/ N% {
图92 J3 ^& T0 k* z
15:6位:保留不使用;6 V, S2 B4 V4 R! s3 K* F6 Z
5位:对该位写1,则复位KBRD中断,读取返回0;' w. w; S6 a& v3 Z
4位:对该位写1,则复位GPIO4中断,读取返回0;* ]6 U- n, r6 c
3位:对该位写1,则复位GPIO3中断,读取返回0;
5 I! B: H& @! V8 N5 H 4位:对该位写1,则复位GPIO2中断,读取返回0;& I. T# c, w; A7 U8 v
1位:对该位写1,则复位GPIO1中断,读取返回0;
+ ?6 j: a# \/ }' Z% a& [" ] 0位:对该位写1,则复位GPIO0中断,读取返回0。
; {" g* I) Q6 D. Z: Y' k$ r 2.2.8 GPIO中断电平控制寄存器( I4 \' @3 C7 h( ?4 g8 e1 H" m
9 K5 }4 F3 l' `2 y! w
9 f3 A8 F6 L, y
( @- f3 Z |' f 图105 b4 f/ V! m$ O$ H5 {
15:14位:保留不使用;
) v$ W$ D5 L& e ~8 N/ `( |# f 12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;
7 L% C7 D ~. p* o 11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;
1 K' o e) C1 o4 J k4 O 10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;, i& l6 w1 i S$ [: e: F% C( n) H
9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;5 D5 U5 {6 v! P% t3 i
8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;
! h8 {8 J7 f. a0 x$ U! a. j 7:6位:保留不使用;- F( F& W1 L/ }" \
4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;" E' K; c; P: H4 u
3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;
3 l; F, j! ?& D* O; \8 U5 a 2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;/ r: q" ?9 G4 |& M4 C5 _9 ~3 C
1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;! j$ `2 r. X& [/ ~" o
0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;8 _+ K9 C: b# \/ }/ g J# Y( h- Q
注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。; i; {7 W0 q7 r, p/ s* C6 q
2.2.9 键盘中断源选择寄存器0
5 M4 F: ?" q+ t5 D/ i
+ }$ i; ~# F' A( b1 k0 h, @
, ]& I2 P: o0 l2 w5 Z# g' r$ m$ l" Z
图118 m' Q6 e. Q7 u5 V# f3 p" p
15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;4 f. f- G+ i# x+ ~0 X6 ~
14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;4 `7 t* R" N; \ o0 ~, {$ ], V" ~- n
13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;
; O+ |2 a7 B2 p4 a 7位:使能P07产生键盘中断;
1 r$ Y& x2 n w- h 6位:使能P06产生键盘中断;
% x6 o8 \2 ^# @, E 5位:使能P05产生键盘中断;
; U/ Q3 n' F }% F% m$ p* Z- c% Y 4位:使能P04产生键盘中断;$ z+ n0 k4 @3 s1 S# l1 [
3位:使能P03产生键盘中断;
8 n- t* H2 h& _/ Y; l. q 2位:使能P02产生键盘中断;
$ \+ Q6 A$ O6 _" k7 [: X( ] 1位:使能P01产生键盘中断;5 y8 r/ {+ N: c( R. Q+ \ y) ~) v+ I- b
0位:使能P00产生键盘中断。8 q- m q& c% p& g0 p A( g* ^2 m
2.2.10 键盘中断源选择寄存器1+ ?$ D( L! d2 z8 r" X/ A, `; k F
. a5 W& ]& x: ^0 P. K4 W
2 o2 y s- n0 g( F) _) G8 k
图12
8 _: g1 W. S4 J( i$ F- O0 y 15位:使能P15产生键盘中断;1 ]1 |+ ^' U7 T" k
14位:使能P14产生键盘中断;: @; g8 B( H X: q7 H
13位:使能P13产生键盘中断;
- @& ^0 D N- H5 } 12位:使能P12产生键盘中断;
0 [: { y+ t( U. p 11位:使能P11产生键盘中断;
8 R$ t! p# c" ^- m; Q5 o 10位:使能P10产生键盘中断;. e; b+ {8 A6 D+ r. t0 @
9位:使能P29产生键盘中断;6 N0 r9 C# f( f! d i5 o% p
8位:使能P28产生键盘中断。
: q. |3 j1 l3 A# g& o 7位:使能P27产生键盘中断;
( M0 m$ x/ v5 ]: _) X% c 6位:使能P26产生键盘中断;
2 ~* A7 E$ Z# e8 k9 c 5位:使能P25产生键盘中断;
9 W0 J( S! C9 ]" I 4位:使能P24产生键盘中断;
8 ]/ F# d8 Q. b- `; Z K' v! t 3位:使能P23产生键盘中断;
/ ?2 ?% h6 H2 b- U9 O* a9 W+ _ 2位:使能P22产生键盘中断;
9 ?8 y5 e( h* \2 `, D0 P c 1位:使能P21产生键盘中断;" y6 \5 Y- T1 C& O1 ^, L
0位:使能P20产生键盘中断。
1 a) y9 ]; D* S1 s3 `; H 2.2.11 键盘中断源选择寄存器2* e) r) ]3 u( S' s0 D
8 |1 g5 ` P- l
- u u0 J6 ]: U N
图13
4 ?; v/ L* E5 D1 G5 o2 ^ 7位:使能P37产生键盘中断;
?( z# I/ G. X$ y( j% x9 x 6位:使能P36产生键盘中断;. }2 k5 E; Z7 N7 Z! m
5位:使能P35产生键盘中断;
0 j" r" O& S( f6 f5 } 4位:使能P34产生键盘中断;
8 V+ g% U+ h, @ 3位:使能P33产生键盘中断;
# V. e4 H1 c1 p 2位:使能P32产生键盘中断;
" V( e$ [2 G3 t9 W4 n 1位:使能P31产生键盘中断;# `+ j/ E( c' A. V+ `; G) `' w/ l
0位:使能P30产生键盘中断。
; n. H1 ^+ u6 T3 b, B# q w 2.3 寄存器配置讲解- M0 n* s+ t# j5 q% y: S( A* p
#define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
i! w% J" v, t5 R `" H #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402), W% X& u/ j' l4 L* K& X
#define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)
4 [/ a$ k' f. H #define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406)
9 k( `. D8 T0 x #define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408)
; k7 ~9 M, o1 y8 z7 R' Z+ ~ #define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C)' j3 q$ r; M8 y8 ^- v" D) D
#define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)& x6 U% n8 N3 \+ g1 `
#define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)5 a6 k7 D& d) l6 I
#define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412)
- O6 v' H0 D: i/ |, Y$ T- c, M, X) h #define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414)
3 c/ N3 c* d( m; @ #define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416)2 {: h) k" j! w! {6 _
例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:
, D* X* l! K! w9 q, a GPIO_IRQ1_IN_SEL_REG =0x0003;! f2 }" Z% p( [5 p* e* j
GPIO_DEBOUNCE_REG =0x0114;# R/ ^2 o& r! B, V% [! m2 K
GPIO_INT_LEVEL_CTRL_REG =0x0202;
4 j/ ^+ y3 Y* C' r. m GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。
0 `! Q% j+ j6 M* }4 w& t! O 例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:
* B* j$ i% ]0 ]% D KBRD_IRQ_IN_SEL0_REG =0x4008;
, K2 K8 J+ T1 p5 v/ a* r/ P2 R% `$ R KBRD_IRQ_IN_SEL1_REG =0x1100;4 z- S4 E+ E4 j
GPIO_DEBOUNCE_REG =0x201e;
0 ^7 N2 @. e8 t) A4 }3 o+ w7 x 键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。# H' W9 R, d; X9 c% w1 d/ t% d
) p2 e5 \* T( |% p) k' ?; u0 `& W% d; m9 [% N/ ^: `- a# o% ^: m
第三节 中断实验
9 C4 M5 X- M! c$ h 实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。
. X _* Q6 C1 A" m" d, a 使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:+ N0 N1 M2 m, Z
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
* V" D+ O/ y2 t# s6 d0 V
* d, b; O ?/ K6 Q. [$ e
' y4 w+ q+ h2 n/ G 图149 X# g. a/ w: F0 j j, C
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
9 q/ m0 Y, k1 H- e* l+ c& o
8 C4 p3 O. V* K; C
% M" F* F$ q3 o. Q( L$ B! C$ \, { ]
图15/ O D2 C1 R3 v# G. p
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。5 _: P; s+ e5 _8 I9 k% }. c
打开中断实验的Keil工程blinky.uvproj,位于目录:* b) m( ]/ @, c" Z: {
..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:5 p7 V# Z1 a9 U# {8 P. B% Q& g
: n8 k5 N8 D6 z
- ?, R, y3 D7 W7 Q5 G% }6 v9 N W
图16
1 j' }+ M5 k ^2 P. W0 P 在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:! \- P4 j8 d( A8 Y3 J
; Z6 w# \* g: w. m+ G! a3 y% ?* |
" y) @2 M/ _& E. f
; Q$ ?+ y8 T, o: {
% z8 x# k+ D' I( y
图17
8 I; x, Q$ t7 B) \' j" ~3 F4 L 全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。, j1 b/ {3 u- {$ V" S
( `1 {9 V. r' x- ?6 A! c) S X% z- _
: S, m7 ^0 P( Y! z4 h1 {; J8 e, G" E6 J9 |* n% ] ~
: z0 S9 R; e+ S, w/ E 文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 1)
* |1 [+ s4 @- C# u0 q0 a3 y7 }4 ?% A! N0 _2 O% D5 m0 C* F c/ x
$ L8 q( O$ G8 f2 ] |
|