原创 R8C/M16C的串口(UART)通信例子

2011-2-25 14:03 5145 4 5 分类: MCU/ 嵌入式
来源:瑞萨单片机论坛

串口通信,尤其指UART通信,大约是使用最广泛的协议了。 
下面以M16C/6N4系列为例。 
该系列一共有3个UART设备,每个设备可以配置为不同的模式,如图: 

R8C/M16C的串口(UART)通信例子 - 瑞沙 - 瑞萨产品世界
 

我们以UART模式为例 
UART0初始化,配置串口的时钟,波特率等。 

prc0 = 1;                 // Write enable 
pclk1 = 1;                // Clock source for UART0 is f1SIO 
prc0 = 0;                 // Disable write 

pd6_2 = 0;                // RXD0 is input 
u0c0 = 0x10;              // LSB first 
                           // TXD0 pin is CMOS output 
                           // CTS/RTS function is disabled 
                            // No data present in the transmit register (transmission completed) 
                                   // f1SIO is selected (BRG count source select bit) 
u0mr = 0x05;              // UART mode transfer data 8 bits long 
                           // internel clock 
                       // 1 stop bit 
                     // no parity 
                     // parity disabled 
                      // TXD, RXD polarity is no reverse 
                  
u0brg = 0x67;      // 波特率配置为9600        

/* u0c1 register */ 
u0ere = 0;                // error signal output is disabled 

u0smr = 0x00; 
u0smr2 = 0x00; 
u0smr3 = 0x00; 
u0smr4 = 0x00; 

u0irs = 1;                // UART0 transmit interrupt cause (transmission completed)   
u0rrm = 1; 

te_u0c1 = 1;              // 使能发送 
re_u0c1 = 1;              // 使能接收 

以上配置串口0为UART模式,波特率9600, 8N1。 

发送过程: 
直接向发送缓冲寄存器里填入数据就可以发送了,不过在发送前要先判断发送标志位,以确保先前的数据是否发送完。 
由于我们只用了8个数据位,所以只需要向发送缓冲寄存器的低8位填入数据. 
while(!ti_u0c1); 
u0tbl = data;   // 向u0tb的低8位填入数据,发送。 
如果开了发送中断,需要在发送中断里清除某个标志位。不过我一般都不开发送中断的,影响效率。 

接收过程: 
以中断方式接收数据,中断后,直接从接收缓冲寄存器里读取数据。 
接收缓冲寄存器为16位,结构如下: 

R8C/M16C的串口(UART)通信例子 - 瑞沙 - 瑞萨产品世界
 

在接收中断里读取低8位数据之前,要先判断接收标志位,以确保先前的数据是否被读走。 
#pragma interrupt uart0_rx_irq() 
void uart0_rx_irq(void) 

unsigned char buf; 
while(!ri_u0c1); 
buf = u0rbl; 


M16C的串口还是很简单的,没有FIFO缓冲区,所以很好处理。 
如果大家对串口不太清楚的,可以看看芯片上的串口结构以及通信时序图。

文章评论1条评论)

登录后参与讨论

用户1664498 2015-8-4 19:53

谢谢楼主的讲解
相关推荐阅读
用户1407374 2011-03-15 21:40
嵌入式Linux下SRAM驱动程序的开发原理及应用
摘要: 嵌入式Linux是目前操作系统领域中的一个热点。其要点与难点是驱动程序的开发。本文简要论述了基于现代公司嵌入式Arm处理器芯片的嵌入式Linux的SRAM驱动程序的开发原理及流程。 关键词:嵌...
用户1407374 2011-03-15 21:39
嵌入式Linux网络驱动程序的开发及实现原理
0 引言 随着人们对开放源代码软件热情的日益增高,Linux作为一个功能强大而稳定的开源操作系统,越来越受到成千上万的计算机专家和爱好者的青睐。在嵌入式领域,通过对Linux进行小型化裁剪后,使其能够...
用户1407374 2011-03-07 09:42
R8C/1B学习板之uC/OS-II移植详解
来源:瑞萨单片机论坛都说在8051上都可以跑UCOS,那么在瑞萨R8C这种小资源的MCU上能否跑RTOS呢?R8C/1B的ROM为16KB,RAM为1KB。下面我们来尝试一下吧。 笔者曾经将uC/OS...
用户1407374 2011-02-25 14:33
R8C2K的LIN总线设置
来源:瑞萨单片机论坛仅写了底层驱动,简单的主机和从机的收发,供参考!主机:void LIN_Mater_Config(void){tstop_tracr = 1;    // 强制timerRA终止/...
用户1407374 2011-02-25 14:33
R8C\2K 2L系统时钟设置,WDT设置
来源:瑞萨单片机论坛系统时钟设置:使用内时钟40MHz/************************************************************************...
用户1407374 2011-02-25 14:32
R8C\Tiny DataFlash程序中 WDT的处理方法
来源:瑞萨单片机论坛R8C\Tiny 单片机的DataFlash处理起来比较繁琐,处理模式分为EW0模式和EW1模式,通常我们采用EW1模式。  在此模式中,DataFlash的一个块擦除时间比较长,...
我要评论
1
4
关闭 站长推荐上一条 /3 下一条