历史上的今天
返回首页

历史上的今天

今天是:2025年04月26日(星期六)

2019年04月26日 | S3C2440开发板裸机程序系列04—串口通信

2019-04-26 来源:eefocus

1.  S3C244串口概述


串口通讯一般要增加电平转换电路,原因是TTL/CMOS电平与RS232电平不一致:


TTL/CMOS电平:


CMOS电平:

常用的电平转换芯片是MAX3232。


S3C2440有3个独立的异步串口,可以选择工作在中断或DMA方式下。每个UART包括一个波特率发生器、发送器、接收器和一个控制单元。


UART有FIFO模式和非FIFO模式。FIFO模式下可以利用64字节的发送/接收缓冲寄存器,非FIFO模式下只使用了发送/接收缓冲寄存器中的1个字节。本篇入门级以非FIFO为例。


  

2.     串口设置及相关寄存器


串口引脚是GPIO复用的。本篇UART只用3根引脚:TXD、RXD、GND。


 

   

TXD0 – GPH2 , RXD0 – GPH3


 需要初始化以下6个寄存器:


ULCONn (UART LINE CONTROLREGISTER) – 设置数据位信息


UCONn(UART CONTROL REGISTER) – 设置发送和接收模式,及时钟源。



UBRDIVn– 设置UART波特率


波特率计算公式:


例子:


 UTRSTATn(UARTTX/RX REGISTER) – 状态位


使用while(!UTRSTAT0&(1<<2)); 等待发送完成(while(!UTRSTAT0&(1<<1)); 也可以)


使用while(!UTRSTAT0&(1<<0)); 等待接收数据。


UTXHn(HOLDINGREGISTER) – 发送缓冲寄存器(Transmit)


URXHn(HOLDINGREGISTER) – 接收缓冲寄存器(Receive)

3.     串口UART0应用


串口UART0接收到数据后再将其发出去。波特率为115200。


uart.h


#ifndef __UART_H__

#define __UART_H__

 

extern void Uart0_Init(unsigned int baudrate);

extern void putc(unsigned char c);

extern unsigned char getc(void);

 

#endif

uart.c 


#include "2440addr.h"

 

#define PCLK 50000000

void Uart0_Init(unsigned int baudrate)

{

rGPHCON &= ~((3<<4)|(3<<6));

rGPHCON |= (2<<4)|(2<<6); //GPH2-TXD, GPH3-RXD

rGPHUP &= ~((1<<2)|(1<<3)); //GPH2,GPH3 enable pull-up


rULCON0 = 0x03; //8-bits 1-stop bit

rUCON0 = 0x05;

rUBRDIV0 = (int)(PCLK/baudrate/16)-1;

rURXH0 = 0;

}

 

void putc(unsigned char c)

{

rUTXH0 = c;

// while(!(rUTRSTAT0 & (1<<2)));

while(!(rUTRSTAT0 & (1<<1))); //ok

}

 

unsigned char getc(void)

{

while(!(rUTRSTAT0 & (1<<0)));

return rURXH0;

}

Main.c


#include "common.h"

#include "uart.h"

 

int Main()

{

unsigned char a;

Uart0_Init(115200);

while(1)

{

a=getc();

putc(a);

}

return 0;

}

推荐阅读

史海拾趣

问答坊 | AI 解惑

我的tms320vc5509的板子打样出来了

今天中午去电子市场取回来了,顺便买了几个东东。 两层板,另一面也有些电容电阻之类的。我在淘宝上问了下,要230。 最后还是送到我经常打样的人那儿,先做四个样板。100元   100*80cm大小。 虽然质量不算太好。作为实验用还是可以 ...…

查看全部问答>

PCB_LAYOUT(台湾资深硬件工程师15年Layout资料)

PCB_LAYOUT(台湾资深硬件工程师15年Layout资料)…

查看全部问答>

北京 芯嵌工作室承接电子项目 ARM MCU等

本工作室由多位资深工程师,可为客户定制ARM平台、Xcale平台、各种单片机平台及板卡设计服务。硬件设计及软件设计(WINCE LINUX)都已做过6-8年的设计,电路板目前以6层板设计为主。 其成功案例有: 基于S3C2440 的PDA手持终端、 基于PXA270 的数 ...…

查看全部问答>

Call-Center 硬件

要做一个小型的呼叫系统,支持4路坐席,要有自助语音服务,录音服务等;请大家介绍下,这方面的硬件,最好有具体的方案…

查看全部问答>

救助:vxworks 下zbuf socket 编程

  以前在windows 下写过socket 程序,现在要在vxworks 下使用zbuf ,不知道怎么用。tornado 的文档里面有介绍zbuf 的使用,但我现在用的是workbench,这里面的文档没有介绍zbuf的,不知道是不是也支持zbuf?这下面好像没有 zbufLib.h 头 ...…

查看全部问答>

关于EVC打开资源问题

我的工程是一个基于对话框,在workspase里打不开class和resourceview 只能打开fileview,双击class和resourceview就自己关了,在打开工程时也要开几次了 ,我的工程里多了MVCIA.tmp和RCao2632两个文件了  这是怎么回事了 麻烦个位了哈 小 ...…

查看全部问答>

请教WinCE的打印问题

我用VB.net2005开发WinCE程序,我想调用WinCE系统的打印对话框,请问该怎么写才能调用打印对话框?…

查看全部问答>

proteus 仿真出现OPCODE 错误

Invalid opcode 0xFFFF at PC=0x001A,刚开始写程序的时候,没有问题,加上中断以后就出现这样的错误了…

查看全部问答>

【求助】请教大家一个二次表的问题

请问大家,我有个项目,厂家要求显示瞬时流量为每小时的流量,我打算每秒钟采相应的压力,温度,差压,频率进来,然后计算出流量来,我这个每秒钟计算出来的流量是不是还要乘以3600才能做为每小时的瞬时流量呢?谢谢…

查看全部问答>