微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > R8/1B 学习板--IAR下的双串口通信(UART1 UART0)

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

时间:10-02 整理:3721RD 点击:

对于串口通信,如果选用7位的模式,大家千万要注意,这个7位模式是假的,也是8位的,
在接收数据的时候,一定要去了最高位,否则收的数据是不对,为了这个问题,我花2天时间
才明白!
下面的例子子,使用20M的外部时钟。

  1. void Initclk(void)
  2. {
  3.    unsigned char DetectTime;
  4.    DetectTime=100;
  5.    prcr=0x01;//关闭和时钟相关的保护寄存器,允许修改时钟。
  6.    cm16=0;
  7.    cm17=0;  //CM16, cm17组成振荡无分频模式.
  8.    cm06=0;  //总线时钟不分频。 f1
  9.    cm13=1;  //XIN-XOUT 引脚连接内部起振电路。
  10.    cm15=1;  //XIN-XOUT 引脚使用高驱动能力
  11.    cm05=0;  //开始振荡
  12.    asm("NOP\nNOP\nNOP\nNOP");
  13.    while(0 !=DetectTime)
  14.       {
  15.        if(ocd3==1) //如果主时钟振荡停止,哪么延时一定时间再检测.
  16.          {
  17.            asm("NOP\nNOP\nNOP\nNOP");
  18.            asm("NOP\nNOP\nNOP\nNOP");
  19.            asm("NOP\nNOP\nNOP\nNOP");  //延时处理,
  20.          }
  21.        DetectTime --;
  22.       }       //检测50次,
  23.    ocd2=0; //使用主时钟作为系统时钟
  24.    prcr=0;//打开保护寄存器

  25. }

复制代码


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

  1. void Init_uar1(void)
  2.     {
  3.       p3_7=1;
  4.       pd4_5=0;   //rxd输入
  5.       pd3_7=1;   //TXD输出
  6.      
  7.       re_u1c1=0;
  8.       te_u1c1=0;
  9.       
  10.       u1c0=0x08;   //速率计数时钟是F1
  11.       ucon=0x33;   //
  12.       u1mr=0x64; //7位数据 偶校验 1位停止位  //
  13.       u1brg=0x81;//采用F1 9600
  14.          
  15.       
  16.       te_u1c1=1;
  17.       re_u1c1=1;
  18.       s1ric=0x05;//串口1--5级中断
  19.       
  20.       p1_4=1;
  21.       pd1_4=0;
  22.       pd1_5=0;
  23.       u0mr=0x64;
  24.       u0brg=0x81;
  25.       u0c0&=0x08;
  26.       te_u0c1=1;
  27.       }

复制代码

上面初始化,串口1可以收发,串口0只发不收。
在中断里收发如下:

  1. #pragma  vector=20
  2. __interrupt  void Uart1_irq(void)  //Uart1接收中断
  3.   {
  4.     unsigned char Dtmp1;

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

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

  11.      
  12.   }

复制代码


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top