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

ARM7串口编程要点

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一. 串口编程的硬件原理
0 p7 k' ?5 @2 X( O# M1. 串口特性:; i) I6 V" W2 L
1>16字节接收FIFO和16字节发送FIFO+ f3 s2 W( O' {4 t* b6 l- X: W$ @
2>接收FIFO触发点可设置为1,4,8或14字节。6 b0 |+ B0 b6 K5 Z7 j0 a( O
3>内置波特率发生器。
8 ]5 e. j/ e/ O$ m, G- X4 N2. UART0引脚:) A* L: `+ T( t$ Q) R7 r, t2 r+ ~
1>RxD0 引脚用于UART0接受数据,接受方式为串行输入。
5 f; }1 \9 [5 @' ^: T: ?# A2>TxD0引脚用于UART0发送数据,发送方式为串行发送数据。5 g; s8 S. K& ]) q3 s
3. UART0的结构和工作方式! j% D2 }6 [& U" d$ n
先看图在说明:
' k. A" H% j$ R# P
- T: K( B, u& q) Q+ _! w
1> VPB总线提供CPU与UART0之间得的通信连接4 V& i) z/ d/ ^5 W
(CPU内核通过VPB接口对UART0的寄存器进行读写访问.)1 U4 r$ \0 s  Y3 `( }
2> UART0 接收器模块监视串行输入线RxD0的有效输入。UART0 接收单元的移位寄存器(U0RSR)通过RxD0接收有效的字符。当U0RSR接受到一个有效字符时,它将该字符传送到UART0 接收单元缓冲寄存器FIFO中,等待CPU通过VPB接口进行访问。: b1 x0 i* N' z1 g! u
3> UART0发送器模块接收CPU或主机写入的数据并将数据缓存到UART0 的FIFO或U0THR中,UART0发送模块中的移位寄存器(U0TSR)读取U0THR或FIFO中的数据并将数据通过串行输出到引脚TxD0发送。& S* w/ ^5 M7 J4 S4 y2 P% w" g! q
4> UART0的接收模块和发送模块的状态信息保存在U0LSR中。. T: q5 ]0 e. p) ~  a3 z, H, r( ^
控制信息保存在U0LCR中。
3 K4 {: m: d( U. C5> UART0波特率发送器模块产生UART0 发送模块所使用的定时。波特率发生器模块时钟源为VPB时钟(pclk)。主时钟与U0DLL和U0DLM寄存器所定义的除数相除得到UART0 发送器模块使用的时钟,该时钟必须为波特率的16倍。3 C3 ~& R3 S6 O* J
6> 中断接口包含寄存器U0IER和U0IIR。中断接口接收UART0发送模块和接收模块发出的单时钟宽度的使能信号。
: H; ]1 t! Q, b' A7 c8 o( X4 c4. UART0和ARM7 CPU之间的通信过程5 }3 u" R* D: i- h* [- a
1>CPU通过UART0发送模块发送信息给外设
, q7 r: G1 h6 p7 I' M* p$ N4 ?0 _l CPU发出信息通过AHB总线到AHB-VPB桥
9 f% r/ n4 D7 C6 i' P" N, Yl 通过AHB-VPB桥把信息转换后发送给VPB总线。
' i) }9 R; ?0 }! ~. Yl UART0接收模块接受来自VPB总线的数据。并将数据缓存到U0THR寄存器中。5 ], H! @' v! z/ _) T8 v+ A
l UART0接受模块的移位寄存器U0TSR读取U0THR中的数据 并将数据通过输出引脚TxD0发送" X5 p1 F; Z1 G
1 P! S+ q9 [2 H& N$ \3 r  z. G
2>外设通过UART0接收模块向ARM7 CPU发送信息
& [: a  @- y2 B- Z* `l UART0移位寄存器(U0RSR)通过引脚RxD0接收有效字符。1 [0 D% Q. C, `$ Y+ F  d2 I% i9 `
l 当UART0接收到一个有效字符后,通过读取U0RBR寄存器可以将FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。7 U- p' X3 a! ?$ m- N
l VPB总线将缓冲寄存器(U0RBR)中的数据通过AHB-VPB桥传到AHB总线上
6 e0 o2 J' C0 ]6 t% `l AHB总线将数据传送给ARM7 CPU3 S8 l1 l' A# I" a
: {7 @4 ~5 @: x* k' Q5 F1 h+ B4 K! w) s
二. 轮训方式的串口编程
0 |" i/ t. j( g! Z9 x% W# O1. 串口程序都有那几部分组成
5 M0 j% B1 p# M; m# e看图:- u! ?9 U+ p: B2 U" p9 e5 o1 M
/ G% q' G$ _3 p; x. `
1> 串口初速化
) _, _. R3 y* ^, @A. 串口初始化的流程
) N- V$ I/ V. s; Z6 p( _( |' {; Ql 设置I/O引脚连接到UART0/ X, ]" \. \0 R3 Q* Z. r$ f
l 设置串口波特率+ r& n+ h; G4 `: P* M( H0 c
l 设置串口工作模式
* l  D2 o. K& C* s8 bB. 串口初始化需要设置的寄存器+ `' E; ^/ o, M+ n3 d
l U0LCR(控制寄存器):设置UART0的通信格式。
) z- l9 B- g! c0 ]l U0DLL,U0DLM(寄存器):设置UART0的通信波特率。' Z/ @: ]7 s9 m! b5 Z6 w; X6 r1 |( S
C. 具体寄存器的设置  \5 |1 ?+ G: \$ K* y% I( u
(1) U0LCR(线控制寄存器)5 `, N3 k+ i. W9 ?4 M8 D" w- U1 b
l 作用:设置通信格式(通信字符长度,停止位个数,奇偶校验位
0 ^8 ^; `  r% z9 F, ~) ^* j9 Rl 长度:8位寄存器$ z; Q3 x' I/ P7 `* I
l 各位寄存器的含义:* s9 |6 I- p' L3 _
第[1 ,0]位: 表示字长$ B7 R9 R4 |, B! n+ q/ c4 a
00:表示5位字长
" h) @  f. N! H1 ~# c01:表示6位字符长度
5 q' m/ n8 L. \  U' b& d& j) R10:表示7位字符长度
4 [$ s3 e" E# r11:表示8位字符长度$ h. R+ Z: i& Q  Q% ~/ g5 |
第2位: 表示停止位选择
8 s1 i+ K/ s1 s8 e0:1个停止位
) o8 L. Q" n0 G5 k5 E6 ^# W" a1:2个停止位- J  b9 U& \' @7 {2 ]! r/ @
3位:表示奇偶使能
% `0 e% U8 [; N0:禁止奇偶产生和校验# @' s5 `% S. X/ ]; _  [8 S# W
1:使能奇偶产生和校验9 I5 g6 j) [6 f; u
注:奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。! L% [- H. Q5 Z4 B
第[5 4]位:表示奇偶选择位/ ]: t. b( d& A- U  f: O/ g
00:奇数(数据位+校验位=奇数)
: q) E' a3 T8 f0 q6 J% [# e- j01:偶数(数据位+校验位=偶数)
6 w5 s- O# n' q6 e10:校验位强制为1! k# V# \% g; p7 ^% Y% m. n! Z
11:校验位强制为0
1 y5 C5 |0 [: z' e注:奇偶选择主要是设置奇偶校验类型。, I4 Q; K/ U$ v& m: u
第6位:间隔控制8 i8 E* ^7 F, t
0:禁止间隔发送0 _* q& y2 Z, W  p
1:使能间隔发送
2 W0 P0 n/ _6 R: _3 m- e& C" O; D注:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。在一些通信方式中,使用间隔中断作为通信的起始信号(egIN Bus)
. v- g0 G, ~' K, A/ R第7位:除数锁存访问位+ a1 A; a) p3 w# `2 P# f; h' L9 M( O  `
0:禁止访问除数锁存寄存器
* @6 y% p2 Q$ x% }1:始能访问除数锁存寄存器9 T$ R' \0 Y* s8 J: q" ~4 a6 |
% H! K$ o8 C* k2 ~5 o$ g
(2) U0DLL,U0DLM(除数锁存寄存器)) l% s( z( I3 d' ~9 V+ p3 j
l 作用:U0DLL和U0DLM寄存器一起构成一个16位除数。
' C8 O- c# g6 w8 y7 V- e/ I' Bl U0DLL和U0DLM都为8位寄存器。2 d/ R, j4 P  L
l U0DLL:存放分频值的低8位# ~. s& q5 C3 y4 T5 X
l U0DLM:存放分频值的高8位。
  G' [' B2 K+ e1 M% V" M. o! p, @注:
% h9 d8 u* d2 l! M. e' sØ 1.使用U0DLL和U0DLM配置波特率之前,必须先计算分频值。4 r4 n2 x& G! m1 R9 f
Fdiv=Fpclk/(16*baud)- ^# M8 O( s/ e
Ø 2.使用U0DLL和U0DLM配置波特率之前必须把U0LCR控制寄存器的第8位置为1才能进行配置。配置完后要把U0LCR控制寄存器的第8位置位0。" F( ~% p* M8 h& F5 b" ^! E
2> 串口初始化化程序1 h7 m& g+ H- n
A方法一:
; U  d% d* q' m! }$ _
$ O4 I" j! v3 {void UART0_Init(uint32 bps)
8 n  d" z3 I6 n3 ?{; `5 E* j8 i9 ^# O% i  `; g

) r0 J1 }! c' q, Tuint16 Fdiv;8 _; q' o/ ^% L: }0 m
PINSEL0=0x00000005; //设置串口引脚) G* ^' m- z2 T5 {
U0LCR=0x83; //置为除数锁存位,进行配置8 `. `# x5 X6 N8 y
Fdiv=(Fpclk>>4)/UART0_BPS;2 U" J; X5 G' Q+ L
U0DLM=Fdiv>>8;
7 A' ?- w/ u% o- r/ d! `1 g+ OU0DLL=Fdiv&0xff;
( k- p# i2 }; N4 c" TU0LCR=0x03; //清除除数锁存位,并设置工作模式" m' B/ ~' F) I( t3 I: E
}% T: ^; V! u$ [( g" F/ @
B.方法二:* V5 v; a$ f- }  V# o0 r1 n
3 G4 `& S3 f5 D
  V# D9 E9 A. b" K- g0 \. _' X9 K
typedef struct UartMode6 D1 Z8 C: ^: p& D* F, G
{ uint8 datab; // 字长度,5/6/7/81 g: C2 ^  N& J0 p7 \! X- O$ g
uint8 stopb; // 停止位,1/2
# `1 b' M6 \; o4 {0 L6 s9 Iuint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验5 a* i- _" q! {7 ]. M9 I
} UARTMODE;( t% U# |" _. g6 b: ^) ]
uint8 UART0_Init(uint32 baud, UARTMODE set)
* h# D; Y2 c6 ?6 T% L- P{ uint32 bak;3 ^# V" D% Z, T9 k
  I% U3 k( ~: e1 }+ v/ B2 w% k# W' m3 t

9 {& ?$ P1 k0 a0 [; _if( (0==baud)||(baud>115200) )6 A2 f! x' u) s3 Z
{
- f9 p' x9 e/ }: H9 j0 Q: e7 Lreturn(0);$ ]0 {9 R; k7 A' M' c' h# d
}
  ^& I% c3 R& {0 f. eif( (set.datab<5)||(set.datab>8) )3 x% \3 m( ^& m( ^1 D  Y
{
7 r( {3 Y7 S7 ^) D2 |" F0 o& preturn(0);( R, Q+ C5 E  g3 n3 C5 ]5 s
}' V/ Y: ~' D$ v* Z7 Q" w
if( (0==set.stopb)||(set.stopb>2) )$ F2 J9 \, P, A7 d
{
/ D, o7 b9 S$ l$ s! z& Freturn(0);( D8 O# ^. T7 F
}9 @/ x; v  c/ e. A6 [; Q1 S
if( set.parity>4 )
; Z! d# A: ]( x" a/ c7 b# `. t{
$ b- _; |; u6 M. `return(0);
# f, t$ {7 ?+ p- R" w}
: f! o% j) G# K7 \! x. D9 ]1 z) ^
0 T, {0 @6 j% I( @
  • 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 11:02 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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