找回密码
 注册
关于网站域名变更的通知
查看: 185|回复: 2
打印 上一主题 下一主题

【疯壳·ARM开发教程6】ARM功能手机-中断实验教程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-31 11:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Heaven_1 于 2022-8-31 16:08 编辑 + |! g9 W# @: N/ K8 g
$ t% _5 b0 O2 n- c$ `1 J; }
ARM功能手机
# \' 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$ ]$ |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-26 23:34 , Processed in 0.140625 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表