//manymany-2440裸机篇之7 异步串口通信
//目的:掌握异步串口通信的使用,工作原理及程序编程
//功能:实现查询发式串口的收发功能,接收来自串口的字符,
// 并将接收到的字符发送到超级终端
//接口:串口0
//***************************************************
//Designed by: http://blog.ednchina.com/Manymany/
//2009-06-05
//***************************************************
/*
UART可以进行以下参数设置:
可编程的波特率,红外收/发模式,1或2个停止位,
5,6,7,8位数据宽度和奇偶位校验。
UART包括的寄存器:串口线性控制寄存器(ULCONn),
串口控制寄存器(UCONn),串口收/发状态寄存器(UTRSTATn),
串口波特率分频寄存器(UBRDIVn),串口发送缓存寄存器(UTXHn),
串口接收缓存寄存器(URXHn)。
UBRDIn的置可以按照下式确定:
UBRDIn=(int)(PCLK/(bps*16))-1
除数的范围为1到(16**2-1)。
例如,如果波特率为115200bps且PCLK或UCLK为50MHz,则UBRDIn为:
UBRDIn =(int)(50000000/(115200×16))-1
=(int)(27.1)-1
=26
*/
/*
编程步骤:
1,UART的初始化:包括串口的选择,IO口的初始化,UART的UFCONn,
UMCONn,ULCONn,UCONn及波特率的初始化
2,UART的发送数据:要发送的数据,首先被写入FIFO,然后拷贝到发送
移位寄存器,接着它从数据输出端(TxDn)依次被移位输出。
3UART的接收数据:被接收的数据也同样从数据接口RxDn移位
输入到移位寄存器,然后拷贝到FIFO中
4,UART的发送数据。
*/
#include "2440lib.h"
#include "2440addr.h"
static int UartNum="0"; //串口选择的标志位,可以省略,只是方便多个串口选择
//****************************************************************
//对Uart进行初始化,以所需要的波特率为输入参数
void myUart_Init(int whichuart, int baud)
{
if(whichuart==0) //判断是否选择串口0,假如选择串口1,
//则应该初始化串口1的寄 存器
{
UartNum="0"; //串口选择的标志位
rGPHCON = rGPHCON & (~(0xffff)) ;
rGPHCON = rGPHCON | (0xaaa0) ;
rGPHUP = 0x0; // 使用内部上拉电阻。
rUFCON0=0x00; //不使用FIFO
rUMCON0=0x00; //不使用自动流控制
rULCON0=0x03; //不采用红外线传输模式,无奇偶校验位,
//1个停止位,8个数据位
rUCON0=0x245; /*发送中断为电平方式,接收中断为边沿方式,
禁止超时中断,允许产生错误状态中断,禁止回送模式,
禁止中止 //信号,传输模式为中断请求模式,
接收模式也为中断请求模式。*/
rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );
Delay(10);
}
}
/*******************************************************************/
void myUart_SendByte(char ch)
{
if (UartNum ==0) //判断是否选择串口0,在这里也可以不用这句,
//只是方便多个串口选择时用
{
if(ch=='\n') //判断是否是换行字符,如果是换行字符,发送一个回车符
{
while(!(rUTRSTAT0 & 0x2)); //等待,直到发送缓冲区为空
WrUTXH0('\r'); //发送回车符
}
while(!(rUTRSTAT0 & 0x2)); //等待,直到发送缓冲区为空
Delay(100);
WrUTXH0(ch); //串口0发送字符
}
}
/********************************************************************/
void Uart_Send (char *str)
{
myUart_Init(0,115200);
while (*str)
myUart_SendByte(*str++);
}
/********************************************************************/
char myUart_ReceiveByte(void) //接收字符函数
{
if(UartNum==0) //选择串口0
{
while(!(rUTRSTAT0 & 0x1)); //检查串口状态寄存器0,是否有数据到来,
//启动接收过程
return RdURXH0(); //URXH0串口接收缓存寄存器0
}
return 0;
}
/********************************************************************/
void Uart_receive(char *string) //接收函数
{
char *string2 = string;
char c;
myUart_Init(0,115200); //串口的选择与波特率的选择
while((c = myUart_ReceiveByte())!='\r') //循环判断接收字符函数返回的
//字符是不是换行字符
{
if(c=='\b')
{
if( (int)string2 < (int)string )
{
Uart_Printf("\b \b");
string--;
}
}
else
{
*string++ = c;
myUart_SendByte(c);
}
}
*string='\0'; //接收完毕后执行空格
myUart_SendByte('\n'); //如果接收完毕后,补充一个回车
}
/********************************************************************/
int xmain(void)
{
char *str;
char *string;
ChangeClockDivider(3,1); //1:3:6
ChangeMPllValue(127,2,1); //405MHZ
Port_Init();
Isr_Init();
Uart_Send("Please Input a string:\n"); //超级终端提示输入一串字符
Uart_receive(string); //2440接收字符
*str=*string; //发送的跟接收的字符相等
Delay(500);
Uart_Send(str); //2440发送字符显示到超级终端上
while(1);
}
/*在这里是整个工程文件的压缩包由于这段时间manymany有个项目要立项,所以更新来不及,请大家不要见怪。还是老样子,请大家多多关注manymany。*/
用户1609521 2009-12-25 08:32
用户1354166 2009-7-5 18:02
用户209461 2009-6-26 10:48
用户1406226 2009-6-9 00:14
用户1406226 2009-6-9 00:12