s3c2440学习之路-007uart的简单配置

  1. 基本知识
  2. 主要寄存器
  3. 源码

硬件平台:jz2440
软件平台:Ubuntu16.04 arm-linux-gcc-3.4.5
源码位置: https://github.com/lian494362816/C/tree/master/2440/008_uart

1.基本知识

串口算是各种芯片最基本的功能之一,串口配置好后程序就可以通过串口来打印各种信息,方便代码的调试。 串口最主要的参数有4个:波特率,数据宽度, 校验位,停止位

波特率115200,38400 ,19200, 9600, 2440最高支持921.6Kb
数据宽度5bit, 6bit, 7bit, 8bit
校验位奇校验,偶校验,无校验
停止位1bit, 2bit

常用的串口配置为:波特率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%

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/2018121823063113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpYW40OTQzNjI4MTY=,size_16,color_FFFFFF,t_70

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时转变成负数而导致发送数据异常

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值