UART波特率除数因子寄存器(UART Baud Rate Divisor Registers,UBRDIV0、UBRDIV1):
UART波特率除数因子寄存器UBRDIV0、UBRDIV1的值,决定发送、接收的波特率。
寄存器
偏移地址
操作
功能描述
复位值
UBRDIV0
0xD014
读/写
UART0波特率除数因子寄存器
0x0000,0000
UBRDIV1
0xE014
读/写
UART1波特率除数因子寄存器
0x0000,0000
[3:0]波特率除数因子值(CNT1)
xxx0=除1
xxx1=除16
[15:4]时间常数值(CNT0)
CNT0的计算公式如下:
CNT0=MCLK/(32×BR)-1
MCLK:系统的工作频率。
BR:通讯的波特率。
UART波特率示例:
UART的波特率发生器的输入时钟可以为系统时钟,也可以从外部引入时钟信号。
若选用系统时钟为波特率发生器的输入时钟,当系统时钟为50MHz时,则最大的波特率时钟输出为MCLK2/16(= 1.5625MHz),其中MCLK2为系统时钟MCLK除以2。
UCLK引脚为UART0、UART1的外部时钟输入引脚。UART波特率发生器的输入时钟MCLK2或UCLK,由寄存器UCCON[6]选择。
下图为UART波特率发生器的结构图.
关于UART工作原理和使用方法的更详细内容,可参考S3C4510B用户手册。
以下的示例完成通过串行口UART0发送数据的功能,接收功能的编程与之类似。该示例的通讯协议为:19200波特、8位数据、1位停止、无校验。
打开CodeWarrior for ARM Developer Suite(或ARM Project Manager),新建一个项目,并新建一个文件,名为Init.s,具体内容与第一个例子相同。
保存Init.s,并添加到新建的项目。
再新建一个文件,名为main.c,具体内容如下:
/*******************************************************************
*InstituteofAutomation,ChineseAcademyof Sciences
* File Name:main.c
* Description:
* Author:JuGuang.Lee
* Date:
*************************************************************/
#define ULCON0(*(volatile unsigned *)0x03FFD000) //UART channel0 line control register
#define UCON0(*(volatile unsigned *)0x03FFD004) //UART channel0 control register
#define USTAT0(*(volatile unsigned *)0x03FFD008) //UART channel0 status register
#define UTXBUF0(*(volatile unsigned *)0x03FFD00c) //UART channel0 transimit holding register
#define URXBUF0(*(volatile unsigned *)0x03FFD010) //UART channel0 recieve buffer register
#define UBRDIV0(*(volatile unsigned *)0x03FFD014) //Baud rate divisor register0
#define ULCON1(*(volatile unsigned *)0x03FFE000) //UART channel1 line control register
#define UCON1(*(volatile unsigned *)0x03FFE004) //UART channel1 control register
#define USTAT1(*(volatile unsigned *)0x03FFE008) //UART channel1 status register
#define UTXBUF1(*(volatile unsigned *)0x03FFE00c) //UART channel1 transimit holding register
#define URXBUF1(*(volatile unsigned *)0x03FFE010) //UART channel1 recieve buffer register
#define UBRDIV1(*(volatile unsigned *)0x03FFE014) //Baud rate divisor register1
void InitUART(intPort,int Baudrate);
void PrintUART(intPort,char *s);
intMain()
{
InitUART(0,0x500);//19200bpsCPU工作频率50MHz0=COM1;1=COM2
for(;;){
PrintUART(0,"Communcation Testting! \r\n");
}
return(0);
}
void PrintUART(intPort,char *s)
{
if(Port==0)
for(;*s!='\0';s++)
{
for(;(!(USTAT0&0x40)););
UTXBUF0=*s;
}
if(Port==1)
for(;*s!='\0';s++)
{
for(;(!(USTAT1&0x40)););
UTXBUF1=*s;
}
}
void InitUART(intPort,int Baudrate)
{
if(Port==0)
{
ULCON0=0x03;
UCON0=0x09;
UBRDIV0=Baudrate;
}
if(Port==1)
{
ULCON1=0x03;
UCON1=0x09;
UBRDIV1=Baudrate;
}
}
保存main.c,并添加到新建的项目。此时可对该项目进行编译链接,生成可执行的映象文件,当可执行的映象文件运行时,会不停的向UART0发送字符串“Communcation Testting!”
_________________________________转自堆 栈 的 栈博客,We are Looking Forward to a Promising Future