历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2020年12月19日 | s5pv210----串口设置之输入输出字符

2020-12-19 来源:eefocus

第一节  S5PV210   UART相关说明
通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据。发送数据时,CPU 将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线的信号,将串行收集在缓冲区中,CPU 即可读取UART获得这些数据。


在S5PV210 中,UART提供了4 对独立的异步串口I/O 端口,有 4 个独立的通道,每个通道可以工作于DMA 模式或者中断模式。其中,通道0 有256byte 的的发送FIFO和256byte 的接收FIFO,通道1 有64byte的的发送FIFO和64byte的接收FIFO,而通道 2 和3 只有16byte的的发送FIFO和16byte的接收FIFO。


S5PV210 的uart结构图如下: 

UART使用标准的TTL/CMCOS 逻辑电平来表示数据,为了增强数据抗干扰能力和提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232 逻辑电平,查看原理图可知Mini210S使用的是MAX3232SOP芯片,使用的是TX0 和DX0:

搜索“XuTXD0”,可知

通过设置UART相关寄存器,我们就可以驱动UART工作,达到发送和接收字符的目的。

第二节  程序相关讲解

完整代码见目录12.uart_putchar,对比前一个目录11.clock_c,区别在于main.c和多了一个
uart.c文件。
 
1.  main.c
完整代码如下:
int main()
{
char c;
uart_init();        // 初始化串口  
 
while (1)
{
 c = getc ();    // 接收一个字符c
 putc(c+1);     // 发送字符c+1
}
return 0;
 
在main函数中,先会调用uart_init()初始化UART,然后使用 getc接收PC发过来的字符,再调
用putc()将该字符+1回复给PC。
2.  uart.c
art_init() 代码如下:
oid uart_init()
 
 
// 1 配置引脚用于RX/TX 功能
GPA0CON = 0x22222222;
GPA1CON = 0x2222;
 
// 2 设置数据格式等
UFCON0 = 0x1;      // 使能FIFO 
UMCON0 = 0x0;      // 无流控
ULCON0 = 0x3;      // 数据位:8, 无校验, 停止位: 1
UCON0  = 0x5;        // 时钟:PCLK,禁止中断,使能UART发送、接收
 
// 3 设置波特率
UBRDIV0 = UART_UBRDIV_VAL;       // 35
UDIVSLOT0 = UART_UDIVSLOT_VAL;   // 0x1
}
 
上述代码共有3 个步骤,下面我们来一一讲解每一个步骤:
第一步  配置引脚用于RX/TX 功能
参考UART引脚连接图,我们需要设置GPA0CON 和GPA1CON 寄存器使GPA0和GPA1引脚用于UART
功能。

第二步  设置数据格式等
<1>   ULCON0用来设置数据格式,见下图


  Word Length = 11,8bit 的数据;
  Number of Stop Bit = 0,1bit 的停止位;
  Parity Mode = 000,无校验;
  Infrared Mode =0,使用普通模式;
所以ULCON0=0x3
 
<2>  9 UCON0 是UART的配置寄存器,见下图

  Receive Mode = 01 ,使用中断模式或者轮询模式;
  Transmit Mode = 01,使用中断模式或者轮询模式;
  Send Break Signal = 0,普通传输;
  Loop-back Mode = 0,不使用回环方式;
  我们采用轮询的方式接受和发送数据,不使用中断,所以bit[6-9]均为0;
  Clock Selection = 0,使用PCLK作为UART的工作时钟;
  我们不使用DMA,所以bit[16]和bit[20]均为0;
所以UCON0 = 0x5
 
<3>  UFCON0和UMCON0
这两个寄存器比较简单,UFCON0用来使能FIFO,UMCON0用来设置无流控。
 
第三步  设置波特率
波特率即每秒传输的数据位数,涉及两个寄存器:UBRDIV0 和UDIVSLOT0

波特率设置相关公式:UBRDIVn + (num of 1's in UDIVSLOTn)/16 =  (PCLK / (bps x 16)) −1
其中,由Maximum Operating Frequenc y for Each Sub -block 图可知,UART工作于PSYS下,所
以PCLK即PCLK_PSYS = 66.5MHz,我们的波特率bps 设置为115200,所以
(66.5MHz/(115200 x 16) )  –  1 = 35.08  = UBRDIVn + (num of 1's in UDIVSLOTn)/16, 所以我
们设置UBRDIV0=35,UDIVSLOT0=0x1
 
getc()和putc()的代码如下:
// 接收一个字符  
char getc(void)
{
while ((UFSTAT0 & 0xff) == 0);    // 如果RX FIFO 空,等待
return URXH0;                     // 取数据
}
 
// 发送一个字符
void putc(char c)
{
while (UFSTAT0 & (1<<24));     // 如果TX FIFO 满,等待
UTXH0 = c;                        // 写数据
}

发送/接收状态寄存器
通过读UTRSTAT0 发送/接收状态寄存器,当Receive buffer data ready= 1 时说明接收到数据,读URXH0 寄存器可以得到8bit的数据;当Transmitter empty = 1 时说明可以发送数据,写8bit的数据到UTXH0。


第三节  编译代码和烧写运行
编译代码,在Fedora终端执行如下命令:
# cd 12.uart_putchar
# make  
在12.uart_putchar 目录下会生成uart.bin,我们将其烧写到开发板中。

第四节  实验现象
先连接好串口线,并通过MiniTools 自带的串口助手打开串口(注意要设置好波特率等参数,如图),然后从 PC键盘中敲入一个字符,则串口终端会显示该字符在ASCII 表中的下一字符,如输入‘a’,串口终端会出现‘b’


推荐阅读

史海拾趣

益升华(Essentra)公司的发展小趣事

作为一家有社会责任感的企业,益升华(Essentra)公司始终关注环保问题。公司积极采用环保材料和工艺,减少生产过程中的废弃物排放和能源消耗。同时,公司还倡导员工参与环保活动,提高环保意识。此外,益升华(Essentra)公司还积极推广循环经济和可持续发展理念,努力为社会和环境做出贡献。

德国ACAM公司的发展小趣事

2014年,ACAM公司迎来了一个重要的里程碑事件——被奥地利微电子股份有限公司收购。这次收购极大地增强了ACAM公司在时间数字转换器(TDC)技术领域的实力。奥地利微电子在半导体行业有着深厚的积累和丰富的经验,与ACAM公司的技术优势相结合,进一步提升了ACAM公司在市场上的竞争力。

FEIG ELECTRONIC公司的发展小趣事

自1997年以来,FEIG ELECTRONIC开始加速其全球扩张的步伐。通过不断的技术创新和市场推广,FEIG的产品逐渐覆盖了全球多个行业,包括物流、零售、医疗、制造等。FEIG凭借其高质量的产品和卓越的服务,赢得了全球客户的广泛认可,逐渐发展成为全球RFID领域的领军企业。

3D PLUS公司的发展小趣事

为了更好地满足客户需求,3D PLUS公司不仅提供硬件设备,还积极构建3D生态圈。公司推出了一系列3D个性化产品,包括3D全彩婚纱人像、3D梦幻水晶摆件等,这些产品独具潮流气息,深受市场欢迎。同时,公司还提供软件开发、定制开发等服务,帮助客户在移动端构建感性的3D商业场景,实现O2O移动营销的有效联动。这些举措不仅丰富了公司的产品线,也为客户提供了全方位的3D解决方案。

AIRPAX公司的发展小趣事

随着全球环保意识的提高,AIRPAX开始关注产品的环保性能。公司积极研发符合RoHS标准的产品,并致力于减少生产过程中的环境污染。同时,AIRPAX还推动了绿色供应链的建设,与供应商共同实现可持续发展。这些努力使得AIRPAX在电子行业中树立了绿色环保的良好形象。

Condor公司的发展小趣事

进入21世纪,AIRPAX开始积极拓展全球市场。通过与各国企业的合作与交流,AIRPAX的产品逐渐进入欧洲、亚洲等地区,服务于更多国家的客户。同时,AIRPAX还积极寻求与其他行业领先企业的战略合作,共同推动电气保护技术的发展。这些合作不仅提升了AIRPAX的品牌影响力,也为其带来了更多的商业机会。

问答坊 | AI 解惑

介绍一种新型“数字温湿度传感器”

这是采用双线串行数字接口的温湿度传感器,与单片机接口非常方便,时序也很简单。 测量的温度/湿度精度很高。我们使用以后觉得很好用,所以,介绍给大家。 特点如下: 相对湿度和温度测量 _ 兼有露点 _ 全标定输出,无需标定即可互换使用 ...…

查看全部问答>

关于IO0PIN指令的疑惑

关于IO0PIN指令的疑惑 最近在调一个键盘程序(LPC2103),用到了IO0PIN读端口指令(据说这是飞利浦系列的BUG),发现这个指令没有手册上说的那么简单呐,直接读是读不出来的。有人说要读一个输入状态的端口,要先把它设为输出,然后置高,最后再设 ...…

查看全部问答>

为什么我的按键中断在程序启动的时候总自动进入

为什么我的按键中断在程序启动的时候总自动进入,不是按下按键以后,而是程序一运行的时候就自动进入中断函数,请问这是什么原因呢?…

查看全部问答>

?哪里有Wince5.0 Pocket PC SDK

微软下载中心验证我的操作系统不是正版下不下来,请哪为高手帮忙?急需非常感谢!!!!…

查看全部问答>

SIM卡费用问题

我以前没接触过GMS,现在正在开发一个项目,需要用到GSM短信。我手头有个GSM模块的资料,但里面没有有关SIM卡剩余话费。请问各位大侠都是怎么解决的?我希望如果话费余额不足能在软件中提前显示出来。…

查看全部问答>

各位手上有什么比较好用的bootloader吗?要求可以将nk.bin文件下载到内存中运行。

有的话给我发推荐一份啊,如果有时间的话麻烦给我发一份。 我的邮箱cy757#21cn.com(#改为@)…

查看全部问答>

用verilog HDL 实现网络加密算法md5

用verilog HDL 实现一个网络加密的算法(md5),有没有哪位高手能给点帮助,我邮箱是poppy220@126.com 先谢过啦!^_^ …

查看全部问答>

STM8S有相应的低电压版本的吗?

有个项目用了STM8S105,电池供电(3节镍氢),系统中带DC-DC给功放供电,当DC-DC启动时或输出功率较大时,经常引起MCU复位。 STM8S有没有相应的低电压版本(即管脚,软件都一样,只是工作电压不同的)?…

查看全部问答>

一个很莫名其妙的问题

最近刚刚开始接触STM32,今天调试串口的时候发现一个很无奈的问题,源代码基本都是使用keil自带的demo,就不列举了。修改以下这些设置:/* PLLCLK = 12MHz * 6= 72 MHz */     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 ...…

查看全部问答>

想了想,还是把它出掉好了,STM32+W5100+SPI Flash+TFT,有点给力

这其实不是个开发板,而是个接近完成的产品(接近完成是指研发流程已经走完,但还未能进入市场)但资源比较给力--------------->    STM32ZET6,带外部总线于是可以用总线挂TFT--------------->    W5100,硬件TCP/IP协议 ...…

查看全部问答>