新闻  |   论坛  |   博客  |   在线研讨会
R8/1B 学习板--IAR下的双串口通信(UART1 UART0)
renesasrulz | 2009-12-26 12:18:23    阅读:4745   发布文章

原文:R8/1B 学习板--IAR下的双串口通信(UART1 UART0)

对于串口通信,如果选用7位的模式,大家千万要注意,这个7位模式是假的,也是8位的,
在接收数据的时候,一定要去了最高位,否则收的数据是不对,为了这个问题,我花2天时间
才明白!
下面的例子子,使用20M的外部时钟。
void Initclk(void)
{
   unsigned char DetectTime;
   DetectTime=100;
   prcr=0x01;//关闭和时钟相关的保护寄存器,允许修改时钟。
   cm16=0;
   cm17=0;  //CM16, cm17组成振荡无分频模式.
   cm06=0;  //总线时钟不分频。 f1
   cm13=1;  //XIN-XOUT 引脚连接内部起振电路。
   cm15=1;  //XIN-XOUT 引脚使用高驱动能力
   cm05=0;  //开始振荡
   asm("NOP\nNOP\nNOP\nNOP");
   while(0 !=DetectTime)
      {
       if(ocd3==1) //如果主时钟振荡停止,哪么延时一定时间再检测.
         {
           asm("NOP\nNOP\nNOP\nNOP");
           asm("NOP\nNOP\nNOP\nNOP");
           asm("NOP\nNOP\nNOP\nNOP");  //延时处理,
         }
       DetectTime --;
      }       //检测50次,
   ocd2=0; //使用主时钟作为系统时钟
   prcr=0;//打开保护寄存器
 
}

串口能通信初始化:
要注意的是,串口1使用的RXD1 TXD1,不是P37、P45,所以设置的时候相应的寄存器要注意。ucon=0x33;   一定要这样!
串口1与串口0的格式是:7位数据,1位停止位,偶校验
串口1中断接收,发送不启用中断。


void Init_uar1(void)
    {
      p3_7=1;
      pd4_5=0;   //rxd输入
      pd3_7=1;   //TXD输出
    
      re_u1c1=0;
      te_u1c1=0;
     
      u1c0=0x08;   //速率计数时钟是F1
      ucon=0x33;   //
      u1mr=0x64; //7位数据 偶校验 1位停止位  //
      u1brg=0x81;//采用F1 9600
        
     
      te_u1c1=1;
      re_u1c1=1;
      s1ric=0x05;//串口1--5级中断
     
      p1_4=1;
      pd1_4=0;
      pd1_5=0;
      u0mr=0x64;
      u0brg=0x81;
      u0c0&=0x08;
      te_u0c1=1;
      }
上面初始化,串口1可以收发,串口0只发不收。
在中断里收发如下:
#pragma  vector=20
__interrupt  void Uart1_irq(void)  //Uart1接收中断
  {
    unsigned char Dtmp1;

     Dtmp1=(unsigned char)u1rb;
     Dtmp1&=0x7f;//这个用7位接收的,一定要把最高位置零。
      while(ti_u0c1==0);
       u0tbl=Dtmp1;     //把收到的数据从串口0发送回去

      while(ti_u1c1==0);
      u1tbl=Dtmp1;     //把收到的数据从串口1发送回去

     
  }

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
a455352453  2009-12-30 21:26:11 

我们现在还没学,看不懂

来自瑞萨单片机论坛(www.renesas-mcu.com)的经典文章。仅供大家参考,版权归作者所有。
推荐文章
最近访客