我是靠谱客的博主 个性背包,最近开发中收集的这篇文章主要介绍UART Baudrate,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Communication Protocol
每个字符包括起始位(1位,低电平,下降沿捕获)、数据位(5~8位, LSB first)、校验位(奇偶校验,可无)、停止位(1位,1.5位,2位), 其中为了保证数据传输的准确性和可靠性,字符之间可以插入空闲位(高电平,GAURD register)
UART 是异步传输(asynchronous),在数据传输的过程中没有时钟用来同步, 接受者不知道何时一帧数据将会被发送,接受者通过下降沿来判定一帧数据的起始

CLK
对于UART来说,有两个clock, BUS clock和Source clk, 前者用于数据的访问,后者用于产生baudrate. 一般UART 所处的是APB BUS,而Source clk 所处的domain 需要看designer 的设计,一般有INFRA domain 和 TOP domain.

在这里插入图片描述
baudrate = CLK / 采样baud_pulses数 / divisor
依据HIGHSPEED 的不同, baud_pulse(采样脉冲) 的数量不同,显然采样数越多得到的baudrate 精度也就越高
HIGHSPEED 0: base on 16baud_pulses
1 : base on 8
baud_pulses
2 : base on 4*baud_pulses
3 : base on Sample_count * baud_pulses
baudrate = CLK / (Sample_count +1) / divisor
Sample_point = (Sample_count -2)/2 (with out decimal)
以下仅讨论HIGHSPEED 为3的情形

#define DIV_EXACTLY(x, div) ((x)/(div))
#define DIV_ROUND_CLOSET(x, div) (((x)+((div)/2))/(div))
#define DIV_ROUND_UP(x,div) (((x)+(div)-1)/(div))

对于8bit 的寄存器, Sample_count 最大为256

kernel-4.14
(1)quot = divisor = {DLM,DLL}= INT((CLK/Baud)/256)+1
(2)count = (Sample_count +1)= INT(CLK/Buad/quot)
(3)即Sample_count = INT(CLK/Baud/quot) -1
(4)Sample_point = Sample_count /2 -1

Fraction是对于buadrate的微调, DE会给出一组经验值:
fraction =( (clk*100)/baud/qout)%100;
fraction = DIV_ROUND_CLOSET(fraction, 10);
Fracdiv_L = fraction_L_mapping[fraction ];
Fracdiv_M = fraction_M_mapping[fraction];

cmm script for basic log print:
#12M , 921600bps
LCR : 0x3
HIGHSPEED: 0x3
LCR: 0x83
DLL: 0x1
DLM: 0x0
SAC: 0xc
SAP: 0x5
LCR: 0x3

最后

以上就是个性背包为你收集整理的UART Baudrate的全部内容,希望文章能够帮你解决UART Baudrate所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部