主题 : GCC编译串口裸机程序出现乱码 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 74964
精华: 0
发帖: 29
金钱: 145 两
威望: 29 点
综合积分: 58 分
注册时间: 2012-07-31
最后登录: 2017-09-13
楼主  发表于: 2013-05-12 18:00

 GCC编译串口裸机程序出现乱码

我用ARM-LINUX-GCC编译串口的裸机程序,但用SUPERBOOT下载到板子上之后输出乱码,不知道哪里有问题,请指教!


##### FriendlyARM Superboot for 6410 #####
[f] Format the nand flash
[p] Download superboot
[v] Download uboot.bin
[k] Download Linux/Android kernel
[y] Download root yaffs2 image
Download root ubifs image
[a] Download Absolute User Application
[n] Download Nboot.nb0 for WinCE
[l] Download WinCE bootlogo
[w] Download WinCE NK.bin
Boot the system
[s] Set the boot parameter of Linux
[d] Download and Run an Absolute User Application
Version: 120810, RAM 2048 MiB, NAND(MLC2) 2GiB
Please enter your Selection:d
Download Absolute User Application...
Take passed addr 0x50000000
Download address 0x50000000
Now, Waiting for DNW to transmit data
Download Done. Download Address: 0x50000000, Download Filesize:0x2f4
DNW download succeeded
Run Absolute User Application...y榾



clock.c
复制代码
  1. #include "s3c6410_addr.h"
  2. #define ARM_RATIO    0   /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    */
  3. #define HCLKX2_RATIO 1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 266MHz */
  4. #define HCLK_RATIO   1   /* HCLK = HCLKX2 / (HCLK_RATIO + 1)   = 133MHz       */
  5. #define PCLK_RATIO   3   /* PCLK = HCLKX2 / (PCLK_RATIO + 1) = 66.5MHz    */
  6. #define MPLL_RATIO   0   /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     */
  7. #define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
  8. #define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
  9. /* DOUTAPLL=532MHz, MOUTMPLL=532MHz */
  10. /* ARMCLK = 532MHz, HCLK = 133MHz, PCLK = 66.5MHZ */
  11. void clock_init(void)
  12. {
  13.     rAPLL_LOCK = 0xffff;
  14.     rMPLL_LOCK = 0xffff;
  15.     rEPLL_LOCK = 0xffff;
  16.     /* set async mode 当CPU时钟 != HCLK时,要设为异步模式 */
  17.     rOTHERS &= ~0xc0;
  18.     while ((rOTHERS & 0xf00) != 0);
  19.     rCLK_DIV0 = (ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12);
  20.     rAPLL_CON = APLL_CON_VAL;  /* 532MHz */
  21.     rMPLL_CON = MPLL_CON_VAL;  /* 266MHz */
  22.     rCLK_SRC |= 3;
  23.     //rCLK_SRC = ((1<<7)|(3));
  24. }


uart.c
复制代码
  1. #include "s3c6410_addr.h"
  2. static void Delay(void)
  3. {
  4.     volatile int i;
  5.     for(i=1000;i;i--)
  6.     {
  7.         ;    
  8.     }
  9. }
  10. void Uart_Init(void)
  11. {
  12.     rGPACON=(rGPACON & ~(0xff))|(0x22<<0);
  13.     rGPAPUD=(rGPAPUD & ~(0xf))|(0x1<<0);
  14.     rULCON0 = 0x03;//8n1
  15.     rUCON0 = 0x805;//0x5|(1<<9)|(1<<8);
  16.     rUFCON0 = 1;
  17.     rUMCON0 = 0;
  18.     rUBRDIV0   = 35;
  19.     rUDIVSLOT0 = 0x1;
  20. }
  21. void Uart_SendByte(int data)
  22. {
  23.     while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
  24.     Delay();
  25.     //WrUTXH0(data);
  26.     rUTXH0=(unsigned char)data;
  27. }
  28. void Uart_SendString(char *pt)
  29. {
  30.     while(*pt)
  31.         Uart_SendByte(*pt++);
  32. }


main.c
复制代码
  1. #include "uart.h"
  2. static void LedDelay(void)
  3. {
  4.         volatile unsigned int k;
  5.         for(k = 0; k < 20000000; k++);
  6. }
  7. int _main(void)
  8. {
  9.     Uart_Init();
  10.     //Port_Init();
  11.     Uart_SendByte('a');
  12.     Uart_SendString("\r\nHello, Mini6410\r\n");
  13. while(1)
  14.     {
  15.         //Led_Display(0x9); // 1001
  16.         LedDelay();
  17.         //Led_Display(0x6); // 0110
  18.         LedDelay();
  19.     }
  20.     return 0;
  21. }


start.S
复制代码
  1. .globl _start
  2. _start:
  3. /* 硬件相关的设置 */
  4.     /* Peri port setup */
  5.     ldr r0, =0x70000000
  6.     orr r0, r0, #0x13
  7.     mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)
  8. /* 关看门狗 */
  9. /* 往WTCON(0x7E004000)写0 */
  10.     ldr r0, =0x7E004000
  11.     mov r1, #0
  12.     str r1, [r0]
  13.     /* 设置栈 */
  14.     ldr sp, =8*1024
  15.     /* 设置时钟 */
  16.     bl clock_init
  17.     b _main
  18. halt:
  19.     b halt    



makefile
复制代码
  1. uart.bin: start.o main.o uart.o clock.o
  2.     arm-linux-ld -Ttext 0 -o uart.elf $^
  3.     arm-linux-objcopy -O binary uart.elf uart.bin
  4.     arm-linux-objdump -D uart.elf > uart.dis
  5.     sudo mount -t vboxsf share /mnt   -o iocharset=utf8
  6.     sudo cp -r ../6410 /mnt/code/
  7. %.o : %.S
  8.     arm-linux-gcc -o $@ $< -c
  9. %.o : %.c
  10.     arm-linux-gcc -o $@ $< -c
  11. clean:
  12.     rm *.o uart.elf uart.bin uart.dis



makefile  -Ttext 0里面,我试过改成-Ttext 0x50000000。还是一样,串口有乱码
级别: 新手上路
UID: 74964
精华: 0
发帖: 29
金钱: 145 两
威望: 29 点
综合积分: 58 分
注册时间: 2012-07-31
最后登录: 2017-09-13
1楼  发表于: 2013-05-15 21:47
已经找到问题,把start.s里设置栈的那句ldr sp, =8*1024注释掉就可以用