代码改变世界

UART的调试

2015-09-20 10:21  1784717631  阅读(409)  评论(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;
}
}
}