历史上的今天
今天是:2024年09月08日(星期日)
2021年09月08日 | s3c2440学习之路-007uart的简单配置
2021-09-08 来源:eefocus
1.基本知识
串口算是各种芯片最基本的功能之一,串口配置好后程序就可以通过串口来打印各种信息,方便代码的调试。 串口最主要的参数有4个:波特率,数据宽度, 校验位,停止位

常用的串口配置为:波特率115200,8bit数据宽度,无校验位,1bit停止位,通常缩写为115200 8N1
2440有3组UART, 每组UART都有2个64Bytes 的FIFO
jz2240使用的串口0与电脑通信,之间通过PL2303来转换电脑和开发板之间的逻辑电平。
2.主要寄存器
2.1 GPHCON & GPHUP
串口需要用的Pin脚就3个:Tx,RX,GND, 因此首先需要把对应的Pin设置为TX,RD模式,除此外,还需要将上拉功能开启。因为UART在空闲时是高电平。
2.2 ULCON0
ULCON0 用来控制串口的基本属性,这里设置了115200 8N1中的8N1

2.3 UCON0
ULCON 主要设置时钟源及工作的各种模式
如果时钟选择FLCK,在配置上有许多限制条件,所以这里选择PCLK会更加方便。
发送接收都选择polling mode,因此需要自己手动去查看状态寄存器。




2.4 UTRSTAT0
状态寄存器,在polling mode下可以通过查询此寄存器的值来判断收发数据的情况
当发送数据时,需要先查看UTRSTAT0[2]是否empty, 逻辑代码为:
{
/* 等待trasnmitter为空,否则表示还有剩余数据未被发送 */
while (!(UTRSTAT0 & 0x4))
发送数据
}
当接收数据时,需要先查看UTRSTAT0[0]是否非empty,逻辑代码为:
{
/*需要等待Receive buffer非空,表示获取到了数据,否则一直等待 */
while (!(UTRSTAT0 & 0x1));
接收数据
}

2.5 UTXH0
当发送数据时,把需要发送的数据填入此寄存器

2.6 URXH0
当接收数据时,通过此寄存器来获取数据

2.7 UBRDIV0
波特率设置,公式为:UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
UART clock前面设置为PLCK=50M
期望的buad rate = 115200
代入公式 (50M / ( 115200 x 16) ) - 1 = 27.12 - 1 = 26
因为除法可能会有小数,所以实际的波特率会有误差,不过2440提供了误差的计算公式和最大的误差范围
误差的计算公式为:
tUPCLK = (UBRDIVn + 1) x 16 x 1Frame / PCLK
tUEXACT = 1Frame / baud-rate
UART error = (tUPCLK – tUEXACT) / tUEXACT x 100%
UBRDIVn = 26,
1Frame = start bit + data bit + parity bit + stop bit. 因为每次传输1个Byte都会有1bit start bit 所以
1Frame = 1 + 8 + 0 + 1 = 10,
tUPCLK = (26 + 1)* 16 * 10 / 50M = 432 / 5M
tUEXACT = 10 / 115200 = 1 / 11520
UART error = (432 / 5M - 1 / 11520) / (1 / 11520) * 100% = -0.446%
3.源码
uart.c
int uart0_init(void)
{
/* 1 set gpio to uart mode
Tx GPH2 [5:4] b10
Rx GPH3 [7:6] b10
*/
GPHCON &= ~((0x3 << 4) | (0x3 << 6));
GPHCON |= (0x2 << 4) | (0x2 << 6);
/* 2 set pull up */
GPHUP |= (0x1 << 2) | (0x1 << 3);
/* 3 set formar 8N1 */
ULCON0 |= 0x3;
/* 4 set Soruce clock PCLK and poling mode*/
UCON0 = 0x5;
/* 5 set baud rate 115200
PCLK = 50M
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
UBRDIVn = (50M / (115200 x 16))-1 = 26.1267 -> 26
*/
UBRDIV0 = 26;
return 0;
}
int getchar(void)
{
int chr = 0;
while (!(UTRSTAT0 & 0x1))
{
//nothing
}
chr = URXH0;
return chr;
}
int putchar(int c)
{
while (!(UTRSTAT0 & 0x4))
{
//nothing
}
UTXH0 = (unsigned char )c;
}
uart0_init, getchar, putchar的实现都很简单,不做过多介绍
唯一要注意的是,发送数据时,最好把数据强制转换成 unsigned char ,避免当字符的ascii 超过127时转变成负数而导致发送数据异常
史海拾趣
|
各位大哥大姐:小弟在一个接收模块上看到一个像TO-92封装三极管的元件。在电路中的作用是在调幅中频信号解调出调制信号。通过测量,它不是一个三极管,而是一个组合元件,请高手说出它的型号及其参数。… 查看全部问答> |
|
各位大大好!本人新人,最近想用51片子扩展串口,不知道用什么片子比较好...手头暂时有TL16C754,但是不知道他与51连接有什么特殊要求?(51能不能用它来扩展串口)如果能,那么最大波特率由谁决定,只是由TL16C754决定吗?如果不能,那么各位能推荐下起他 ...… 查看全部问答> |
|
明天TI M3 DAY就要开始了,提前放出相关资料,感兴趣的朋友可以预习一下。 [ 本帖最后由 jkhu 于 2011-6-19 23:19 编辑 ]… 查看全部问答> |
|
在使用2124时,发现P1.17、P1.24、P1.25口在上电后有大约500ms的高电平,无论怎么配置都不能全它一上电就是低电平,不知道是器件本身的问题还是使用的问题,请高手指教,谢谢.现在版子已经制完了,其它管脚程序一运行就置低,是正常的,但是这三个 ...… 查看全部问答> |
|
void uart_irq(void *context,unsigned long id){ IOWR_ALTERA_AVALON_UART_STATUS(UART_232_BASE,0x0); //本想清标志位,状态寄存器的部分位写0可以清零,但接收标志位和发送标志位写0无作用,只有发送完或读 ...… 查看全部问答> |
|
利用大功率数字源表构建多源测量单元(SMU)系统(连载四):为高电压测试选择最佳电 确保测试期间使用的电缆符合测试系统最大电压额定值。在功率器件关闭状态特性分析期间经常遇到高压、低电流测试,要使用能够实现这类测试所需性能的电缆。 在高压测试时,要保证充分绝缘,并使漏电流和系统电容带来的影响最小化。 适当 ...… 查看全部问答> |
|
【转】ARM_Cortex_A8、A9以及高通Scorpion处理器详解 文章来源于网络,仅供参考。 1.一些背景介绍 1.1 ARM核心 ARM核心是主控SOC中的重要部分,系统的日常应用都由ARM核心来完成,因此ARM核心的效能很大程度上跟用户体验有关。ARM公司一般用DMIPS/MHz来标称ARM核心的性能。DMIPS是Dhrystone Milli ...… 查看全部问答> |
|
同样是5.5V输入,5V @2.1A输出,还有一种方案是基于Simple Switcher的 Simple Switcher 顾名思义,简单的电源设计 同样是BUCK结构,但是内部集成了电感、电容能功率器件,所以外围电路十分简单 效率也很高,高达96%,纹波水平惊人的做到不 ...… 查看全部问答> |
|
根据 华尔街日报报道,苹果以2000万美金收购了以色列公司LinX Imaging,该公司主要研究多摄像头技术。同时,这意味着iPhone将有可能会采用长焦+短焦的双摄像头设计。 LinX可以为移动设备提供多摄像头传感器,可以在同一时间捕捉多张图片,利用算 ...… 查看全部问答> |











