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

ARM7串口编程要点

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一. 串口编程的硬件原理
# @0 z; Z- i' V; E9 a+ ~. D1. 串口特性:4 H, O, F, M6 l  I* `7 |9 t8 ^
1>16字节接收FIFO和16字节发送FIFO" A5 y* e3 \- W2 r# L5 S1 x
2>接收FIFO触发点可设置为1,4,8或14字节。1 ?: N, E& K4 |$ A" S& K# A
3>内置波特率发生器。% I- s8 y/ o1 p# s
2. UART0引脚:- r) M" {# _- [
1>RxD0 引脚用于UART0接受数据,接受方式为串行输入。
. j8 \7 z* W5 V& t- a5 v2>TxD0引脚用于UART0发送数据,发送方式为串行发送数据。
8 J1 v4 K- F( v* X7 i3. UART0的结构和工作方式$ W: M9 m8 B& {) m2 D( _- F+ I
先看图在说明:. ?+ c% k) F: P/ t& O. a2 F
% U( G) h) K( g
1> VPB总线提供CPU与UART0之间得的通信连接; U# q2 X% p' K
(CPU内核通过VPB接口对UART0的寄存器进行读写访问.)
5 R( M$ S: G. ~2> UART0 接收器模块监视串行输入线RxD0的有效输入。UART0 接收单元的移位寄存器(U0RSR)通过RxD0接收有效的字符。当U0RSR接受到一个有效字符时,它将该字符传送到UART0 接收单元缓冲寄存器FIFO中,等待CPU通过VPB接口进行访问。/ E  \( Y  N. C3 u) M! _  L$ }1 U/ P
3> UART0发送器模块接收CPU或主机写入的数据并将数据缓存到UART0 的FIFO或U0THR中,UART0发送模块中的移位寄存器(U0TSR)读取U0THR或FIFO中的数据并将数据通过串行输出到引脚TxD0发送。6 `% Q& {4 D. r# a" Z* }
4> UART0的接收模块和发送模块的状态信息保存在U0LSR中。4 Q# q1 z5 H# p( V1 A; C7 x, L
控制信息保存在U0LCR中。
; s% a3 M2 B, e( m! K# k3 V5> UART0波特率发送器模块产生UART0 发送模块所使用的定时。波特率发生器模块时钟源为VPB时钟(pclk)。主时钟与U0DLL和U0DLM寄存器所定义的除数相除得到UART0 发送器模块使用的时钟,该时钟必须为波特率的16倍。/ C2 m" W; v' ]0 {. a+ o' }; S
6> 中断接口包含寄存器U0IER和U0IIR。中断接口接收UART0发送模块和接收模块发出的单时钟宽度的使能信号。
# ~7 W( K- Z# I6 W& o; C1 u4. UART0和ARM7 CPU之间的通信过程
& E7 U' n8 d. U, [4 m* z1>CPU通过UART0发送模块发送信息给外设9 [3 n( c2 L2 T" U
l CPU发出信息通过AHB总线到AHB-VPB桥
1 i) B; E' |4 Y% |& [l 通过AHB-VPB桥把信息转换后发送给VPB总线。
* x3 m( w/ A+ [7 yl UART0接收模块接受来自VPB总线的数据。并将数据缓存到U0THR寄存器中。
; U& M/ A* C2 v/ @l UART0接受模块的移位寄存器U0TSR读取U0THR中的数据 并将数据通过输出引脚TxD0发送
! |& w! r( n. [  z) n4 D* |4 v) U6 [) O7 t

" w% C2 n" c" i6 [  q6 Z2>外设通过UART0接收模块向ARM7 CPU发送信息
5 x0 g6 e6 @- f' l; w3 \' hl UART0移位寄存器(U0RSR)通过引脚RxD0接收有效字符。' _! ]) K# {* L8 P; A
l 当UART0接收到一个有效字符后,通过读取U0RBR寄存器可以将FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。/ u3 }7 l& J, f0 z4 _
l VPB总线将缓冲寄存器(U0RBR)中的数据通过AHB-VPB桥传到AHB总线上6 E9 B, H/ J. E
l AHB总线将数据传送给ARM7 CPU
8 z& C% h9 q$ U  p" f# J8 u' [2 O
9 Y  O- I4 Z1 B- `1 v) c
二. 轮训方式的串口编程( c1 c) D" i5 _& o/ ]4 H
1. 串口程序都有那几部分组成
; F2 _6 a. r; q看图:* S& c3 \3 j$ A( @6 I/ A, Y

* ?4 A% c0 \1 a+ x1> 串口初速化
- a) V% E2 Q2 W* E) {A. 串口初始化的流程) W; F9 x; V  u0 q! t
l 设置I/O引脚连接到UART0
; K; ]$ l* {% s0 G$ I, r! rl 设置串口波特率
. u$ t( k- E+ J. fl 设置串口工作模式
4 N- m( J9 S9 t5 DB. 串口初始化需要设置的寄存器
# |3 @1 Z/ m3 x: L0 h6 |l U0LCR(控制寄存器):设置UART0的通信格式。
; Z  n* ?' Z! Tl U0DLL,U0DLM(寄存器):设置UART0的通信波特率。, v* F0 f- q! \/ O6 l
C. 具体寄存器的设置" x4 ?/ X6 d# P4 ~
(1) U0LCR(线控制寄存器)$ Q/ F9 u( S/ Q- o, A
l 作用:设置通信格式(通信字符长度,停止位个数,奇偶校验位2 p) G. g, ~  d% r9 x* Z
l 长度:8位寄存器2 C0 b- q" T  K9 r! a5 j
l 各位寄存器的含义:5 ?! B! q' s0 F! a6 M  R4 u0 j- |1 a
第[1 ,0]位: 表示字长
  {3 A4 q2 A- p& `00:表示5位字长
* ~7 W7 x1 W) K6 v/ {! ^4 ~01:表示6位字符长度
/ Z/ G2 \1 i- g7 C2 t10:表示7位字符长度
, i0 }$ L( K; @11:表示8位字符长度7 e# l: B3 D6 p9 @
第2位: 表示停止位选择( _* ?- o$ i! z+ I0 u: d& O" s
0:1个停止位
" K6 Z7 _) \7 _/ G9 ], F% `1:2个停止位8 q+ h/ Q" m! O- J
3位:表示奇偶使能' m  I- f/ q$ p
0:禁止奇偶产生和校验; B7 n( H/ H. }; d- s6 c5 ?; A
1:使能奇偶产生和校验5 \( r! T: N- d5 ]" x) P
注:奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
7 S9 U* L. A8 l4 s" H9 k& g第[5 4]位:表示奇偶选择位
" s9 A3 Q& s3 I! U& k0 Y+ ]$ }00:奇数(数据位+校验位=奇数): O. \0 ]2 j" d) q# c. l) z, _
01:偶数(数据位+校验位=偶数)
0 P* X" @4 j+ q& [$ s10:校验位强制为1- p* t- I9 }1 L" n+ Q
11:校验位强制为0
; ]. [; b0 J. W% ~# Q注:奇偶选择主要是设置奇偶校验类型。
: u- d1 W5 g' q9 h* v! [第6位:间隔控制: S2 I- p) P" y4 z" i: b; l
0:禁止间隔发送
4 _" b% i/ L1 _6 V1:使能间隔发送
# H7 h, A( C3 S" a注:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。在一些通信方式中,使用间隔中断作为通信的起始信号(egIN Bus)' b/ o! `. Y7 I. l3 f: p1 x
第7位:除数锁存访问位
- i; D! A. G/ P: ]1 H$ W0:禁止访问除数锁存寄存器
+ @' r2 n: C5 k; U  n8 ^$ a$ J2 m1:始能访问除数锁存寄存器. b/ b( ?" S( Q2 q
7 R" v+ x+ G+ s* ^8 ]- l$ t
(2) U0DLL,U0DLM(除数锁存寄存器), L- v; ^$ W. U0 R+ Q: u
l 作用:U0DLL和U0DLM寄存器一起构成一个16位除数。
3 X/ A* y( h1 V; ^l U0DLL和U0DLM都为8位寄存器。" I% q4 d) ?/ i9 @  r% y7 ]; O" N
l U0DLL:存放分频值的低8位5 X+ N9 n4 L4 |5 c' z1 Z$ N( C; K" r
l U0DLM:存放分频值的高8位。
: v. N4 J. [. s  ^% Y- P注:
& p! F! I4 S- f! A4 R. B6 DØ 1.使用U0DLL和U0DLM配置波特率之前,必须先计算分频值。
# @6 \6 ^) D4 fFdiv=Fpclk/(16*baud)
' ]  g8 P& s. p! jØ 2.使用U0DLL和U0DLM配置波特率之前必须把U0LCR控制寄存器的第8位置为1才能进行配置。配置完后要把U0LCR控制寄存器的第8位置位0。
/ |& A9 H# p- m3 K+ v7 K2> 串口初始化化程序5 H6 d# p' g/ U; U: H  {
A方法一:
' \/ F  C/ @  b7 i; ~1 r! q& l' c+ G
  G- X. I9 o% ?void UART0_Init(uint32 bps)
8 n5 }! ]' V% {9 o. L{
  }5 Z, j% |# q- I( j) p
" L8 s* R3 a! G9 Muint16 Fdiv;1 ~* G9 j2 t- P2 U% Q! _. y: ^
PINSEL0=0x00000005; //设置串口引脚
7 D/ q6 C4 a/ i' d$ \: t7 w9 GU0LCR=0x83; //置为除数锁存位,进行配置) d& p7 Z1 \  q
Fdiv=(Fpclk>>4)/UART0_BPS;! I, j& G. j$ S5 L- X
U0DLM=Fdiv>>8;% R  U& r+ S: B3 v0 _; O
U0DLL=Fdiv&0xff;- G6 H, B5 z% @( m, y5 G0 _
U0LCR=0x03; //清除除数锁存位,并设置工作模式. C5 j  ^: b( p" ]2 w/ w0 g- M
}
  R( v$ v4 _* t  y" n5 ~0 aB.方法二:
$ t8 t- f' ?, T6 ^: w' x! J0 y0 j7 ]: t
0 B" m  s7 U" I4 A% ?  |% J  _+ _
typedef struct UartMode
9 g3 L3 g& i: P# \# A( ]{ uint8 datab; // 字长度,5/6/7/8
& l5 z: C8 U" D( G- u7 Nuint8 stopb; // 停止位,1/2  ~. o7 [3 [. V/ P  M8 t
uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
5 l' B4 K, _- m; d} UARTMODE;
% U* W$ |+ c: C+ I! Y# h+ wuint8 UART0_Init(uint32 baud, UARTMODE set)2 C6 ^( ~+ d$ ]& K7 J- A; ^3 u
{ uint32 bak;
; J, {  M4 `; S4 k6 `
* c1 Z. s/ i" p$ u: G
/ y  t3 o$ U( G3 p9 H7 lif( (0==baud)||(baud>115200) )
( y' Y# I7 y  k{
6 O2 l+ G7 o. e) e' f8 n3 zreturn(0);" r: w0 J& {0 I% K
}; `- x2 j( n8 G
if( (set.datab<5)||(set.datab>8) )
3 W$ p# ^) m  Y+ W& O0 h7 T{( `9 e/ O% I3 `0 F4 H& O
return(0);4 y# [4 s, Y! \! C1 E3 O' k
}
! S$ Y  i. B* p1 u. c/ g( T: y& Uif( (0==set.stopb)||(set.stopb>2) )1 Y9 p# X. |: z
{
% K  O7 o" Y- |7 b0 }, Nreturn(0);
0 Q* |. J" c' N) L3 y) D}# o% I' f' d% c. N. H& d
if( set.parity>4 )
) ]: V- f% e0 r+ \: M& T{0 B0 K  j9 s4 M1 L9 i, n; @+ `
return(0);0 s* I' S$ u2 \. a7 \" \
}/ G6 s- p; n9 u0 T- C( @

' [) G. y/ r1 h( G0 K
  • TA的每日心情
    慵懒
    2022-12-26 15:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-6-22 15:36 | 只看该作者
    VPB总线提供CPU与UART0之间得的通信连接
  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    4#
    发表于 2021-6-22 17:23 | 只看该作者
    TxD0引脚用于UART0发送数据,发送方式为串行发送数据
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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