R8/1B 学习板--IAR下的双串口通信(UART1 UART0)
时间:10-02
整理:3721RD
点击:
对于串口通信,如果选用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;
- }
在中断里收发如下:
- #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发送回去
-
- }