版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
S3C44B0的UART接口功能及应用开发UART概述UART(UniversalAsynchronousReceiver/Transmitter)通用异步收发器提供两个独立的UART;皆可工作于中断和DMA模式,即UART可以通过产生中断或DMA请求来完成CPU和UART间的数据传输;最高波特率达115.2Kbps;每一个UART单元包含一个16字节的FIFO,用于数据的接收和发送,其次还包含一个波特率发生器,接收器,发送器和控制单元。提供两个串口DB9。其中UART1为主串口,可与PC或MODOM进行串行通迅。采用MAX3243E作为电平转换器UART0只采用二根接线RXD和TXD,因此只能进行简单的数据传输及接收功能。UART0采用MAX3221E作为电平转换器。UART概述工作过程串口在电气连接上有3wire和9wireUART程序设计串口初始化数据发送和接收数据UART的操作数据发送数据接收自动流控制AFC(AutoFlowControl)非自动流控制波特率的产生回环(Loop-back)模式数据发送与接收工作过程数据帧格式:可编程,它包含1个开始位,5到8个数据位,一个可选奇偶位和1到2个的停止位,具体由行控制寄存器(ULCONn)来定义。接收状态:溢出错误表明新的数据在旧数据没有被读取的情况下,覆盖了旧的数据。奇偶错误表明接收器发现一个不希望出现的奇偶错误。帧错误表明接收到的数据没有一个有效的停止位。断点条件表明接收器收到的输入保持了大于传输一帧数据时间的逻辑0状态。UART的行控制寄存器UART行控制寄存器ULCON0 地址:0x01D00000 R/W 初始值0x00UART0的行控制寄存器ULCON1 地址:0x01D04000 R/W 初始值0x00UART1的行控制寄存器位位名称描述[7]保留[6]Infra-RedMode该位确定是否使用红外模式0=普通操作模式
1=红外发送/接收模式[5:3]ParityMode该位确定奇偶如何产生和校验0xx=无
100=奇校验101=偶校验
110=强制为1111=强制为0[2]Stopbit该位确定停止位的个数0=每帧一位停止位
1=每帧两位停止位[1:0]Wordlength该位确定数据位的个数00=5位
01=6位
10=7位
11=8位自动流控制AFCnRTS:发送请求信号nCTS:清除发送信号nCTS信号有效表示对方UART的接收FIFO已准备好,nRTS信号有效表示自己的接收器FIFO已经准备好;CTS信号控制发送器的操作,接收器的状态影响RTS信号非自动流控制主要用于与modem连接时使用UART控制寄存器UCON0 UART0控制寄存器
地址:0x01D00004 R/W 始值0x00UCON1 UART1控制寄存器地址:0x01D04004 R/W 初始值0x00位位名称描述[9]Txinterrupttype发送中断请求类型0=脉冲
1=电平[8]Rxinterrupttype接收中断请求类型0=脉冲
1=电平[7]Rxtimeoutenable允许/不允许Rx超时中断0=不允许
1=允许[6]interruptenable允许/不允许产生UART错误中断0=不允许
1=允许[5]Loop-backMode该位为1使UART进入回环模式(loopback)模式0=普通运行
1=回环模式(loopback)[4]SendBreakSignal该位为1使UART发送一个暂停条件,该位在发送一个暂停信号后自动清除0=正常传送
1=发送暂停条件[3:2]TransmitMode这两位确定哪个模式可以写TX数据到UART发送保持寄存器00=禁止(Disable)01=中断请求或
polling模式10=BDMA0请求(仅用于UART0)11=BDMA1请求(仅用于UART1)[1:0]ReceiveMode这两位确定哪个模式可以从UART接收缓冲寄存器读数据00=禁止(Disable)
01=中断请求或
polling模式10=BDMA0请求(仅用于UART0)11=BDMA1请求(仅用于UART1)波特率的产生UART传输的时钟:由内部系统时钟经16位分频器分频后产生。UART波特率分频寄存器
UBRDIV0UART波特率分频寄存器UBRDIV0UART0波特率分频寄存器地址:0x01D00028 R/W
UBRDIV1UART1波特率分频寄存器
地址:0x01D04028 R/W
波特率的产生UBRDIVn=(round_off)(MCLK/(bps×16))–1例如:如果波特率为115200bps,而MCLK为40MHz,则:UBRDIVn=(int)(40000000/(115200*16)+0.5)-1=(int)(21.7+0.5)-1=22-1=21round_off四舍五入UARTFIFO控制寄存器UFCON0 UART0FIFO控制寄存器地址:0x01D00008 R/W 初始值0x00UFCON1 UART1FIFO控制寄存器地址:0x01D04008 R/W 初始值0x00位位名称描述[7:6]TxFIFOTriggerLevel这两位确定发送FIFO的触发条件00=空
01=4-byte10=8-byte 11=12-byte[5:4]RxFIFOTriggerLevel这两位确定接收FIFO的触发条件00=4-byte 01=8-byte10=12-byte 11=16-byte[3]保留[2]TxFIFOResetTXFIFO复位位,该位在FIFO复位后自动清除0=正常
1=TxFIFO复位[1]RxFIFOResetRxFIFO复位位该位在FIFO复位后自动清除0=正常
1=RxFIFO复位[0]FIFOEnable0=FIFO禁止
1=FIFO模式初始化voidUart_Init(int
mclk,intbaud){
inti;
mclk=MCLK;rUFCON0=0x0; //禁止FIFO
rUMCON0=0x0;
//禁止AFC
rULCON0=0x3; //普通模式,无奇偶校验,1个停止位,8位数据位
rUCON0=0x245;//rx为边沿触发、tx为电平触发、
//禁止超时中断、产生接受错误中断、
//普通传送、发送与接受为轮循模式
rUBRDIV0=((int)(mclk/16./baud+0.5)-1);
for(i=0;i<100;i++);//延时作用}UART发送保持寄存器UTXH0/1 UTXH0 UART0发送缓冲寄存器
地址:0x01D00020(小端模式) 0x01D00023(大端模式)UTXH1 UART1发送缓冲寄存器地址:0x01D04020(小端模式) 0x01D04023(大端模式)
UART接收保持寄存器UART接收缓冲寄存器和FIFO寄存器URXH0 UART0接收缓冲寄存器地址:0x01D00024(小端模式) 0x01D00027(大端模式)URXH1 UART1接收缓冲寄存器地址:0x01D04024(小端模式) 0x01D04027(大端模式)UARTTx/Rx状态寄存器UTRSTAT0
UART0TX/RX状态寄存器地址:0x01D00010
R
初始值0x6 UTRSTAT1
UART1TX/RX状态寄存器
地址:0x01D04010
R
初始值0x6 位位名称描述[2]TransmitshifterEmpty该位在发送移位寄存器没有有效的数据或发送移位寄存器为空时为10=发送移位寄存器不空
1=发送移位寄存器空[1]TransmitbufferEmpty该位在发送缓冲寄存器没有包含有效的数据为1。如果UART使用FIFO,用户应当检查UFSTAT寄存器的TxFIFO计数位和TxFIFO满标志位代替检查该位。
0=不空
1=空[0]Receivebufferdataready无论何时接收缓冲寄存器包含有效数据,该位为1,如果UART使用FIFO,用户应当检查UFSTAT寄存器的RxFIFO计数位代替检查该位。0=空
1=接收缓冲寄存器中有接收数据发送字符voidUart_SendByte(intdata){
if(data=='\n') {
while(!(rUTRSTAT0&0x2));//一直等到THR为空
Delay(10);//因为超级终端的响应慢
WrUTXH0('\r'); }
while(!(rUTRSTAT0&0x2));//一直等到THR为空
Delay(10);
WrUTXH0(data);//将数据写入发送保存寄存器中}
#defineWrUTXH0(ch)(*(volatileunsignedchar*)0x1d00020)=(unsignedchar)(ch)发送字符串voidUart_SendString(char*pt){while(*pt)
Uart_SendByte(*pt++);}
接收字符charUart_Getch(void){
while(!(rUTRSTAT0&0x1));//Receivedataread returnRdURXH0();
//返回接收保持寄存器的内容}#defineRdURXH0() (*(volatileunsignedchar*)0x1d00024)voidMain(void){ charinput_char; /*userinputchar*/
inti;charpt_str[10]={0,0,0,0,0,0,0,0,0,0};
sys_Init(); Uart_Init(0,115200);for(i=0;i<10;i++){
pt_str[i]=Uart_Getch();//接收到一个字符
Uart_SendByte(pt_str[i]);//发送刚才收到的字符
}
Uart_SendString(*pt_str);//发送整串字符}超级终端的配置打开超级终端:开始/程序/附件/通信/超级终端配置:
115200波特率,8位数据位,无奇偶检验,1位停止位,无硬件流控制。
格式化输出函数Uart_Printf(“pleaseinput:\n“);voidUart_Printf(char*fmt,...){
va_list
ap;charstring[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);}函数申明:
int
vsprintf(char*buf,constchar
*format,
va_list
arglist);
函数用途:
该函数作用同sprintf函数,向变量输出格式化字符串。区别是参数表由一个va_list类型的指针代替
头文件:
stdio.h
stdarg.h
输入参数:
format:参数格式说明,具体参见printf函数
arglist:参数列表指针,类型va_list是一个void类型的指针(见stdarg.h),即等价于:
int
vsprintf(char
*buf,
const
char
*format,
void
*arglist)
输出参数:
buf:要写入的缓冲区
实时时钟RTC功能:日历/时钟及数据存储功能定时功能特点:
RTC可在断电后继续使用
8位BCD数据,秒\分\时\日\月\年
硬件支持闰年产生器操作:读/写RTC模块中的寄存器,读取并设置产生滴答时钟中断。
RTC功能框图
时钟源由外部32.768KHz晶振提供操作:
1.读取并设置当前的时间,读/写RTC模块中的寄存器,
2.产生滴答时钟中断。寄存器寄存器名称功能RTCCONRTC控制寄存器用于控制BCD寄存器的读/写使能
BCDSECBCD秒寄存器用于存放秒的BCD值BCDMINBCD分钟寄存器用于存放月的BCD值BCDHOURBCD小时寄存器用于存放小时的BCD值BCDDAYBCD日寄存器用于存放日的BCD值BCDDATEBCD星期寄存器用于存放星期的BCD值BCDMONBCD月寄存器用于存放月的BCD值BCDYEARBCD年寄存器用于存放年的BCD值TICNTTICKTIME计数寄存器用于确定是否允许时间滴答中断和时间中断的计数值。RTC控制寄存器RTCCON地址:0x01D70040(小端) R/W(字节)初始值:0x0位位名称描述[3]CLKRSTRTC时钟计数复位:0=不复位
1=复位[2]CNTSELBCD计数器选择:0=组合的BCD计数器
1=保留(分离的BCD计数器)[1]CLKSELBCD计数器时钟选择0=XTAL1/215dividedclock1=保留(XTALclockonlyfortest)[0]RTCENRTC读写允许:
0=禁止
1=允许如果RTC读写允许,STOP电流将大大增大,为了减少STOP电流,当不存取RTC时,设置该位为0,虽然为0,但RTC时钟仍运行。1.读取并设置当前的时间读取当前时间访问RTC模块的寄存器,首先要设RTCCON的bit0为1。CPU通过读取RTC模块中寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON和BCDYEAR的值,得到当前的相应时间值。但是,在RTC模块中,由于多个寄存器在读,可能会产生1s的偏差。例如:当用户从BCDYEAR到BCDMIN读寄存器时,结果假定是1959年12月31日23时59分,当用户读BCDSEC寄存器并且结果是从1到59,这没问题,但如果结果是0秒,则年月日时分秒可能变为1960年1月1日0时0秒,因为存在1秒偏差。所以这时,若BCDSEC是0,用户应该从BCDYEAR向BCDSEC重新读取数据。voidRead_Rtc(void){
Uart_Printf(“youcanreadRTCValue");
rRTCCON=0x01;//R/Wenable,1/32768,Normal(merge),Noresetwhile(1){
if(rBCDYEAR==0x99) year=0x1999; else year=0x2000+rBCDYEAR; month=rBCDMON; day=rBCDDAY; weekday=rBCDDATE; hour=rBCDHOUR; min=rBCDMIN; sec=rBCDSEC;
if(sec!=0) break;}
rRTCCON=0x0;//R/Wdisable(forpowerconsumption)}rtc.h文件#defineTESTYEAR (0x02)#defineTESTMONTH (0x12)#defineTESTDAY (0x31)#defineTESTDATE(0x03)#defineTESTHOUR (0x23)#defineTESTMIN (0x59)#defineTESTSEC (0x59)#include"rtc.h“voidRtc_Init(void){
rRTCCON=0x01; //R/Wenable,1/32768,Normal(merge),Noreset
rBCDYEAR=TESTYEAR;
rBCDMON=TESTMONTH;
rBCDDAY=TESTDAY; //SUN:1MON:2TUE:3WED:4THU:5FRI:6SAT:7
rBCDDATE=TESTDATE;
rBCDHOUR=TESTHOUR;
rBCDMIN=TESTMIN;
rBCDSEC=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论