|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2022-8-31 16:08 编辑 + |! g9 W# @: N/ K8 g
$ t% _5 b0 O2 n- c$ `1 J; }
# \' T4 O7 F! _ c; Z) h
; Y0 p! V& ~9 r' z& X$ U1 p( b# e$ w# M4 ?* |
- ^* f' N7 ~; W6 j8 C+ C4 c 图1
" \4 V n, _$ d( l! t( h4 {: a/ o; b# X% k
第一节中断硬件电路
/ t s1 r t) @* H5 X 将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:
9 F) x4 d! p2 A" ^" r
& H5 L2 T$ z7 T. j
! l2 x' Q$ N, V: H% P: K
8 ?$ }. Q9 Z+ l 图2" X8 ~! V; m# x" y2 N: a1 l
1 f+ _* A$ I5 Q! c; y
& |5 }/ v6 P5 k2 d6 K7 L 第二节 中断
, |7 c$ U$ z4 ?( X 2.1 中断介绍
+ M5 i# }9 J4 i( e+ n* T( Y 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。
" R: |( v3 g2 _" R, S8 } DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。. C8 |6 l- o# Z2 {2 n4 G- k$ E
2.2 寄存器介绍
$ m, R1 l# {0 M- C" S7 N 2.2.1 GPIO_IRQ0中断源选择寄存器
" @9 \2 g" h, d' [. O
9 t `2 Q. u+ z7 p; {. ]; P
2 b% p& S( m# G% S0 N
# N# |) [9 I4 A1 Q2 h8 J! ^ 图3
" D$ l: `7 N# u 15:6位:保留不使用;6 h" m. V( k- G2 A1 I
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;: l: ~) p" p1 V9 b S9 A- ~+ E
2.2.2 GPIO_IRQ1中断源选择寄存器- B3 [3 ]% A" h9 W9 C& b! C4 Y( b
9 F# F# Q, T9 Z, @6 z) h
0 o& O3 c& }4 G+ }, a 图45 Q' {& r6 R3 v: }0 B
15:6位:保留不使用;" h3 f4 B- k. K* U9 l
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
1 k7 N, i9 b& ?$ n 2.2.3 GPIO_IRQ2中断源选择寄存器( X& t8 m1 z; K& ~
5 `& Q+ G+ n f& d5 t- U. v) I8 m
' s% I2 k$ B7 F
图5
+ e, X5 U( |+ {, t) G' t* }' E 15:6位:保留不使用;: M5 @- s& }5 V0 d1 |; G2 W0 I
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
! |, W2 U! e$ i7 x$ } 4.2.4 GPIO_IRQ3中断源选择寄存器) p! }/ Z# V2 K
( b5 \' ]; M% Y4 y4 R% Y5 m
# o" d/ M% u" o4 a2 q( [7 i% i 图6
" `; j- {- h/ D3 A7 C 15:6位:保留不使用;
R* }9 b L M0 _) D" e 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
1 r' s, c7 \7 o+ x 2.2.5 GPIO_IRQ4中断源选择寄存器+ i- z' x% G; Y8 d
4 \6 e" A) {. l' g# ]
; E8 w: j8 V: T+ A# f 图72 F, N5 _* I& r7 z. i! k) h, t
5:6位:保留不使用;
( H5 ^1 C, R" e% C; P' N 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;$ _: g+ n9 I& t
2.2.6 GPIO延时寄存器
3 [( J" G$ D2 E. ?9 ^* w# r8 M: k! ]9 D6 o2 t( J
+ y' Z! ^$ `4 v8 w 图8
( M, o% O' F. i1 Y4 C. B 15:14位:保留不使用;$ c& f/ \+ }# V
13位:使能键盘接口延时计数;: z" V3 r% [! d3 z+ R: B$ D
12位:使能GPIO IRQ4延时计数;4 g: r! v% l$ Z
11位:使能GPIO IRQ3延时计数;
5 J' ?8 w& a( Y# }+ B& Z 10位:使能GPIO IRQ2延时计数;: b/ F% V3 Q* W) Z. g' j- r) T- {
9位:使能GPIO IRQ1延时计数;, b9 z6 i$ ?' J/ r
8位:使能GPIO IRQ0延时计数;# m; y, g# p8 Y j
7:6位:保留不使用;
8 Y9 [4 F$ x- h8 o; E 5:0位:延时值,为N毫秒。8 l B$ z* m0 F. f7 [
2.2.7 GPIO中断复位寄存器5 v8 b1 U( n9 J
/ d8 Z7 N+ _, m2 t9 R! X, F, [' B
" c# `4 U' R' g- j
图9
: h# X) Y) f) `3 R" ~1 l 15:6位:保留不使用;2 X' y$ G7 o) i
5位:对该位写1,则复位KBRD中断,读取返回0;
! I `8 n# K4 r3 o; J$ u8 M 4位:对该位写1,则复位GPIO4中断,读取返回0;! ~: i- X1 Y! b" p9 F
3位:对该位写1,则复位GPIO3中断,读取返回0;
1 L3 v1 S! q% G* J# [ F 4位:对该位写1,则复位GPIO2中断,读取返回0;9 i0 N; G: l9 x a
1位:对该位写1,则复位GPIO1中断,读取返回0;; x0 c, E) k: }& N7 N" _
0位:对该位写1,则复位GPIO0中断,读取返回0。. }$ A0 F! J% C0 H Q- l+ M
2.2.8 GPIO中断电平控制寄存器
" Z# u" P: E, u( C, E+ n6 R: L! I/ d% r7 o; Z
8 L( |0 {; S% Z1 o& |
; q% }# E0 C; J) \0 }' w# c 图10
' R3 @( u' Y, U d 15:14位:保留不使用;' n8 W# Q( m, J6 p- e1 B9 w h0 f `/ M
12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;
9 T v/ O4 @' I9 X' |3 v 11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;& G. q# |9 p( O# k2 K# m3 a
10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;4 G) y+ X5 }; M/ i! p( l
9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;# `5 u, T( T$ `
8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;3 N e# }2 ]; J9 \
7:6位:保留不使用;$ F& Y9 [" F+ L5 {
4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;
8 K1 L S3 J4 q4 T! C9 l 3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;
* }- A1 A+ X9 B 2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;
1 ^& a$ H+ F8 A# b8 B+ y 1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
" l2 J, s U5 R+ V- w& |1 V; P 0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;) F+ a, l, s* O* i% {( p
注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。
' D# z3 ?# G9 z& ? 2.2.9 键盘中断源选择寄存器03 n/ J% t1 I& Y. o: `4 Y' {
7 f2 |# B8 b Z0 f" Y( x
( }& O1 U8 w9 F. E- f- V+ | 图11; ~6 v6 R; ]% B
15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;
% } `) K: _) H8 g" _! L9 t 14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;& y) {# f. Z6 j# B9 l9 m
13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;
- l& D5 ` x) Y3 b) k 7位:使能P07产生键盘中断;- k, }# H; k& Y$ @* z/ g* { ^
6位:使能P06产生键盘中断;5 v$ P- t' i: i! R
5位:使能P05产生键盘中断;
0 J. x" \* f2 n0 g9 r& B4 p% ]% ] 4位:使能P04产生键盘中断;5 J8 s5 g4 a( A/ U# {
3位:使能P03产生键盘中断;) v9 I4 \9 h! U4 p0 M1 x
2位:使能P02产生键盘中断;
/ f$ Q1 a0 H6 d0 a* D 1位:使能P01产生键盘中断;3 ^* S$ N: }# d4 L9 m: {
0位:使能P00产生键盘中断。
8 b2 S% M; O: E) O 2.2.10 键盘中断源选择寄存器1
$ |/ n: k1 B* E* [" c
7 {2 y5 }" E& F0 A* b
) ~/ F, o/ Z6 D0 J. g
图12" }7 i1 I) U$ _+ Y
15位:使能P15产生键盘中断;
% ~" M8 M& h( a" y! ? W7 w1 z, h2 i. ] 14位:使能P14产生键盘中断;
% W, A; ?7 \- G 13位:使能P13产生键盘中断;3 f z0 n& H6 T+ ^/ o4 h2 X3 H
12位:使能P12产生键盘中断;4 g% K, @& f3 V9 Y
11位:使能P11产生键盘中断;) V0 }5 Z S: Z% w$ Y6 I2 X- v5 {
10位:使能P10产生键盘中断;( _ S2 _. a; a
9位:使能P29产生键盘中断;
( M& e: t& A4 n: O( m. \0 U 8位:使能P28产生键盘中断。& E8 T4 f2 h$ y- D1 {! f$ }
7位:使能P27产生键盘中断;
. X$ f5 D3 B/ M" ?* |( u, K/ ` 6位:使能P26产生键盘中断;: E8 b V& M# S7 ?" \
5位:使能P25产生键盘中断;
8 x/ `: r) M" N( U" w: h 4位:使能P24产生键盘中断;
% k# C& J) I- {; x, \ 3位:使能P23产生键盘中断;
5 H* q5 I# Q: a: r; e5 W5 ] 2位:使能P22产生键盘中断;
4 Z) C2 t+ m* _1 ~0 p- S' o 1位:使能P21产生键盘中断;$ f; Z8 T% y- T& p
0位:使能P20产生键盘中断。
5 i; X* m, O. ~ 2.2.11 键盘中断源选择寄存器22 K5 w4 W7 q& a A
, f c) K3 a! ?$ F" |4 D
! a4 s/ z4 ?- o
图13
8 ]( t0 t- _- Y; K 7位:使能P37产生键盘中断;$ j+ H( o% b/ Y1 n
6位:使能P36产生键盘中断;% I; H$ a9 c9 g9 \- E
5位:使能P35产生键盘中断;* X3 j Q6 c, o" o1 z# F
4位:使能P34产生键盘中断;3 U+ s1 [+ c1 _8 j3 E
3位:使能P33产生键盘中断;$ y3 p+ Z+ P6 i$ z$ L }0 W
2位:使能P32产生键盘中断;
9 `% Z3 x6 L* Y" Q7 Q* @8 q 1位:使能P31产生键盘中断; @' D0 D1 u* U) F. c& I! H
0位:使能P30产生键盘中断。3 ^* |: H2 `/ [
2.3 寄存器配置讲解 p8 w8 T/ C0 ?" i
#define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
1 e) j+ Q! t8 B+ M: j& { #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402)
4 J: ~2 r; @8 F: m# B- q #define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)
+ L9 n8 A! E0 n6 V #define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406)* Z9 k8 Y- H2 E- g0 M4 O
#define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408)
( h7 m$ t: K6 L' x #define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C)- q A6 v, v; e# q5 h: M& }$ V
#define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)
! G" j! o8 P" N #define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)
* m$ |+ }4 E- m2 C4 ]0 M \+ l7 h #define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412)
' J* `% _1 f3 { #define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414)" A, G! m" _. |# Q! G
#define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416)* S3 o/ H/ E. a! @5 D% I. c! C
例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:
5 w6 w3 k+ K8 w GPIO_IRQ1_IN_SEL_REG =0x0003;" G% }+ L& m) S7 C
GPIO_DEBOUNCE_REG =0x0114;
* @$ K! x! @/ ? GPIO_INT_LEVEL_CTRL_REG =0x0202;
4 ~- o, m0 }+ k# ? GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。0 C* e0 m5 U& c4 W8 e, T1 K+ S
例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:
7 L; Y5 M& X3 Z0 f0 B% q& w" V KBRD_IRQ_IN_SEL0_REG =0x4008;
% \9 F3 g) M w. C! } KBRD_IRQ_IN_SEL1_REG =0x1100;7 f# N0 d: M' G3 R9 A# p
GPIO_DEBOUNCE_REG =0x201e;6 P' Z+ p% \$ n m* f
键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。
2 B: O8 t4 O' b/ R( |7 T8 C
( v9 \; s" n" w& g( E/ D/ ~$ i4 S
6 ^3 B% x' L/ _$ C+ T 第三节 中断实验# Y S2 Y- @$ L6 G
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。
+ e( t6 U. t2 P6 S% A 使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下: D9 f7 b" H8 F/ Y \% A8 F! q
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:+ `/ N) j$ A" A1 J2 v1 O/ [; i/ O
6 W8 _2 D1 [) i( Y' ?
; `2 k* J7 B; O+ w/ T1 P8 Y o h 图141 f. F; r; m2 S$ b$ C [
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:8 {, U; Z4 Z; z# m5 M/ _
7 p3 @2 Q3 v( F, m' k" b
5 i0 G* y( o1 X 图15
' w x4 ~+ E. ^( q 将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。3 R8 P9 a/ M1 i4 S4 o
打开中断实验的Keil工程blinky.uvproj,位于目录:( f4 G. h) q; R Y1 Z
..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:
) D& Z& e& E2 c* u+ n7 }: [, [/ G1 J5 Y d& _
$ o. C, w0 ?1 }; w6 a( F; K9 ]# Q
图16
7 X) e9 E1 R' V- `/ p 在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:
/ a% k0 U6 P$ e$ u: u# u- y% I/ w" h$ T# r( W
# i$ [0 S/ {+ \+ k5 g' P% F9 W
( l9 ?- [0 v% F9 l
% v- T& n% D5 s) F, z
图17. `1 U+ X+ d. d% b
全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。
* k3 l0 c! S [" _/ R, D- j+ V; w5 L4 v4 W" u- S
3 k7 {, Q5 C: v9 @. X
/ v3 N$ n; N7 c
- l3 M' b- z3 @9 u& F6 G) m
文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 1)
8 j" `1 N$ y5 v `: q% _2 }
3 v3 @! i4 f l* \
9 R8 i f6 w1 c, Z1 Z* g* Z$ ]$ | |
|