原创 manymany-2440裸机篇之7 异步串口通信

2009-6-8 00:35 5227 4 9 分类: MCU/ 嵌入式


//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)依次被移位输出。
   3UART的接收数据:被接收的数据也同样从数据接口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); 
}


/*在这里是整个工程文件的压缩包rariconicon由于这段时间manymany有个项目要立项,所以更新来不及,请大家不要见怪。icon还是老样子,请大家多多关注manymany。icon*/

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户1609521 2009-12-25 08:32

博主,有QQ吗?想请教几个问题,希望不吝赐教。我的QQ号,1134304390,留言的方式太慢了。

用户1354166 2009-7-5 18:02

rUFCON0 = 0x00; //Disable FIFO rUMCON0 = 0x00; //Disable auto flow_control rULCON0 = 0x00003; //normal mode,no chechk,8_bit,1_stop_bit rUCON0 = 0x00241; //UART_CLK = FCLK/20 = 128000000hz, for (i=0;i<10000;i++) ; rGPHCON |= 0x000000A0; rGPHUP = 0x0000; rUBRDIV0 = 103; //bond = 115200bps for (i=0;i<10000;i++) ; rUCON0 |= 0x00004; //Tx_EN 我的好像有问题啊,帮忙看看吧

用户209461 2009-6-26 10:48

博主, 请建个QQ群好吗? 这样大家好交流些,期待中。。。。。

用户1406226 2009-6-9 00:14

希望看到更多的ARM裸机,博主加油,也谢谢博主

用户1406226 2009-6-9 00:12

我顶,博主加油
相关推荐阅读
用户188963 2009-08-28 16:56
我来猜09年全国电赛小车的题目
我来猜09年全国电赛小车的题目 小车+无线收发模块+2米卷尺+光电传感器+继电器 1.无线模块用来设置小车的行驶轨迹,圆的,方的,任意轨迹的。2.2米卷尺和光电传感器:小车行驶速度,距离。3.壁障4....
用户188963 2009-07-20 09:39
manymany-2440裸机篇之8 ADC模数转换
//manymany-2440裸机篇之8 ADC模数转换//***************************************************//为了对温度,压力,流量,速度,位移...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之开篇
                              manymany-2440裸机篇之开篇          manymany前段时间买了块广州友善之臂的mini2440开发板,现在想学习AR...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之1 流水灯与蜂鸣器
//***************************************************//manymany-2440裸机篇之流水灯与蜂鸣器//*******************...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之2 下载与调试
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />玩裸机的时候,肯定要用到下载与调试,...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之3 按键点亮LED
//***************************************************//manymany-2440裸机篇之3 按键点亮LED//*****************...
EE直播间
更多
我要评论
5
4
关闭 站长推荐上一条 /3 下一条