s3c2440裸机-UART编程-2-UART编程实现

发布者:SereneVoyage最新更新时间:2024-07-08 来源: elecfans关键字:UART  编程 手机看文章 扫描二维码
随时随地手机看文章

UART编程

1.初始化

我们的2440支持3个UART串口,以uart0为例讲解。 那么我们需要实现以下这几个函数完成串口的最基本功能:


(1)uart0_init()用于初始化串口

(2)putchar()用于发送一个字符

(3)getchar()用于接收一个字符

(4)puts()用于发送一串字符

1.uart0_init()


1.配置uart0引脚

(1)根据原理图GPH2,3用于TxD0, RxD0。


(2)查看dataset,配置GPH控制寄存器,让GPH2,3配成uart模式;为了将其保持为高电平,先设置其为上拉。

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

GPHCON |= ((2<<4) | (2<<6));

GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */


UCON0 = 0x00000005; /* 时钟源选择PCLK,中断/查询模式 */


2.设置波特率

/* uart clock=50M,假设我们想要波特率=115200,

** 根据公式UBRDIVn = (int)(UART clock/( buad rate x 16) ) –1

** 得到UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26

*/

UBRDIV0 = 26;


3. 设置数据格式


数据格式设置为常用的8n1,表示8个数据位, 无较验位, 1个停止位 ULCON0 = 0x00000003; / 8n1: 8个数据位(数据+校验), 无较验位, 1个停止位 /


2.putchar(),getchar()

putchar就是向发送寄存器(UTXH0)写入值进去。

getchar就是从接受寄存器(URXH0)取出值。


无论是getchar还是putchar都可以通过读取状态寄存器(UTRSTAT0)来作为传输结束判断标志。


查询其第2位判断发送buff是否为空,即上一次发送是否完成,如果完成即向UTXH0写入要发送的新数据;

查询其第0位判断接收buff是否有数据接受到,如果有数据接收到,返回接收buffer的值。



int putchar(int c)

{

    while (!(UTRSTAT0 & (1<<2)));

    UTXH0 = (unsigned char)c;


}


int getchar(void)

{

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

    return URXH0;

}

3.puts()

int puts(const char *s)

{

    while (*s)

    {

        putchar(*s);

        s++;

    }

}


关键字:UART  编程 引用地址:s3c2440裸机-UART编程-2-UART编程实现

上一篇:s3c2440裸机-内存控制器1-内存控制器的原理
下一篇:s3c2440裸机-UART编程1-UART硬件介绍及传输原理

推荐阅读最新更新时间:2026-03-19 13:49

s3c2440裸机-UART编程-2-UART编程实现
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解。 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putchar()用于发送一个字符 (3)getchar()用于接收一个字符 (4)puts()用于发送一串字符 1.uart0_init() 1.配置uart0引脚 (1)根据原理图GPH2,3用于TxD0, RxD0。 (2)查看dataset,配置GPH控制寄存器,让GPH2,3配成uart模式;为了将其保持为高电平,先设置其为上拉。 GPHCON &= ~((3 4) | (3 6)); G
[单片机]
s3c2440裸机-UART编程(二、UART编程实现)
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解。 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putchar()用于发送一个字符 (3)getchar()用于接收一个字符 (4)puts()用于发送一串字符 1.uart0_init() 1.配置uart0引脚 (1)根据原理图GPH2,3用于TxD0, RxD0。 (2)查看dataset,配置GPH控制寄存器,让GPH2,3配成uart模式;为了将其保持为高电平,先设置其为上拉。 GPHCON &= ~((3 4) | (3 6)); GPHCON |= ((2 4) | (
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>UART</font><font color='red'>编程</font>(二、<font color='red'>UART</font><font color='red'>编程</font>实现)
s3c2440裸机-I2c编程-1-i2c协议
1.硬件电路 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。如下图: SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平。 I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。SDA 和 SCL 这两根线必须要接一个上拉电阻,一般是 4.7K。 2.i2c协议规则 传输过程如下: 主控发送start讯号(S) 主控发送从设备地址(slave dev addr) 主控发送方向(W/R) 从设备应答(ack) 主控(or从设备)发送数据(data) 从设备(or主控)应答(ack) … 主控发送
[单片机]
s3c2440裸机-I2c编程-3-i2c程序框架
1.iiC设备的功能 很显然,IIC控制器提供了传输数据的能力,至于数据有什么含义,IIC控制器并不知道,数据的含义有外部i2c从设备,我们需要阅读芯片手册,才知道IIC控制器应该发出怎样的数据。 下图是AT24cxx的操作方法: 2.I2c程序框架 显然我们的程序应该分为两层(IIC设备层,IIC控制器层),框架如下图所示: 最上层是i2c_test层,用来对i2c的功能进行测试和验证。 第2层是i2c设备层,用来对具体某一型号的从设备进行i2c读写 第3层是通用i2c控制器层,用来提供对具体某一型号的i2c主控进行管理操作 最底层是i2c控制器具体的型号层 在通用i2c控制层,我们提供一个统一的接口i2c_tran
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-I2c<font color='red'>编程</font>-3-i2c程序框架
s3c2440裸机-LCD编程-6-LCD上显示字符
1.字库的移植 字符也是由点构成的,一个个点组成的点阵,其实本质上要显示文字就是把字库移植到对应的自己型号相匹配的board上,字库中的每一个字符都是一些点按照对应格式组合成的集合。 从linux内核源码中随便挑选一个字库文件,比如linux-4.18.16/lib/fonts这个目录下就有对应的很多字库文件。在这里我挑选font_8x16.c,如下图: 其中8x16表示每个字符所占的像素点的大小,表示每个字符占的大小为长*宽=8*16个像素点。 我们来看下一个字符'A'是如何显示的?从font_8x16.c我们找到字符'A'的数据,如下图: 那么我们如何让font_8x16.c这个字
[单片机]
s3c2440裸机-LCD编程-2-LCD控制器
1.LCD控制器框图 从上图看出,S3C2440 LCD控制器用于传输视频数据并且生成必要的控制信号,如VFRAME,VLINE,VCLK,VM等。除了控制信号,S3C2440还有视频数据端口,即VD 。通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与)把内存上FrameBuffer里的数据,通过VIDPRCS发送到引脚VD 数据总线上,再配合VIDEOMUX引脚的控制信号,正确的显示出来。 REGBANK:具有17个可编程寄存器组和256x16调色板存储器,用于配置LCD控制器。 TIMEGEN:产生控制信号,例如 VSYNC、HSYNC、VCLK等信号 LCDCDMA:可以自动从FrameBu
[单片机]
s3c2440裸机-时钟编程(二、配置时钟寄存器)
1.2440时钟时序 下图是2440时钟配置时序: 1.上电后,nRESET复位信号拉低,此时cpu还无法取指令工作。 2.nRESET复位信号结束后变为高电平,此时cpu开始工作。此时cpu主频FCLK=osc。 3.此时可以配置PLL,经过lock time后,FCLK倍频成新的时钟。 2.如何配置时钟 在参考手册的特性里介绍了S3C2440的工作频率,Fclk最高400MHz,Hclk最高136MHz,Pclk最高68MHz。那么 我们干脆配置FCLK:HCLK:PCLK= 400:100:50 (MHz). 1,先配置lock time 我们取芯片手册上的推荐值。 /* LOCKTIME(0x4C000000)
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-时钟<font color='red'>编程</font>(二、配置时钟寄存器)
s3c2440裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
前提: norflash初始化正常,能够正常从nor上执行。 cpu总是从0地址读取指令执行程序。当cpu设置成nor启动时,0地址对应nor。cpu从nand启动时,0地址对应sram。 1.读取norFlash 我们将板子设为nor启动,那么0地址对应nor,我们先将uboot烧写到nor中。我们先看下这款NorFlash的手册,找到操作flash的命令表: 下面简单的举一些例子: 1)复位(reset): 往任何一个地址写入F0即可。 2)读ID: 很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte),我们这款norflash数据位宽为16bit。下面我们按照nor手册上的命令表
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-内存控制器(三-3、norflash<font color='red'>编程</font>之uboot中操作norflash)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved