|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
中断实验教程 ——疯壳·开发板系列
' v, w" p0 M9 K
* L7 w- ~) I) h' c9 E
& _# \0 I& F% l3 g( q. m 图1' H" u/ e+ N9 J5 t1 d8 V# a
+ g1 t, [. e5 F9 |3 U- Z. Z) x 第一节中断硬件电路& q( i3 V7 D9 D
将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:$ v8 ?2 d# s& ?' ?" w- m6 L
3 {6 c' w4 l' t T
t( u4 C' Q$ t! w* I
2 ~; \- |+ R: h1 A1 a
图2
5 z. o) ~, k: A* z8 z) i
x) ^' `- S( l0 G- ^3 e$ \) Y
, O/ i; O. \4 C) Z( w7 }4 z; V 第二节 中断
: ~, V+ c, F o& h 2.1 中断介绍
H; m" a; i% W( ^/ h, u 芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。! w: {' Z+ Z, k1 @. q1 q
DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。! u4 ^- h2 G G: D( C# r" v- m
2.2 寄存器介绍
. N Y: Q m O6 u/ d B3 o 2.2.1 GPIO_IRQ0中断源选择寄存器+ H% S& D7 L$ S1 D
8 t4 d9 j1 O: j' _2 {
$ ~. e$ ^+ v: \) u/ R( `
7 Q9 k- U$ V% l- T4 `
图3
9 D9 U$ f) D* P) F: n 15:6位:保留不使用;
! _# ?7 p9 G P' E- K3 y2 T9 |0 h" _ 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;( U- h" z0 ~0 ]+ t" f
2.2.2 GPIO_IRQ1中断源选择寄存器5 V( o9 t$ [; I- D
8 x5 v# u( |( `; R* B; @ ?
" E7 t+ v/ g$ K, `0 D* K
图4, {) }. |; R' X6 @( Y: f* P; D E$ ?
15:6位:保留不使用;
9 X5 J/ ?2 t7 s 5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
0 n8 S# j4 x5 q: q& a" u! j 2.2.3 GPIO_IRQ2中断源选择寄存器: w, X4 b% V% s, G
% s" K) A* z4 ^. u
! a9 _8 Y, B% g3 e; b5 N, f
图5
. D- f8 o1 _* W, ? ^ 15:6位:保留不使用;5 d$ x' L+ M4 C# F
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
; j4 [8 T9 N3 z% }0 [3 f5 Q( m 4.2.4 GPIO_IRQ3中断源选择寄存器/ r" n! j1 p9 l; [- _! \. z$ d
3 \0 P; j; K, L9 k: I* ]
& @5 z- w( J8 {7 ~ 图6
9 \7 C% C3 n6 B1 J% s" Z 15:6位:保留不使用;2 h8 R( u# t* e- g. m1 Z9 L: V. {, {
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
6 Z+ D( c8 h" e$ Y1 N) r, h2 F* Q" A/ D, { 2.2.5 GPIO_IRQ4中断源选择寄存器
8 K% R/ u0 ~. H" D. [& p( e' y, c- e
7 n. X9 E0 t8 ~- W i) o
2 q' I% T% n- w) T 图7; |& W7 p, Q/ R1 ]& t9 u
5:6位:保留不使用;$ A3 q4 Z( ~7 y& M" W
5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
. D4 |; ]' F( p2 w+ R 2.2.6 GPIO延时寄存器
* M0 P1 |% Q5 c2 }6 U' w3 E
5 g9 g" Q% d4 j" Q$ ~! b
4 X) N# W* ]2 Z5 O( l8 L
图85 |9 a2 x/ s2 M2 _& U
15:14位:保留不使用;9 Q9 i' A% {# `" |
13位:使能键盘接口延时计数;" Z5 `6 J+ M5 y$ [4 J
12位:使能GPIO IRQ4延时计数;
/ ^% ]6 a. D( G, q8 E 11位:使能GPIO IRQ3延时计数;
# L" p' a H7 Y9 L 10位:使能GPIO IRQ2延时计数;
5 X7 B# e/ R9 g" q 9位:使能GPIO IRQ1延时计数;
- g+ A" a2 y. H# C 8位:使能GPIO IRQ0延时计数;) t3 } k) g1 D A
7:6位:保留不使用;; w: m5 n& g7 n. T
5:0位:延时值,为N毫秒。6 t4 J8 g. s1 _$ I& o
2.2.7 GPIO中断复位寄存器
" F. q$ `3 S$ x O3 g0 i6 \$ z$ Y4 f* E+ W
! | y* d9 ?+ W8 o1 Y- E/ l 图9$ k3 I) [( M& K( Q$ _) y( t
15:6位:保留不使用;
1 k0 c3 n" O1 f: e4 j 5位:对该位写1,则复位KBRD中断,读取返回0;0 y5 Z7 i) k2 }; A+ F1 @
4位:对该位写1,则复位GPIO4中断,读取返回0;
) e# E( y; @4 _8 f: R 3位:对该位写1,则复位GPIO3中断,读取返回0;! H% j% A- J$ B
4位:对该位写1,则复位GPIO2中断,读取返回0;8 k( ^$ ^: G7 B3 ^. {
1位:对该位写1,则复位GPIO1中断,读取返回0;% f, |9 G1 U& i" t. I
0位:对该位写1,则复位GPIO0中断,读取返回0。
( d8 j3 h; @& P/ G8 s2 r) \ 2.2.8 GPIO中断电平控制寄存器% w0 l' O7 ^ N* N5 l3 o2 R
4 U: L% H- ]. o, K
5 I3 P8 B/ @* B7 M
& Q! m: Q' m, p1 A6 ^0 {8 p 图10
+ B& D1 x7 y" u* v 15:14位:保留不使用;$ C$ s7 P+ P8 @1 ?9 z
12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;; Q6 L3 X4 d1 d6 l- ^1 ^
11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;
$ c+ V# ~- W# a, ~. s3 z 10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;% a6 N" Q" H1 A) G1 U9 w
9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;
5 B- P e% e6 r! y0 N: n 8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;
" I/ E/ T# F( m+ h, m( { 7:6位:保留不使用;
/ f6 I6 @/ Q4 n; K 4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;7 V2 t2 u2 O6 |# ~0 _' {. r
3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;
- C/ J( Q& S7 [' \) n 2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;; q7 K- W( U; r+ e2 j5 i: a
1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
; P; T( c% ~4 j" f0 m0 h# l 0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;
# Z0 d! R# u/ r 注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。6 h* l+ E! @3 w+ }: G6 `
2.2.9 键盘中断源选择寄存器0
2 A% X2 d a* @' H4 F9 o
( k$ \- Z2 ^6 I. W5 F
0 g0 A" U& K+ e0 M& j' A0 G* w
图11
6 X: h) z z5 E4 u) [/ j* Q" y 15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;
7 u# {* i3 t3 o& Y( l 14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;7 F: `$ ]4 J$ a' P; m' Y
13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;5 h9 e: f6 {/ [3 T7 n: k) Q k. \
7位:使能P07产生键盘中断;& y. l8 U" i( T# w1 h. D4 ~: Y
6位:使能P06产生键盘中断;6 }0 N$ D& O {- q Y2 l: [
5位:使能P05产生键盘中断;
) `. n- u/ O/ P5 i* ~$ {: ~0 s9 C 4位:使能P04产生键盘中断;# A+ y4 n! o* q4 R2 u
3位:使能P03产生键盘中断;1 F+ X& r- { E# W% X
2位:使能P02产生键盘中断;
' V* L# z+ W i0 e) | 1位:使能P01产生键盘中断;, N/ C& Y3 g, f* m1 E6 C
0位:使能P00产生键盘中断。. @& E: N3 e% \, j! z1 D# O
2.2.10 键盘中断源选择寄存器1
6 B- A& Y* b8 K2 Q' [
# L/ d! }- }" ^+ B! r& X, h
% e0 D! p! Y) [+ j" c5 o
图12( `, K3 C- m" ~4 \( R" h- D
15位:使能P15产生键盘中断;3 _6 q+ L" [. a
14位:使能P14产生键盘中断;
7 n6 a: R3 g; X 13位:使能P13产生键盘中断;
( g, \% }' ^6 `* f. f 12位:使能P12产生键盘中断; r! ^) I; x& P6 U" G
11位:使能P11产生键盘中断;
! j4 A" g1 u" k) a! w# d 10位:使能P10产生键盘中断;
+ F$ @- B4 N d" D 9位:使能P29产生键盘中断;
0 C+ A0 r% @# |' m7 x, {3 l 8位:使能P28产生键盘中断。0 R4 ?2 B o. A+ p. @8 C$ [
7位:使能P27产生键盘中断;
# x r2 s. R: o# |, Z 6位:使能P26产生键盘中断;1 g( }3 \+ [( z, p/ M
5位:使能P25产生键盘中断;9 h% _0 r8 \. `5 z2 N9 I
4位:使能P24产生键盘中断;2 w& _+ A6 s. H( _+ \$ H
3位:使能P23产生键盘中断;
9 b" v9 Y4 ^' t8 `; L 2位:使能P22产生键盘中断;
- J! ~& H; y3 T* R$ \& d" u v# f 1位:使能P21产生键盘中断;
* n! }* q6 R f; x3 X5 t 0位:使能P20产生键盘中断。* G o: Z: x( X1 B) R* ]5 o
2.2.11 键盘中断源选择寄存器2
: z7 f6 p6 s, @# R- U# A$ B& Q+ f0 v h. S
' y! b2 [( C8 R 图13
2 K' I9 G0 ~8 j8 {$ m 7位:使能P37产生键盘中断;% R- m* s7 }2 v
6位:使能P36产生键盘中断;7 J k: \0 @' [$ q0 p' b
5位:使能P35产生键盘中断;
Y- i, [0 R( k( R5 h1 b' Q 4位:使能P34产生键盘中断;! d) l- ?6 z4 f" O
3位:使能P33产生键盘中断;
% c2 w6 ?: `3 n* O/ }" o/ L 2位:使能P32产生键盘中断;1 e4 ]# G( {" [) M
1位:使能P31产生键盘中断;
' w7 H: ?7 f0 A) c 0位:使能P30产生键盘中断。: `+ w1 }) K$ G) |" j, x
2.3 寄存器配置讲解
% [0 n) m w% n5 o1 ] d #define GPIO_IRQ0_IN_SEL_REG (* ( volatile uint16*) 0x50001400)
" \3 u+ D" E, I7 r6 g #define GPIO_IRQ1_IN_SEL_REG (* ( volatile uint16*) 0x50001402)4 z& U% ]: w& H
#define GPIO_IRQ2_IN_SEL_REG (* ( volatile uint16*) 0x50001404)- E! `& L7 Q# _* S
#define GPIO_IRQ3_IN_SEL_REG (* ( volatile uint16*) 0x50001406)) O) f. s; t! F
#define GPIO_IRQ4_IN_SEL_REG (* ( volatile uint16*) 0x50001408)/ \1 v8 m& \, Y
#define GPIO_DEBOUNCE_REG (* ( volatile uint16*) 0x5000140C), E1 T8 l1 s9 _1 n3 e
#define GPIO_RESET_IRQ_REG (* ( volatile uint16*) 0x5000140E)
$ Z& ~) e6 K* q3 i: E8 o2 L #define GPIO_INT_LEVEL_CTRL_REG (* ( volatile uint16*) 0x50001410)
/ o' e7 h, l* X( z2 N9 V8 r #define KBRD_IRQ_IN_SEL0_REG (* ( volatile uint16*) 0x50001412)8 k6 B+ F$ J Z( Q$ S1 c9 i
#define KBRD_IRQ_IN_SEL1_REG (* ( volatile uint16*) 0x50001414)( J" |5 v/ E2 Y t9 e" Y$ p
#define KBRD_IRQ_IN_SEL2_REG (* ( volatile uint16*) 0x50001416); a, e& i+ _& B) O. \9 L5 B3 X" }
例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:
; _0 v8 L# @* t. y& k5 A0 i0 @1 @% e GPIO_IRQ1_IN_SEL_REG =0x0003;( e! z1 x+ q' ]' \' Q+ Q0 o
GPIO_DEBOUNCE_REG =0x0114; _3 t9 t+ }7 d" Z
GPIO_INT_LEVEL_CTRL_REG =0x0202;
* n2 X; D3 E& j' @4 E% [5 _ GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。9 y" w/ }, R# P: M* O& w
例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:' g' u' }. c H/ Q) U0 _- X
KBRD_IRQ_IN_SEL0_REG =0x4008;
" y/ w/ K+ ~ G8 ^6 M9 F9 k) W KBRD_IRQ_IN_SEL1_REG =0x1100;
# B/ C( ?6 k8 s7 q GPIO_DEBOUNCE_REG =0x201e;7 T. |$ I' D4 y) Y% Y9 b, T
键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。
4 ?/ K: C0 P* G j6 c0 M2 @; X* w3 e x8 n
$ ?' g& ^* a6 S: y/ _, D6 Z 第三节 中断实验0 u: v0 b& n ]" C7 I* _) v
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。( `" [1 E4 v' {, J2 w# f& E; G
使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:# V& h* t/ Y+ ^* q; R# U! t/ [+ K& x* r
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:6 l) l$ J4 {$ m) a
, a+ M) T1 H0 j
% V Y& r; E2 v3 q& g. Y
图14: } ]4 K( p |) Y' y
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
1 a/ F. O1 ]) `0 Y
4 ?* w" I! x+ M& S
& d7 P) o5 B& z3 L. `2 } 图15/ _' k5 b8 Z; M4 p, e8 v
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
; l5 z6 [8 x; f7 l# [ 打开中断实验的Keil工程blinky.uvproj,位于目录:% t1 N8 Q# j0 c$ H( \' c$ A
..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:( S7 Y+ O' P N+ o
, k% M8 R0 k0 ?/ ~6 Q) N
/ q, g/ ], R6 [/ R) ?" H8 P$ s 图16& A$ V7 C- J1 h
在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:
2 v/ h8 U1 `; W4 i* C0 k m6 }- H, M! N4 ?
4 R- v6 k2 ^) P: u+ f6 g
7 a& B* R5 ~# }- ?( N u6 b
! Y* S2 W% k/ _
图178 r4 |1 a" U$ @( D* F w
全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。' d7 q2 c; i2 f( v
+ x$ c) r% X+ b) o3 U' f: Y6 K7 C, A# Y) ~# Y
r- ]. Z, Y" D, m) `1 `
配套资料:http://www.fengke.club
1 i: P) S7 U" X0 k7 N g! i& K 套件地址:http://shop115904315.taobao.com/
# i4 Q" w* @- a 文件下载请点击:
中断教程.pdf
(1.09 MB, 下载次数: 0)
9 h U' e' Q3 {5 u% c
3 b* p- i' {' Y% z4 c( u) f w# a) q- V1 f
9 |+ {2 _" v% {
|
|