2440裸机编程之八 UART通用异步收发

2019-11-09来源: 51hei关键字:2440  裸机编程  UART  通用异步收发

S3C2440A 内部集成的UART(通用异步收发器)单元提供三个独立的异步串行I/O端口,也就是通常所说的串口。串口是用途广泛的通讯口,很多工业现场总线都以串口为基础。在这里,串口不仅可以用来与外部设备进行数据通讯,还可以用来观察系统的运行状况,例如前面已经使用过的利用串口终端工具观察程序运行情况的方法。 S3C2440A 的UART 单元提供三个独立的异步串行I/O 端口,每个都可以在中断或DMA 两种模式下工作。它们支持的最高波特率为115. 2 kbps。每个UART 通道包含2 个64 位FIFO 分别供接收和发送使用。


S3C2440A 的UART 具有以下可配置的参数项目:可编程的波特率,红外收/发模式,l 或2 个停止位,5 位、6 位、7 位或8 位数据宽度和奇偶校验位。每个UART模块包含以下几个部件:波特率发生器,发送器,接收器和控制单元。波特率发生器可以以PCLK、FCLK或UEXTCLK作为时钟源。发送器和接收器包含64字节的FIFO和移位寄存器。要被发送的数据,首先被写入FIFO,然后被拷贝到发送移位寄存器中,最后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从数据接收端口(RxDn)依次被移位输入到移位寄存器,然后被拷贝到FIFO中。





这里以uart0简单介绍它的使用。
ULCON0     用于选择 模式、校验、停止位、数据位
UCON0      用于使能 发送、接收
UBRDIV0    设置uart0波特率,波特率 = PCLK/(UBRDIV0+1) /16
UTRSTAT0   接收和发送完毕的标志,用于软件查询
URXH0      接收数据寄存器,存放接收到的数据
UTXH0      发送数据寄存器,用于发送


这是个uart0的简单收发程序:

//********************************************************************
#define bps 115200
char ch;

void Main(void)
{     
    int i;
    ……硬件初始化……

uart0_init();
Uart_Printf(" uart串口实验nnn");
Uart_Printf(" 请发送一个字符n");
while(1) 
{
  ch=receive_byte();
  transmit_string("你刚发送了:");
  transmit_byte(ch);
  transmit_byte('n');
}
}

void uart0_init(void)
{
rGPHCON = rGPHCON & ~(0xf<<4) | 2<<4 | 2<<6 ; //GPH2、3 选为 TXD、RXD
rUMCON0 = 0x0;         //关闭控制流功能
rULCON0 = 0<<6 | 0<<3 | 0<<2 | 3;    //普通模式、无校验、1位停止位、8位数据位
rUCON0  = 1<<2 | 1;        //发送模式:允许、接收模式:允许
rUBRDIV0=(U32)(PCLK/(bps*16))-1;    //设置波特率,pclk 为ARM 时钟频率,bps 为传输波特率
}

char receive_byte(void)   //接收一个字节
{
while(!(rUTRSTAT0&0x1)); //等待接收到数据
return rURXH0&0xff;   //返回数据 
}


void transmit_byte(char data) //发送一个字节
{
while(!(rUTRSTAT0 & 0x2)); //等待发送缓存区为空
rUTXH0=data;    //发送数据
}


void transmit_string(char* p) //发送一个字符串
{
while(*p != '')
  transmit_byte(*p++);
}


//*******************************************************************


结果如图:




当然也可以用中断来处理,这里接收用中断做。
//********************************************************************
#define bps 115200
char ch;

void Main(void)
{     
    int i;
    ……硬件初始化……

uart0_init();
Uart_Printf(" uart串口实验nnn");
Uart_Printf(" 请发送一个字符n");
while(1); //等待中断
}

void uart0_init(void)
{
rGPHCON = rGPHCON & ~(0xf<<4) | 2<<4 | 2<<6 ; //GPH2、3 选为 TXD、RXD
rUMCON0 = 0x0;         //关闭控制流功能
rULCON0 = 0<<6 | 0<<3 | 0<<2 | 3;    //普通模式、无校验、1位停止位、8位数据位
rUCON0  = 1<<2 | 1;        //发送模式:允许、接收模式:允许
rUBRDIV0=(U32)(PCLK/(bps*16))-1;    //设置波特率,pclk 为ARM 时钟频率,baud 为传//输波特率



rSUBSRCPND = 1;      //SUBSRCPND的RXD0位 清0
rSRCPND = 1<<28;     //SRCPND的UART0位 清0
rINTPND = 1<<28;     //INTPND的UART0位 清0
pISR_UART0 = (U32)receive_int;  //申请中断向量
rINTSUBMSK = rINTSUBMSK & ~(1);  //禁止RXD0的屏蔽
rINTMSK = rINTMSK & ~(1<<28);  //禁止UART0的屏蔽
}

char receive_byte(void)   //接收一个字节
{
while(!(rUTRSTAT0&0x1)); //等待接收到数据
return rURXH0&0xff;   //返回数据 
}


void transmit_byte(char data) //发送一个字节
{
while(!(rUTRSTAT0 & 0x2)); //等待发送缓存区为空
rUTXH0=data;    //发送数据
}


void transmit_string(char* p) //发送一个字符串
{
while(*p != '')
  transmit_byte(*p++);
}


void receive_int(void) __irq
{
transmit_string("(中断)你刚发送了:");
transmit_byte(rURXH0&0xff);
transmit_byte('n');

rSUBSRCPND = 1;      //SUBSRCPND的RXD0位 清0
rSRCPND = 1<<28;     //SRCPND的UART0位 清0
rINTPND = 1<<28;     //INTPND的UART0位 清0
}


//*******************************************************************


运行正常:


关键字:2440  裸机编程  UART  通用异步收发 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479516.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:2440裸机编程之九 LCD液晶显示器
下一篇:2440裸机编程之七 模数转换器ADC

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

S3C2440裸奔之环境搭建
首先需要搭建一个可以编译代码的环境。从一开始我就不想用ADS(安装完ADS后会产生一个CodeWarrior for ARM Developer Suite的工具,可以编译和调试代码),虽然它是个很好的工具,但是它却隐藏了很多的细节,不利于新手去深度学习。所以我还是希望从Makefile入手,一步一步弄懂所有的细节。第一步:需要先搭建一个Linux环境,我是安装在虚拟机上面的。安装好Linux后,再从网上下载arm-linux-gcc,一般解压后之后就可以直接使用了,但需要先设置好环境参数。二步:编写代码,然后在Linux系统上进行编译。代码在后面会给出。第三步:需要把编译好的bin文件烧写到板子上。这个需要使用J-Link烧录器,
发表于 2019-11-11
S3C2440裸奔之环境搭建
S3C2440裸奔之SDRAM
先安装ADS1.2,该软件主要用来编译并调试ARM处理器的程序的。下面所有的源程序都将通过ADS编译并最终链接成可执行文件,即.bin文件。下面的程序主要是先初始化SDRAM,然后将程序跳转到SDRAM中,并点亮4个LED灯。在ARM处理器启动的最开始,一般都需要:1、关闭“看门狗”;2、关闭中断;然后再初始化SDRAM,因为在初始化SDRAM时,要用到时钟频率,所以也需要设置时钟频率。以下是用汇编语言写的起动代码,为后面的C语言环境作铺垫。WTCON    EQU  0x53000000     ;Watch-dog timer modeINTMSK     E
发表于 2019-11-11
2440裸机编程之五 定时器
S3C2440A 具有5 个16 位定时器,每个定时器可以按照中断模式或DMA 模式工作。定时器0,1,2,3 具有PWM 功能。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,通常用于大电流设备。定时器特性总结如下。● 5 个16 位定时器可以工作在中断模式或DMA 模式。● 包括2 个8 位预分频器、2 个4 位分割器。● 输出波形的占空比可用编程控制(即进行脉宽调制)。● 具有自动重载模式或单次触发模式。● 具有死区发生器。与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn定时器的频率由PCLK分频而来,即Ftimer = PCLK
发表于 2019-11-11
2440裸机编程之五 定时器
2440裸机编程之六 实时时钟
实时日历时钟(RTC)单元作为S3C2440A 内部一个独立的功能单元,能够像钟表和日历一样保存并自动计算时间。它还具有定时报警和产生节拍的功能。RTC 单元仅需要通过外接一个32. 768 kHz 的晶振来提供时钟源。RTC 可以通过备用电池供电,因此,即使系统电源关闭,也可以继续工作。RTC 的寄存器保存了一些表示时间的8 位BCD 码数据,包括:秒、分、时、日期、星期、月和年。下面分四部分分别介绍:RTC的显示,RTC的设置,RTC的节拍中断,RTC的报警中断一、RTC的显示RTCCON用于RTC的控制,其中RTCCON[0]用于控制使能,所以在操作RTC的任何寄存器之前,要使这一位使能,这样才使操作有效rBCDYEAR&nb
发表于 2019-11-09
2440裸机编程之六 实时时钟
2440裸机编程之七 模数转换器ADC
S3C2440A 内部具有8 路模拟信号输入的10 位模/数转换器(ADC)。用到的寄存器有:ADCCON:用于选择通道、设置频率、开始转换、结束标志   ADC的频率 = PCLK/(ADCCON[13:6]+1)ADCDATn:用于读出ADC通道n的转换结果:ADCDATn[9:0]下面是个ADC通道0的实验程序://********************************************************************#define adc_frequency 2000000void Main(void){       &nb
发表于 2019-11-09
2440裸机编程之七 模数转换器ADC
2440裸机编程之九 LCD液晶显示器
)+(VFPD+1)+(LINEVAL+1)]=17.5÷270=64.8Hz在有些情况下,s3c2440 的LCD 时钟信号的默认极性与所控制的LCD 时钟信号的极性相反,这时可以通过寄存器LCDCON5 的相关位来改变某些时钟信号的极性。2、显示缓存区只要把所要显示的数据放入显示缓存区内,就可以在屏幕上呈现内容。该缓存区是我们自己编程时开辟的一段内存区。一般我们是通过定义一个与屏幕尺寸大小相同的二维数组来开辟该空间的,这样控制屏幕内容会方便一些,如当屏幕的尺寸为640×480 时,可以定义该缓存区为LCD_BUFFER[480][640]。由于s3c2440 支持16 位和24 位的非调色板真彩色的TFT 型LCD 模式,而24 位颜色模式
发表于 2019-11-09
2440裸机编程之九 LCD液晶显示器
小广播
何立民专栏 单片机及嵌入式宝典

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

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