|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2022-8-31 13:46 编辑
% x# x5 [5 V" o! d7 x7 y3 q: D6 f3 D( t9 P2 R2 z6 K" D
——疯壳·开发板系列 串口实验教程 9 n7 ?$ H; c2 y- Y0 k2 y
( w& Q6 a2 c' @! Q2 Z4 d( o/ C. E6 b$ h2 h5 c0 _. l0 @
6 f8 a% c( O: \
U8 c+ n3 C4 b9 X% X$ ?$ f
图1
' i) d1 ~4 ~7 P; u3 F
1 n+ R; v2 [2 N7 c2 @- e ]! y( g3 @
$ P. ~7 x, W& }9 t* S* I0 E; T g' c
第一节串口硬件电路, G1 A- F) e! V. o1 |+ v
' @/ l$ p( D! X( A4 x3 I) ~0 k9 Q/ N
串口通过USB口及手环下载调试线引出,连接mcu的P12与P13引脚,如下图所示:
( t# P7 e0 n, w5 A) _- m
4 K6 F* t4 i5 g* v$ j; n
3 `# W6 B4 H' K* k1 Q7 ^+ ~
$ o; F" }5 G. h1 L图2
; U( i" u( Y* z/ D9 K8 _# S& E" E; K, C w3 x( P' n1 Q; h9 t
6 v1 M$ Z9 I3 X0 j8 c
/ R/ q' p( J1 s" N) ?' h+ L y3 K( z7 P
第二节 UART寄存器: P1 E( F1 U) g& V
3 \8 f7 ~' w% l) R, Z+ L
2.1 UART介绍7 [6 C7 ?5 K0 p% r# x
这个UART符合工业标准16550,并且可以和外围设备串行通信。主设备(CPU)通过APB总线将数据写进UART并且被转换成串行格式并且发送到目标设备。串行数据也可以通过UART被接收存储之后,主设备读取接收的数据。 D! ?$ v5 H+ d3 o5 I' D+ E
UART模块不支持DMA,但是它有内部FIFOs,并且支持硬件流控制信号(RTS,CTS,DTR,DSR)。5 E9 ^9 A) [6 F- @+ [, y+ r7 A
UART模块有16字节的发送和接收FIFO;支持硬件流控制(CTS/RTS);影子寄存器来减少软件开销并且有可编程的软件复位;发送寄存器为空的中断模式;IrDA 1.0 SIR模式支持低功耗模式;可编程的字节属性、校验位和停止位(1,1.5,2);可以断开通信及检测通信线是否断开;中断优先级的识别;可编程的串行通信波特率。6 |1 ~. h, c, x& f7 ?
2.2 UART寄存器
# k' b8 m7 x- z5 J: Z/ q. _UART相关的寄存器比较多,所以我们只介绍常用的寄存器,其它的可以参考官方数据手册DA14580_DS_v3.1.pdf,位于目录:..\WT开发板\硬件资料。, F! }& ^- d5 v
2.2.1 接收缓冲寄存器( @4 I3 ]2 v2 `9 [* P/ ]3 {6 w
& v& T! M+ K1 {4 k* _$ _9 Z
0 P* F) _. r3 j L9 S0 ^& t) W
( T5 S$ R8 j+ X' ~8 O) K2 L
图3
& b/ h9 Z" x9 S* n15:8位:保留不使用;; {3 D0 M/ c4 J3 f5 I. @2 Y
7:0位:接收缓存寄存器。$ q3 q/ l! [1 l* o
2.2.2 中断使能寄存器
) \+ O$ w) _/ r! \5 A8 H4 h
+ f4 i! g# i/ i$ n6 p
! F6 M3 \$ @. ?
! O' ~" U$ M* K0 F! ^
图4
) s8 t3 j% c0 T" o' I' M15:8位:保留不使用;' a0 M; [7 h' g, M% E! y
7位:发送空中断使能位;
8 |) Q: V0 N. s, F8 m2 R6:4位:保留不使用;$ w$ f( i2 F0 o. n' @: Y& @6 U
3位:调制状态中断使能位; K1 c. n$ Q' R0 e4 K7 _* i
2位:接收状态中断使能位;
, g8 C* v j4 o9 j- k1位:发送结束中断使能位;; E4 J" U" `: e
0位:数据接收完使能位。1 m$ ^! A% U& [; D# S( S
2.2.3 中断识别寄存器/FIFO控制寄存器
7 X$ D* K4 N" W: p3 b3 h' `0 x- y, b
- x$ `5 N6 x9 q0 e2 q: S图5
, p- Z$ d1 @! L3 o. J15:0位:写则为FIFO控制寄存器,读则为中断识别寄存器。
" |1 m* h' @, u n) _- w* f2.2.4 通信线控制寄存器
7 @9 |, z. O! d
- M v7 E8 [8 Z9 q3 W' Y% m8 g& r1 p
: F7 [: i4 B- B9 F1 x: Q) I8 y3 y, F图6
% V% x9 M6 t; j! o) ^5 v* j15:8位:保留不使用;: A6 w" P3 S- L, H
7位:波特率使能位;) O$ O( ]: `+ Z6 Q
6位:停止控制位;' D& K# v5 S: q6 |/ z
5位:保留不使用;* j% `" `0 r9 S* t; z
4位:奇偶校验选择位;
" a; ? R6 n3 ]6 M' ^6 t. u; m3位:校验位;7 X# p/ k4 z8 \5 r( P7 j; |* [
2位:停止位; x4 a9 x: ?. Q3 i& O
1:0位:数据长度。+ ~ }& m, m2 }$ ~# a* ]
2.2.5 调制器控制寄存器/ J. \, \/ b) R# [1 a5 T$ D
+ k, m' V! {7 A" n, B7 G! F, ^
6 D- J; l0 S2 P/ S# Q/ E
* ~, w z: L: ~% w$ g9 c: u
) g( J" F: o8 K4 r$ ~+ }& W2 g
图7
4 v& g2 O' r7 s1 m5 C15:7位:保留不使用;' Y2 Z, F8 D- u9 X
6位:红外通信使能位;
7 I. S$ y; k9 r5位:自动流控制使能位;4 o+ ]+ _ U9 ]) q, `
4位:回路位,用于测试;
8 |7 F: W3 j- H7 }3位:用户指定输出2;
) U* e `' G# e* w1 L! j2位:用户指定输出1;
6 P" `8 E8 ]( e; h1位:发送请求;
4 F3 v8 ^1 n3 h" L7 z0位:保留不使用。- C3 X% ]& O3 }1 Q0 c$ T
2.2.6 通信线状态寄存器
. v: K* [1 a" t/ Q5 Z! @% a/ z8 o* p ^
; h' X6 a; z( }0 x& V3 ?% E
A5 g3 V0 m" M u/ j$ V" f0 |. [
, U, K6 ~3 S4 j% _! B! q8 V/ d图80 n4 R. w+ `* c1 q4 {( S' y) _
15:8位:保留不使用;
2 b+ V0 O5 q( G. V- g8 p: p7位:接收FIFO错误位;+ f; c; d- s- n4 H6 K5 `2 l9 M
6位:发送器空位;8 n i( t' {' p3 s; d
5位:发送保持寄存器空位;
7 u1 R- h: W# S4位:异常停止中断位;1 \7 D5 B: d) Q
3位:帧错误位;4 x$ _4 ~8 I( Z2 ]7 d; T
2位:校验错误位;8 Y; V+ ]6 j/ O |" i
1位:溢出错误位;
% r* l% B0 j7 w' L: Z0 w5 \( g0位:数据准备好位。
- _( U- h5 ?* `; p2.3 寄存器配置讲解
4 ?# Z( T6 ?. L ~! C#define CLK_PER_REG (* ( volatile uint16*)0x50000004)
, U/ k: B- l8 f) X. g/ ]9 U+ b1 I#define UART_RBR_THR_DLL_REG (* ( volatile uint16*)0x50001000)
9 \ O" j$ C6 c" F* k7 {* L#define UART_IER_DLH_REG (* ( volatile uint16*)0x50001004)4 X* ~$ y) {2 V
#define UART_IIR_FCR_REG (* ( volatile uint16*)0x50001008)" P2 p9 f8 E5 i+ y! m8 }. Q6 k# X
#define UART_LCR_REG (* ( volatile uint16*)0x5000100C)7 ~. }; ]$ R0 a- {* b9 h! s0 M' |; c
#define UART_MCR_REG (* ( volatile uint16*)0x50001010): t& f4 h3 D+ x" m
#define UART_LSR_REG (* ( volatile uint16*)0x50001014)+ s0 E+ w, o" m+ o0 C- z4 U5 Z* Z
#define UART_MSR_REG (* ( volatile uint16*)0x50001018)
/ P3 W% {; [3 B. t+ b#define UART_SCR_REG (* ( volatile uint16*)0x5000101C)
' X& k6 R x, ]' m' u) p$ A启动UART1模块的时钟CLK_PER_REG |= 0x0080;$ e3 Q# q1 U, j- d8 X( m
串口初始化寄存器配置:6 W- b/ Z4 b% @# J2 \; ^1 n
首先使能波特率配置UART_LCR_REG = 0X08;
, O2 z% i7 p9 _& e3 g配置波特率UART_IER_DLH_REG = 0; UART_RBR_THR_DLL_REG = 9;
6 h, f1 M0 ^3 d/ Q7 A# L8位数据,无校验,1位停止位UART_LCR_REG = 0X03;
# {+ H) p" V% h' V6 M7 U关闭红外通信功能UART_MCR_REG = 0X00;* x! Q1 p g' T f* E: d
使能FIFO, UART_IIR_FCR_REG = 0X01;
* q7 q, ]3 x5 ?1 Q& b2 L关闭中断UART_IER_DLH_REG = 0X00;7 K, O3 I9 V* y; q9 f
接收一个字节,等待接收完成while((UART_LSR_REG&0x01)==0);读取接收数据rx_data = UART_RBR_THR_DLL_REG;
5 i4 O$ N- R; V/ h1 j& o发送一个字节0x55,等待发送为空while((UART_LSR_REG&0x20)==0);填充发送数据UART_RBR_THR_DLL_REG = 0xaa;: o- |" R2 g% s4 D
: K8 u0 @# T, B+ r/ n% D
, Q+ I4 Y( S9 S3 l6 ^9 G3 k$ m6 }8 A" q
! ?' J: s. s4 G3 |第三节 UART实验$ i- Z( K6 J5 w
实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
1 @* E" H( O3 ^& C8 z, {使用USB转串模块连接手机蓝牙串口,连接方式如下:( @3 U1 k2 ?: q( } d4 B
(1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
9 d" s( P) P) X1 g v
7 z7 V' \5 R7 x) m9 i6 W5 y
& [0 ]* i2 M- l2 R8 E9 J图92 K/ R. G. W! x# P9 j0 D) q( Y* r
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示: Y% |$ `7 }) L. M! I
6 E7 K8 r8 R" f/ t u q
6 X( N, x$ N% C( I. h
图105 v: B6 x( l: \; N1 s% G; X0 F
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:/ y* u( T. J b$ i$ ~
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:, [0 q: D& k& O1 ^& {% g
8 T% f/ a! [; Q2 c
; Q9 U# {! j; G% W T
图115 L$ x" v0 P7 W
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:) ^% i T' S8 g7 P E1 {
3 I0 K* S& P/ Q9 c. ~
9 K* F: P: T, [* {- U
图12
9 p& ~8 V) T7 \+ S将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。- E; K6 s1 Z, a5 Z
打开串口实验的Keil工程uart.uvproj,位于目录:..\WT_Mobile\1.初级教程\DA14580\2_初级_串口\projects\target_apps\peripheral_examples\uart\Keil_5,如下图所示:
- O: p: }; c u: V7 r
6 d" k+ m9 g" r% D, R C" A
( B2 e/ }3 Z/ d* d" [, ~
图13% d; N4 p& B) ?+ a& H5 X, j
打开串口调试助手连接串口,波特率为115200。在KEIL中,编译代码,点击DEBUG,然后点击全速运行,就可以看到串口调试助手打印出的信息,发送什么就返回什么,例如发送“WT Mobile Test!”就会返回“WT Mobile Test!”,如下图所示:% Y2 i. _: [$ v: ~" U
; C/ a, Y; C" F7 `9 b, B$ b
; |# n, P$ m0 u
* l5 C) m/ O6 X5 V) H1 |. M
( m9 j+ k( P: x$ [7 L v图14
6 c2 b' K3 d2 u8 ^+ Z' [% e, ^
* f' H$ @; k' H* s; D# k; }% p8 g* x6 o- A
3 X v& K: J! l3 ~7 t. V
" M3 p6 J" i1 ]9 c: ?) S7 c
0 X% }# P. Y% `+ q; v3 x
& O- k' I% h/ `7 v文件下载请点击:
串口教程.pdf
(1.43 MB, 下载次数: 0)
, s8 _- s; h4 |4 a( ^+ H. y7 g+ Q1 D1 C3 V* ~: Z' _
|
|