EDA365电子论坛网

标题: 【开发教程8】ARM功能手机-中断实验教程 [打印本页]

作者: FutureX    时间: 2022-6-21 18:46
标题: 【开发教程8】ARM功能手机-中断实验教程
中断实验教程
——疯壳·开发板系列

  O; g4 x5 ~6 p( K( `1 D% W! g" a/ r# e4 }  ^/ M$ u3 m9 W+ @, Z
   
& P  Z3 a" h$ I8 O/ h& g    图15 r+ }( Z% Y7 _
  |) G' e8 A& K. \2 p' ^7 j. b" r
    第一节中断硬件电路
9 ~( p* i0 B: I. W* K( Q    将P12、P13配置为中断输入口,P12和P13已通过排针引出,如下图所示:3 w  @/ G8 {# ^

8 t+ o+ m& ^, p9 ]- x& x   
; R, G, C+ J7 v- e- J- r8 F   / G% @' z* ]- C
    图2, ?9 g7 Q. ^- P) A3 V
) h% U! [: B6 I) F1 h
9 x/ R; ~1 @# |  \) J# p
    第二节 中断
, j3 z. z. l8 @6 `% p+ l  M* w# P7 j    2.1 中断介绍
2 D3 R. G4 ^/ y        芯片内部有嵌套中断向量控制器(NVIC,Nested Vectored Interrupt Controller),支持24个中断,能够中断配置与处理异常代码。当发生一个中断请求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有4个不同的可编程的优先级,NVIC自动处理嵌套中断。对于安全关键系统,有不可屏蔽中断(NMI,Non maskable interrupt)输入。$ Y- W+ V- D8 Y9 p$ E
    DA14580内部有一个键盘控制器,可以用于延时GPIO信号进入的时间。可以检测所有的I/O口的电平变化。当检测到信号时,可以产生中断(KEYBR_IRQ)。同时,另外有5个中断(GPIOn_IRQ)可以被GPIO口触发。
: w6 p% g, O. G" ~+ B3 w    2.2 寄存器介绍
4 k# V' d0 Q' b: s* w0 M) r    2.2.1 GPIO_IRQ0中断源选择寄存器
2 ~. g# K" V% q9 C1 V& Q' U- g! a7 W. G: M$ P" b
- L$ g. Q: v! n/ u
      C- H7 b) T- ]5 [2 u( ]! Y+ K  |
    图3: ^! Y3 z5 k) `- B! A6 i0 e
    15:6位:保留不使用;6 W) k7 C) E: J+ m4 h- P0 C( z
    5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
" b$ V/ c, G1 E9 d1 n    2.2.2 GPIO_IRQ1中断源选择寄存器
! ^: y# w. d: D
" O7 f' k0 L3 I$ g- [4 Y; Y    
" \5 F7 h8 u3 w  O8 k2 Z    图4- O; M: j" }% Q2 g( o5 o
    15:6位:保留不使用;
4 X3 e" X' L+ C% r2 v    5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;
2 D9 r1 R* B% }4 v    2.2.3 GPIO_IRQ2中断源选择寄存器
. R, J5 m' }4 c0 W% e+ U3 @( m6 A$ H2 c1 x8 o0 k  r
   
% T2 N3 X) M: o$ @! ?    图5; v; x: D7 ?0 N% A
    15:6位:保留不使用;; y9 w$ u! M  R8 p+ R) E
    5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;4 I; x* ^5 W9 P; C( O0 e" A9 ^
    4.2.4 GPIO_IRQ3中断源选择寄存器% j1 o+ y, p) K# Y* @
: v! x5 l! A9 h8 U# s
   
; A3 S9 R4 K$ L    图6
) |- x1 S. M# }    15:6位:保留不使用;
3 c2 s, M) x' {$ t% g5 g3 o1 d    5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;1 W" p# d1 \" F& c3 w5 [3 ^
    2.2.5 GPIO_IRQ4中断源选择寄存器, L$ @* L; d; ~6 a
6 D( Q9 O8 p+ Z1 Z/ Q
   
/ E% [. s. f9 W    图7' U" C6 Z6 j0 J( o4 U  e6 |) J( p9 f2 O
    5:6位:保留不使用;
# j2 ]" m1 `) {8 A( L9 p    5:0位:中断源选择,1~32分别对应选择P00~P37,其它值不选择任何引脚;2 W9 h! I) [) a7 @- a
    2.2.6 GPIO延时寄存器- \. S. G; W/ m5 c% M2 h1 c
  @# R. M( [: f& v9 }& Z; d  ^
   ' G$ J0 @# t1 a  J( G  W1 d3 s0 ^. `
    图84 {; ]3 g. M) t0 }
    15:14位:保留不使用;
3 l% n4 d& Y- _5 E( R! [" Z2 H    13位:使能键盘接口延时计数;
# V7 ?- h7 @) L0 `    12位:使能GPIO IRQ4延时计数;2 F) r4 [; c8 J/ `
    11位:使能GPIO IRQ3延时计数;
* s0 e4 h3 w6 o! r    10位:使能GPIO IRQ2延时计数;
" H: P% H8 E* G# K5 c/ G5 @- l+ Z/ W    9位:使能GPIO IRQ1延时计数;" O; c; P1 l# v8 B+ X
    8位:使能GPIO IRQ0延时计数;+ ~- F0 {* T, ]+ d2 _
    7:6位:保留不使用;4 s. M1 R% F6 |! U$ }1 G/ h
    5:0位:延时值,为N毫秒。
) _: m# j- n* S; ~8 d6 b& K7 n    2.2.7 GPIO中断复位寄存器! z5 R. l) ^+ n9 X2 w+ f

  N( M3 S8 {# N4 I    0 I  e' s' R5 J; }2 r, f$ S
    图9
: P9 Q3 u9 m6 J: e3 ]+ @5 _3 ]    15:6位:保留不使用;
' l! P$ j: p# X1 k8 W, V- o    5位:对该位写1,则复位KBRD中断,读取返回0;
. Y' I/ j& B1 T8 J3 }    4位:对该位写1,则复位GPIO4中断,读取返回0;
+ [4 w' P. j  T0 f    3位:对该位写1,则复位GPIO3中断,读取返回0;
+ `2 K4 h% }* v: G    4位:对该位写1,则复位GPIO2中断,读取返回0;
. T; ~- r( \  x1 ]- r    1位:对该位写1,则复位GPIO1中断,读取返回0;
" w( u' J4 `8 ~8 T    0位:对该位写1,则复位GPIO0中断,读取返回0。1 i& O" b, b' k' k/ l) \2 t
    2.2.8 GPIO中断电平控制寄存器
  N0 c' z- o& }
: C) W7 D0 r7 t- D 6 b$ F" \% C" K
   
0 A( L; s! a4 A8 e    图10( \) X9 a+ F4 B% r. B0 _% `
    15:14位:保留不使用;$ T" ~; g4 [- q3 T+ r
    12位:在复位GPIO中断4时不需要等待按键释放,所以一个新的中断会立刻产生;8 d5 Y- b! v& [" Z0 [
    11位:在复位GPIO中断3时不需要等待按键释放,所以一个新的中断会立刻产生;* B' }  B. I# V" Z5 Y" e! r+ k; h' H* q
    10位:在复位GPIO中断2时不需要等待按键释放,所以一个新的中断会立刻产生;0 L7 w. _! |* G: p* c$ w
    9位:在复位GPIO中断1时不需要等待按键释放,所以一个新的中断会立刻产生;" ~7 `" g. ~. C$ h
    8位:在复位GPIO中断0时不需要等待按键释放,所以一个新的中断会立刻产生;6 v7 O# ?4 L; Y, J0 U
    7:6位:保留不使用;* e) R0 f! X" ]/ E0 L" ?
    4位:为0则表示输入高电平产生GPIO中断4,为1则表示输入低电平产生GPIO中断4;
) \! ^# M# E6 t9 Y8 ^/ N    3位:为0则表示输入高电平产生GPIO中断3,为1则表示输入低电平产生GPIO中断3;1 i; b. [2 L' f+ R
    2位:为0则表示输入高电平产生GPIO中断2,为1则表示输入低电平产生GPIO中断2;
! h* Y% z  p" k; t    1位:为0则表示输入高电平产生GPIO中断1,为1则表示输入低电平产生GPIO中断1;
& K$ ?9 o$ I4 X6 }+ ?. b' M    0位:为0则表示输入高电平产生GPIO中断0,为1则表示输入低电平产生GPIO中断0;& n; q/ s8 K8 h' C
    注:数据手册中该寄存器中没有标注13位和5位,可能是勘误。
( n9 k6 ~# Z8 ^4 a3 z    2.2.9 键盘中断源选择寄存器0
5 }1 g: C. g7 ?) B) F- y1 J. A& H# R* z, D2 t$ V6 E* g
   
2 b9 D2 u) T% e- _+ b% _/ k$ i- s    图11
) [  [6 b# E1 M1 V% j3 C& O0 p    15位:为0则表示按键释放不产生中断,为1表示按键释放也产生中断;3 N7 }3 ]% s+ |, J
    14位:为0则表示输入高电平产生KBRD中断,为1则表示输入低电平产生KBRD中断;
. `  T: R  b6 @    13:8位:当按键按下,在不等于0的规定时间之后,自动产生重复按键中断,为0则禁止定时器;* B5 n) ]% q- C' {/ J  B
    7位:使能P07产生键盘中断;
$ X6 L  |) Z4 u( m    6位:使能P06产生键盘中断;  w4 B0 t& I0 g. ~
    5位:使能P05产生键盘中断;  p5 m, Z) T3 W6 B# ]
    4位:使能P04产生键盘中断;6 N+ a' z6 N9 Q3 r9 a
    3位:使能P03产生键盘中断;
7 T  u! y7 B0 \: K0 f  ]# r  Z2 }! I    2位:使能P02产生键盘中断;8 C) q: X! R3 [) q' w
    1位:使能P01产生键盘中断;
% v5 j4 z" ]4 M! U1 Z* k9 X    0位:使能P00产生键盘中断。
1 s! [( w$ O0 @1 m) L* W8 m    2.2.10 键盘中断源选择寄存器1
: Q) J. S# l3 {% A! F) P4 Z  D' G* @
   
/ z' I1 G6 H9 {! f) h, I* r/ T    图12" p- U, s/ H/ ?! R& c
    15位:使能P15产生键盘中断;
- o# @4 R/ Z9 }( M1 d    14位:使能P14产生键盘中断;/ C% |. e. C5 k
    13位:使能P13产生键盘中断;
( [1 v$ g" M  `4 L6 U# ^" D# C    12位:使能P12产生键盘中断;
( u  _9 E% y  O+ F    11位:使能P11产生键盘中断;8 R0 s* s6 c( D# m
    10位:使能P10产生键盘中断;; x& H* i' L9 t3 `) e/ Y
    9位:使能P29产生键盘中断;8 |( Z  Z, N3 z+ m9 g# @
    8位:使能P28产生键盘中断。
1 x3 u2 p$ p; i    7位:使能P27产生键盘中断;2 P1 @' E* S) o8 L
    6位:使能P26产生键盘中断;" h, N1 ?  ?7 e
    5位:使能P25产生键盘中断;
& _9 {; T3 _$ ?. V! P% x& m    4位:使能P24产生键盘中断;
# W9 W9 T8 k) v    3位:使能P23产生键盘中断;" j' \& m2 r- Z
    2位:使能P22产生键盘中断;
; J% Q8 G6 |0 `3 z, A- D' R4 |8 m    1位:使能P21产生键盘中断;1 r5 P% Q3 v" u5 |1 f5 ?- d) u
    0位:使能P20产生键盘中断。
9 ~* g% T" `6 \6 E0 Y- I; j    2.2.11 键盘中断源选择寄存器2
7 x" ~0 d$ j# l( ?) K3 c
. U5 D) n2 Z# {) a: p! h    0 L: ^6 I$ ~% D# E5 N
    图138 l% {! I  l, z, ?0 h5 `- t
    7位:使能P37产生键盘中断;8 @& O2 C( R, E$ @, u0 h5 g/ R
    6位:使能P36产生键盘中断;
; P( ]4 u. ?# x' T, d! \& \, q    5位:使能P35产生键盘中断;
6 h7 A! `0 J% _1 m7 v    4位:使能P34产生键盘中断;! X. X3 k7 D3 `% M3 g/ V' b  ~# P
    3位:使能P33产生键盘中断;
! e, _9 U0 n' V, u    2位:使能P32产生键盘中断;
, E# ^+ u$ |- F  d" X    1位:使能P31产生键盘中断;! y" U7 x# x! ]( E% f  ^
    0位:使能P30产生键盘中断。
3 L3 O. d  S2 ?" u# R. |5 @- ^9 O0 h    2.3 寄存器配置讲解9 w. B- D! d3 d$ @# q' s
    #define GPIO_IRQ0_IN_SEL_REG        (* ( volatile uint16*) 0x50001400)
3 b5 G, \% t9 G' T9 d' ^6 }4 W! {- A    #define GPIO_IRQ1_IN_SEL_REG        (* ( volatile uint16*) 0x50001402)
) e( l6 r: N: i. f    #define GPIO_IRQ2_IN_SEL_REG        (* ( volatile uint16*) 0x50001404)- u" k3 Y) G* [/ ?5 W4 r5 K8 {
    #define GPIO_IRQ3_IN_SEL_REG        (* ( volatile uint16*) 0x50001406)
3 j- }' z6 P0 R7 E9 A7 v4 Q! A( u    #define GPIO_IRQ4_IN_SEL_REG        (* ( volatile uint16*) 0x50001408)
, q, |2 y: D$ z0 m7 D/ A3 m    #define GPIO_DEBOUNCE_REG         (* ( volatile uint16*) 0x5000140C)' q. q) q; b$ p( `
    #define GPIO_RESET_IRQ_REG          (* ( volatile uint16*) 0x5000140E)6 x7 V) c0 G5 g
    #define GPIO_INT_LEVEL_CTRL_REG     (* ( volatile uint16*) 0x50001410)
% z" w( O* r/ M& w: h3 S1 Z. }    #define KBRD_IRQ_IN_SEL0_REG        (* ( volatile uint16*) 0x50001412)
" W% x1 \' E# P* f7 }    #define KBRD_IRQ_IN_SEL1_REG        (* ( volatile uint16*) 0x50001414)
( X" J) B3 e; I. E% |    #define KBRD_IRQ_IN_SEL2_REG         (* ( volatile uint16*) 0x50001416)9 g1 R2 J% O' ]( S3 w, O
    例1:P02为GPIO中断1的中断源,延时20毫秒,高电平产生中断,等待按键释放,如下所示:& N6 U( R: S( ]" p! o  p' A4 ?' m
    GPIO_IRQ1_IN_SEL_REG =0x0003;3 g% O* l3 b0 D3 g' I+ E
    GPIO_DEBOUNCE_REG =0x0114;
! [# O5 ]+ F/ o  v    GPIO_INT_LEVEL_CTRL_REG =0x0202;( S+ W9 N! f' [/ z0 m
    GPIO中断1配置完成,在GPIO中断1的中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0002;这样才能进行下一次中断。
6 s( p  c( K2 q& P    例2:P03,P12,P28为KBRD中断源,低电平有效,释放不产生中断,不重复触发中断,延时30毫秒,如下所示:- t6 C: H& L3 Z* Q4 w7 W) l
    KBRD_IRQ_IN_SEL0_REG =0x4008;  n: y% o/ W4 @' v9 x4 }% z
    KBRD_IRQ_IN_SEL1_REG =0x1100;
5 E& y0 Z  {# I- w# {2 `    GPIO_DEBOUNCE_REG =0x201e;
% K2 T5 t' ?$ j" b( Y6 `4 N    键盘中断配置完成,在键盘中断函数中需要复位中断,需要添加语句GPIO_RESET_IRQ_REG =0x0020;这样才能进行下一次中断。0 P& c8 r/ M+ ^- T( d
* h. C5 q% M& W. [  a
# D* d+ c6 K/ z3 ?) N
    第三节 中断实验- S6 I& Y4 _/ r9 O0 X. S' ^
    实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、3.7V锂电池或Mocro USB线。: V' v1 l8 F. ~) n4 M$ v
    使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:$ J8 G' P9 `8 Z2 f0 J  S9 E
    (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:2 @/ h" W+ B3 ]  v) J9 r# g: Z

" P0 f+ r8 Q4 ^2 }    
7 b3 i! e9 {5 R- A) S; F    图14. L1 V# W6 c& V- D( Y$ e
    (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
9 P) z# _: L& N. S, C7 O2 l/ b' u7 Z6 Z
    8 E0 G& F5 V" Z+ K4 H) [5 I
    图15
) C8 C8 ~9 I9 k5 g4 h    将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。% u7 `/ [( F" e% v+ R- E
    打开中断实验的Keil工程blinky.uvproj,位于目录:) o$ o' d* G* s
    ..\WT_Mobile\1.初级教程\DA14580\4_初级_中断\projects\target_apps\peripheral_examples\interrupt\Keil_5,如下图所示:5 m5 e( @5 g% b7 A3 ^
; M$ S2 \# a+ M. u! M/ Q
   
( A9 ?: k0 x  {7 j' U# e' @    图161 N) T! T% x# x( E3 }( r! s2 @1 k
    在KEIL中编译源代码,点击DEBUG,然后点击全速运行,如下图所示:! S$ Y9 O. R$ ?' i% ?7 L0 R

# H" \! h" y& e. K- ~- k) M
; f+ h' ^' b  _# N
: ?# G& P0 I% r0 L& o1 z" D    
4 L5 H; z- k5 q0 r$ ^4 M& l    图175 H+ F7 e2 M8 R4 |- J
    全速运行之后,将杜邦线的一头接在3.3V引脚上,另一头碰一下P13引脚,即可进入P13对应的外部中断,执行中断内的程序(点亮LED),碰一下P12引脚,则进入P12对应的外部中断,执行中断中的程序(关闭LED)。注意:因为中断触发方式为边沿触发,碰上之后再断开才有效。/ U* i5 a/ M7 O! L" U
4 d0 ]+ q- L% }
2 m) _5 p' @; c9 [4 R6 {
) g7 L$ g0 s* `* ^/ n$ V
    配套资料:http://www.fengke.club
) r. j( P, j5 a7 t    套件地址:http://shop115904315.taobao.com/
8 ^9 G4 d/ c& q( c    文件下载请点击: 中断教程.pdf (1.09 MB, 下载次数: 0) - p' U8 `# l3 P1 F$ `0 N
8 T% k0 l! h' Q, O9 c8 H, b/ O9 L
) \8 f8 }$ ?7 ~+ R6 `- C& r

作者: fantasyqqq    时间: 2022-6-22 11:27
支持24个中断




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2