UART的调试
2015-09-20 10:21 1784717631 阅读(410) 评论(0) 编辑 收藏 举报串口是很久之前做的了,映像最深的就是子函数的调用导致完好的程序罢工。郁闷了一个下午。后来不得不把所有的子函数拆掉,直接堆在了主函数里面,然后立竿见影,几分钟搞定。不少人遇到这个问题,后来曹老师出马,花了一个中午终于找出问题了。
问题在于在Makefile文件中,在生成目标文件的时候,把汇编代码的.O 文件 放在了C部分的.O文件之前,结果导致了链接时出现了错误。解决办法有两个:
1、最简单的当然就是把两个文件位置对调 led.bin: serial.o serials.o
2、第一种方法显然治标不治本,比较专业的做法是写一个连接器脚本,连接器脚本代码如下:
SECTIONS
{
. = 0x20000000;
.text : {
serials.o //把 汇编代码的.o 文件先链接
* (.text)
}
.bss : {
* (.bss)
}
.data : {
* (.data)
}
}
/*************************************************************************************************************************************/
/*设置LED灯*/
#define GPJ2CON (*(volatile unsigned int*)0xE0200280)
#define GPJ2PUD (*(volatile unsigned int*)0xE0200288)
#define GPJ2DAT (*(volatile unsigned int*)0xE0200284)
/*配置COM3口*/
#define GPA1CON (*(volatile unsigned int*)0xE0200020)
/*配置ULCON3和UCON3*/
#define ULCON3 (*(volatile unsigned int*)0xE2900C00)
#define UCON3 (*(volatile unsigned int*)0xE2900C04)
/*用来使能FIFO*/
#define UFCON3 (*(volatile unsigned int*)0xE2900C08)
/*设置波特率*/
#define UBRDIV3 (*(volatile unsigned int*)0xE2900C28)
#define UDIVSLOT3 (*(volatile unsigned int*)0xE2900C2C)
//设置状态寄存器
#define UTRSTAT3 (*(volatile unsigned int*)0xE2900C10)
//设置发送接收寄存器
#define UTXH3 (*(volatile unsigned int*)0xE2900C20)
#define URXH3 (*(volatile unsigned int*)0xE2900C24)
首先是串口的初始化,使用的UART0
void init_serial(void)
{
//设置GPIO为串口模式
GPA1CON &= 0x00ff;
GPA1CON |= 0x2200;
//设置数据格式和相关配置
ULCON3 = 0x3;
UCON3 = 0x5;
UFCON3 = 0x1;
//设置波特率
UBRDIV3 = 35;
UDIVSLOT3 = 0x1;
}
void main(void)
{
//设置LED灯为上拉熄灭模式
GPJ2CON &=0xFFFF0000;
GPJ2CON |=0x1111;
GPJ2PUD &=0xFFFFFF00;
GPJ2PUD |=0xAA;
GPJ2DAT=0xf;
init_serial();
//GPJ2DAT=0x0;
/*
//设置GPIO为串口模式
GPA1CON &= 0x00ff;
GPA1CON |= 0x2200;
//设置数据格式和相关配置
ULCON3 = 0x3;
UCON3 = 0x5;
UFCON3 = 0x1;
//设置波特率
UBRDIV3 = 35;
UDIVSLOT3 = 0x1;
*/
//init_serial();
//delay(void);
char temp ;
while(1)
{
//put_c(temp);
while( (UTRSTAT3 & 0x1)==0 );
temp = URXH3;
UTXH3 = temp;
if(temp == '1')
{
GPJ2DAT = GPJ2DAT ^1;
}
if(temp == '2')
{
GPJ2DAT = GPJ2DAT ^2;
}
if(temp == '3')
{
GPJ2DAT = GPJ2DAT ^4;
}
if(temp == '4')
{
GPJ2DAT = GPJ2DAT ^8;
}
}
}