历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2021年09月08日 | s3c2440学习之路-007uart的简单配置

2021-09-08 来源:eefocus

1.基本知识

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

image.png?imageView2/2/w/550

常用的串口配置为:波特率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?imageView2/2/w/550?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时转变成负数而导致发送数据异常

推荐阅读

史海拾趣

C&K Components公司的发展小趣事

1957年,Charles A. Coolidge, Jr.和Marshall Kincaid共同创立了C&K Components公司,起初主要专注于磁芯记忆单元的制造。那个时代的电子行业刚刚起步,市场竞争激烈,技术更新换代迅速。C&K在初创时期就面临了诸多挑战,但两位创始人凭借对技术的热爱和对市场的敏锐洞察,坚持探索新的技术方向,为公司的发展奠定了坚实的基础。

Corex Intervest Inc公司的发展小趣事

Corex Intervest Inc公司的创立,标志着电子行业中一颗新星的诞生。公司创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,决定投身于电子产品的研发和生产。在创立初期,公司面临着资金短缺、技术难题和市场竞争等多重挑战。然而,创始人凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个难关,逐步在市场中站稳了脚跟。

Anytek Technology Corporation Ltd公司的发展小趣事

为了进一步满足市场需求,Anytek在2005年投建了安尼泰科(中国)生产基地,并成功投产运营。这一举措不仅大幅提升了公司的生产能力,也为后续的产品研发和市场拓展奠定了坚实基础。同年,Anytek的产品还通过了SGS ISO 9001(2000)国际质量体系认证,这标志着公司的产品质量和管理水平达到了国际标准,为公司的国际化发展打开了新局面。

E-T-A Circuit Breakers公司的发展小趣事

1961年,E-T-A公司推出了其第一款电子式保险丝,这一创新引领了电气保护设备的新时代。这款电子式保险丝采用了可编程技术,可以根据电路需求进行精确的保护和控制。它的出现大大提高了电气系统的安全性和可靠性,并为E-T-A公司在电路保护领域奠定了坚实的基础。

Enterpoint公司的发展小趣事

为了进一步扩大市场份额,Enterpoint公司开始积极拓展国际市场。他们通过参加国际电子展会、建立海外销售网络等方式,不断提升品牌知名度和影响力。同时,公司还积极寻求与国际知名企业的合作机会,通过技术交流和产品合作,不断提升自身的技术实力和产品质量。

Ford Aerospace & Communications Corp公司的发展小趣事

在汽车制造领域,福特一直是技术创新的领导者。20世纪60年代,福特开始将电子设备集成到汽车中,包括车载电话、导航系统以及早期的娱乐系统。这些创新不仅提升了驾驶的便捷性和舒适性,也预示着未来汽车电子化、智能化的趋势。虽然这些技术并不直接属于航空通信范畴,但它们展示了福特在电子技术应用方面的前瞻性和实力。

问答坊 | AI 解惑

这是一个什么三极管?

各位大哥大姐:小弟在一个接收模块上看到一个像TO-92封装三极管的元件。在电路中的作用是在调幅中频信号解调出调制信号。通过测量,它不是一个三极管,而是一个组合元件,请高手说出它的型号及其参数。…

查看全部问答>

串口调试

希望对大家有帮助…

查看全部问答>

关于单片机扩展422的问题

各位大大好!本人新人,最近想用51片子扩展串口,不知道用什么片子比较好...手头暂时有TL16C754,但是不知道他与51连接有什么特殊要求?(51能不能用它来扩展串口)如果能,那么最大波特率由谁决定,只是由TL16C754决定吗?如果不能,那么各位能推荐下起他 ...…

查看全部问答>

2011 TI M3 DAY资料提前放出

明天TI M3 DAY就要开始了,提前放出相关资料,感兴趣的朋友可以预习一下。 [ 本帖最后由 jkhu 于 2011-6-19 23:19 编辑 ]…

查看全部问答>

LPC2124管脚电平问题

在使用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 ...…

查看全部问答>

晒WEBENCH设计的过程+高性能电源设计之后端设计 二

同样是5.5V输入,5V @2.1A输出,还有一种方案是基于Simple Switcher的 Simple Switcher 顾名思义,简单的电源设计 同样是BUCK结构,但是内部集成了电感、电容能功率器件,所以外围电路十分简单 效率也很高,高达96%,纹波水平惊人的做到不 ...…

查看全部问答>

苹果收购LinX:iPhone或将采用双摄像头技术

根据 华尔街日报报道,苹果以2000万美金收购了以色列公司LinX Imaging,该公司主要研究多摄像头技术。同时,这意味着iPhone将有可能会采用长焦+短焦的双摄像头设计。 LinX可以为移动设备提供多摄像头传感器,可以在同一时间捕捉多张图片,利用算 ...…

查看全部问答>