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

ARM7串口编程要点

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-22 14:32 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

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

x
一. 串口编程的硬件原理
; p5 L' R' T/ ]! a( D7 t1. 串口特性:! t: w$ A/ L' h' s- o* D# J
1>16字节接收FIFO和16字节发送FIFO( p; W- x1 Q( {$ b3 z
2>接收FIFO触发点可设置为1,4,8或14字节。; T5 l9 b6 a2 u6 l6 Q" }: }% L
3>内置波特率发生器。" ~" k+ l# t' Q: d- V
2. UART0引脚:, i! R. D; \+ R0 o
1>RxD0 引脚用于UART0接受数据,接受方式为串行输入。8 ]5 c6 \* x) o( p
2>TxD0引脚用于UART0发送数据,发送方式为串行发送数据。& p; l- W' ?0 k
3. UART0的结构和工作方式
6 d' j0 ~/ l/ x1 z! i5 x$ {. z先看图在说明:
; z$ R# U6 a5 j) d$ m

: K  v' g* @6 `' c; |1 c1> VPB总线提供CPU与UART0之间得的通信连接
5 ?7 O, V$ p1 G(CPU内核通过VPB接口对UART0的寄存器进行读写访问.)
% f; Z* o& J! y* j+ O7 f% I2> UART0 接收器模块监视串行输入线RxD0的有效输入。UART0 接收单元的移位寄存器(U0RSR)通过RxD0接收有效的字符。当U0RSR接受到一个有效字符时,它将该字符传送到UART0 接收单元缓冲寄存器FIFO中,等待CPU通过VPB接口进行访问。
" h$ v9 Q& M6 a- n3> UART0发送器模块接收CPU或主机写入的数据并将数据缓存到UART0 的FIFO或U0THR中,UART0发送模块中的移位寄存器(U0TSR)读取U0THR或FIFO中的数据并将数据通过串行输出到引脚TxD0发送。. l  J1 E% p; m5 n8 p
4> UART0的接收模块和发送模块的状态信息保存在U0LSR中。' Z* N- I; Q6 a8 B, W) e
控制信息保存在U0LCR中。/ n) |: h& \: m$ r0 L& H
5> UART0波特率发送器模块产生UART0 发送模块所使用的定时。波特率发生器模块时钟源为VPB时钟(pclk)。主时钟与U0DLL和U0DLM寄存器所定义的除数相除得到UART0 发送器模块使用的时钟,该时钟必须为波特率的16倍。* d# Y3 O4 [8 `. C9 N0 {3 V
6> 中断接口包含寄存器U0IER和U0IIR。中断接口接收UART0发送模块和接收模块发出的单时钟宽度的使能信号。
( K8 S! @0 N" s; t" j1 r% D4. UART0和ARM7 CPU之间的通信过程
. Q7 M1 J  B. |, y1>CPU通过UART0发送模块发送信息给外设
+ Y/ G# e. v  `6 e' Gl CPU发出信息通过AHB总线到AHB-VPB桥
" x( S3 p2 x+ ml 通过AHB-VPB桥把信息转换后发送给VPB总线。
# S9 a: O& N2 r+ N, O4 ^l UART0接收模块接受来自VPB总线的数据。并将数据缓存到U0THR寄存器中。
+ f- k, M# q/ ]l UART0接受模块的移位寄存器U0TSR读取U0THR中的数据 并将数据通过输出引脚TxD0发送: `7 ^3 m* e- }6 x7 H, e
" k6 u5 _% u( g, F6 G7 D( t
2>外设通过UART0接收模块向ARM7 CPU发送信息9 Y1 \: G& C/ {7 b4 j/ z
l UART0移位寄存器(U0RSR)通过引脚RxD0接收有效字符。: C& J  L8 {9 X  c& ^% p& [( T9 P
l 当UART0接收到一个有效字符后,通过读取U0RBR寄存器可以将FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。
: H1 Y. y( _- x( v. h; |& c! wl VPB总线将缓冲寄存器(U0RBR)中的数据通过AHB-VPB桥传到AHB总线上4 m* j4 i; i9 O$ z+ j
l AHB总线将数据传送给ARM7 CPU. V1 N7 Z; A' }4 g8 q6 h8 z$ e

) W0 b( b: }4 [5 y% S) y二. 轮训方式的串口编程
( v- r' d$ |7 Y1. 串口程序都有那几部分组成
/ y6 [! h) W% W6 J) K看图:
9 o6 h$ i, r2 g: u; A
& G0 T; V, `. H9 t2 i0 n
1> 串口初速化
5 ^: `+ U$ [% q2 v( x5 t- NA. 串口初始化的流程
, Y3 B+ i! H" h3 C0 g( g) cl 设置I/O引脚连接到UART0& a8 N' Q4 i0 N/ f9 w
l 设置串口波特率
. e5 O2 j2 Z7 B* l0 _# ^/ U0 Ql 设置串口工作模式
- a, {" C# Z% l4 H4 N$ H2 j, h; sB. 串口初始化需要设置的寄存器
7 e8 s$ ?- v( r3 }1 J: B* j$ ~! s- Nl U0LCR(控制寄存器):设置UART0的通信格式。
- f7 |0 V2 A$ W* Hl U0DLL,U0DLM(寄存器):设置UART0的通信波特率。
7 \3 F- }2 l# z9 d( OC. 具体寄存器的设置
9 _7 K& j. _. k) T! D1 i7 F(1) U0LCR(线控制寄存器)
8 n5 c) _) _, D: [3 y1 |4 `. g  a7 o$ Gl 作用:设置通信格式(通信字符长度,停止位个数,奇偶校验位
6 |6 u" @/ l# R) Fl 长度:8位寄存器
; N/ |2 @" `  c% T& }: Kl 各位寄存器的含义:1 ]. D) N( x2 B7 W
第[1 ,0]位: 表示字长
3 K4 u2 R3 [8 n/ f, H00:表示5位字长4 q1 }8 N6 \5 ~
01:表示6位字符长度
+ x% G. ^$ _4 }4 B! P10:表示7位字符长度
+ D! x' `. R( C2 |0 e11:表示8位字符长度# g, L) k6 G4 G
第2位: 表示停止位选择
& q' Z+ P& A+ }9 C: i# c0:1个停止位: B/ X+ T, u: m$ F" l
1:2个停止位
6 O1 _6 ^7 l) J5 A9 J3位:表示奇偶使能2 L2 j- w3 E) t' r$ ?7 n0 ]. J6 U
0:禁止奇偶产生和校验: n6 t9 @9 u! I, ]# d1 _" o2 ?
1:使能奇偶产生和校验% n6 m# ^  [1 l
注:奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
9 D  g  I2 \* m) y# v4 D, ~( x第[5 4]位:表示奇偶选择位
, q; `9 J1 |" n0 D00:奇数(数据位+校验位=奇数)
: z+ ~3 n0 f. a4 y/ D" g2 ]& `01:偶数(数据位+校验位=偶数); N$ p& b( V: b0 T' G, }# ~  {
10:校验位强制为1, H5 y. {! @, O5 O
11:校验位强制为0; q  A( s% i6 z) C- o
注:奇偶选择主要是设置奇偶校验类型。2 u- l0 }2 ^: M% H: j% t
第6位:间隔控制0 U% x3 G7 x: b* ?
0:禁止间隔发送2 i3 t& Y4 V% Y5 X
1:使能间隔发送+ [6 |$ h* M. K. Y- O# m8 ]
注:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。在一些通信方式中,使用间隔中断作为通信的起始信号(egIN Bus)7 j! _" h. m4 |: c8 d
第7位:除数锁存访问位  m6 o# f$ k0 M* W8 Y6 j! K
0:禁止访问除数锁存寄存器' D2 ]3 m! J3 W2 ?& W
1:始能访问除数锁存寄存器' \2 ~4 Z+ g" t8 g" F2 `

) e8 m3 t) n3 |& `(2) U0DLL,U0DLM(除数锁存寄存器)
+ P7 H+ j1 V* Ql 作用:U0DLL和U0DLM寄存器一起构成一个16位除数。$ d7 o& ~3 w# f# {. q( C5 ?5 Q
l U0DLL和U0DLM都为8位寄存器。6 K2 V, z# m/ a. \; L
l U0DLL:存放分频值的低8位' q* N( u' E" W9 l+ \+ B
l U0DLM:存放分频值的高8位。
0 L0 D/ I# Q2 [' m  Y注:
; d7 ^: \* F2 O& ]. }Ø 1.使用U0DLL和U0DLM配置波特率之前,必须先计算分频值。. w5 Q2 m2 x6 ~" j2 c" I
Fdiv=Fpclk/(16*baud)# b0 y2 w  D$ P) {9 D( d1 k& Y9 O
Ø 2.使用U0DLL和U0DLM配置波特率之前必须把U0LCR控制寄存器的第8位置为1才能进行配置。配置完后要把U0LCR控制寄存器的第8位置位0。3 b7 L+ [* y' B; i4 B/ O/ ~* J
2> 串口初始化化程序5 J0 @& `- \4 g1 ~
A方法一:$ K: \: i. ~  _# `5 @) O4 c7 h
1 W  g2 P0 _% u" A1 ?# A
void UART0_Init(uint32 bps). v: Z' Z+ A1 ^8 \6 T
{! j) `; U/ S& N* Z, U7 m2 W8 z
2 j1 O# X) {1 K. v. n' l) O, N- v- C
uint16 Fdiv;
7 a1 X4 Z# H0 D/ j4 hPINSEL0=0x00000005; //设置串口引脚
* W4 ~, G. M8 P1 q0 C  E/ ~U0LCR=0x83; //置为除数锁存位,进行配置
. T5 n% S- h' L) X$ y. t/ x( d0 GFdiv=(Fpclk>>4)/UART0_BPS;
; G; T! X/ q$ d/ v5 Q. }& ZU0DLM=Fdiv>>8;
" P+ V; ^! D* ^# B, _, lU0DLL=Fdiv&0xff;4 W9 K/ r6 o. L2 x6 Y6 i3 Q& X  L
U0LCR=0x03; //清除除数锁存位,并设置工作模式
2 r- S/ Z# f6 ?5 d: |}$ z' T' B% ^6 ^8 f
B.方法二:" g8 z1 a* b% {+ m' k6 [2 ]* \
% S0 J( y$ y2 ?: V& d

' ^/ F& y, ~/ }1 y' n% ~1 g: j+ \" ntypedef struct UartMode
/ F0 E5 F2 N) e, T% D" h6 V" d- R: J- m{ uint8 datab; // 字长度,5/6/7/8( h4 _. p2 d+ D/ q) Z
uint8 stopb; // 停止位,1/21 t+ H9 c" {+ y+ V
uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验: o! J: k# \4 _+ w7 B9 v! m( o
} UARTMODE;
1 o% A/ t; V! _) suint8 UART0_Init(uint32 baud, UARTMODE set)
& k7 q# q, D1 ?" Y8 s& x5 U{ uint32 bak;
3 Y$ U9 [. j! h. a4 K
' O. v# ]2 J  d' ~: ?$ N
9 Z+ {% O0 }" h5 q* ]6 k+ Pif( (0==baud)||(baud>115200) )5 x! g: z( T+ X% L  o) u  `
{, J& a; w9 `) u: p
return(0);
' b: }7 r4 Q9 T, p: n2 o}, H3 Y/ g8 q) _0 r
if( (set.datab<5)||(set.datab>8) )( D/ S0 P( _0 I
{5 ^& E5 z0 T8 R1 q. J+ |/ H
return(0);" d8 C7 T) @* o% o8 R. n* C5 A2 L
}
; B( H( P0 F" C; p! Xif( (0==set.stopb)||(set.stopb>2) )
, Q* v4 }1 o. c9 g1 Z3 |{5 H( M4 p; |5 h5 ?  f# F/ I7 P
return(0);
; A+ N) N( W0 B3 ]  p4 w( {}
* `  Q7 B5 z! ]7 j, E7 w/ Y* Yif( set.parity>4 )
2 j4 T) c1 p5 e/ p9 H4 c6 u" e+ J{- f% T/ L. X/ X" U% K6 f8 @! V
return(0);
! F* v. }# b% V, C2 K; Y, _1 Y6 y}
5 P! ]% g+ N& M: r+ z7 [7 ^1 `: t' Q8 g) r$ B) l
  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    4#
    发表于 2021-6-22 17:23 | 只看该作者
    TxD0引脚用于UART0发送数据,发送方式为串行发送数据
  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    3#
    发表于 2021-6-22 17:22 | 只看该作者
    RxD0 引脚用于UART0接受数据,接受方式为串行输入。
  • TA的每日心情
    慵懒
    2022-12-26 15:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-6-22 15:36 | 只看该作者
    VPB总线提供CPU与UART0之间得的通信连接
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-24 11:25 , Processed in 0.203125 second(s), 27 queries , Gzip On.

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

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

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