实验题目:设计一个串口初始化程序 Uart_Init_Ext(int pclk,int baud,int parity,int stop, int len),要求在Uart_driver.c 和 Uart_driver.h中实现驱动,然后在TARGET.c的Target—_Init(void)中调用
PC端用超级终端验证结果。串口寄存器参考实验指导手册
baud 为波特率
parity 为奇偶校验
0 = 无奇偶
4= 奇校验
5 = 偶校验
6 = 奇偶位始终为1
7 = 奇偶位始终为0
stop 为停止位
0 = 1个停止位
1 = 2个停止位
len 为数据位长度
0 = 长度为5
1 = 长度为6
2 = 长度为7
3 = 长度为8
Uart_Init_Ext的编码如下:
void Uart_Init_Ext(int pclk,int baud,int parity,int stop, int len)
{
int i;
int p,s,l;
if(pclk == 0)
pclk = PCLK;
if(parity==0) p=0x0;
else if(parity==4) p=0x20;
else if(parity==5) p=0x28;
else if(parity==6) p=0x30;
else if(parity==7) p=0x38;
if(stop==0) s=0x0;
else if(stop==1) s=0x4;
if(len==0) l=0x0;
else if(len==1) l=0x1;
else if(len==2) l=0x2;
else if(len==3) l=0x3;
//rULCON0 = parity*8+stop*4+len;
rULCON0 =p+s+l;
rUCON0 = 0x245;
for(i=0;i<100;i++);
}
Target.c中的Uart_Init_Ext配置如下:
void Target_Init(void)
{
MMU_Init();
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz
Port_Init();
Isr_Init();
Uart_Init(0,4800);
Uart_Init_Ext(0,115200,0,1,1);
//此处设置的是波特率为115200,无奇偶校验,两个停止位,数据长度为6
Uart_Select(0);
}
对应上面的设置,超级终端进行了组设置:
- 超级终端配置配置如下: 波特率为115200,无奇偶校验,两个停止位
Uart_Init_Ext(0,115200,0,1,1);
- 超级终端配置配置如下: 波特率为115200,奇校验,两个停止位
Uart_Init_Ext(0,115200,4,1,1);
实现指定参数的UART通信效果截图如下:
问题以及解决:
在本次实验中,我设计一个串口初始化程序 Uart_Init_Ext(int pclk,int baud,int parity,int stop, int len)放在Uart_driver.c 文件里面,并在 Uart_driver.h中设置了函数原形,然后在TARGET.c的Target—_Init(void)中实现了调用,但发现,运行程序的时候老是在AXD中报错,后来发现超级终端的设置要和本实验中Uart_Init_Ext函数中设置的参数要保持一致才能通信