主题 : mini2440 uart 疑惑 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 55875
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-09-25
最后登录: 2018-02-08
楼主  发表于: 2013-05-13 16:20

 mini2440 uart 疑惑

code:
复制代码
  1. int serial_init(void)
  2. {
  3.     volatile struct mini2440_uart *uart = (volatile struct mini2440_uart *)MINI2440_UART0_BASE;
  4.     unsigned long reg = 0, pclk;
  5.     /* FIFO enable, Tx/Rx FIFO clear */
  6.     uart->ufcon = 0x07;
  7.     uart->umcon = 0x0;
  8.     
  9.     /* Normal,No parity,1 stop,8 bit */
  10.     uart->ulcon = 0x03;
  11.     /*
  12.      * tx=level,rx=edge,disable timeout int.,enable rx error int.,
  13.      * normal,interrupt or polling
  14.      */
  15.     uart->ucon = 0x0245;
  16.     pclk = get_pclk();
  17.     /* value is calculated so : (int)(PCLK/(16*baudrate)) -1 */
  18.     reg = (int)(pclk / (16*BAUDRATE)) - 1;
  19.     uart->ubrdiv = reg;
  20.     pll_delay(100);
  21.     PUTC('H');
  22.     PUTC('e');
  23.     PUTC('l');
  24.     PUTC('l');
  25.     PUTC('o');
  26.     PUTC('\r');
  27.     PUTC('\n');
  28.     PUTS("serial init ok\r\n");
  29.     PUTC('W');
  30.     PUTC('o');
  31.     PUTC('r');
  32.     PUTC('l');
  33.     PUTC('d');
  34.     PUTC('\r');
  35.     PUTC('\n');
  36.     return (0);
  37. }
  38. void PUTC(char c)
  39. {
  40.     volatile struct mini2440_uart *uart = (volatile struct mini2440_uart *)MINI2440_UART0_BASE;
  41.     while (uart->ufstat & 0x400)
  42.         ;
  43.     uart->utxh = c;
  44. }
  45. void PUTS(const char *s)
  46. {
  47.     while (*s) {
  48.         PUTC(*s);
  49.         s++;
  50.     }    
  51. }


串口输出:
Hello
s 䁃�\ ��P 埃�� ��X 堃� ��` 傃�World

上面的PUTS函数看起来没什么问题,为什么却无法正确输出呢?
级别: 新手上路
UID: 55875
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-09-25
最后登录: 2018-02-08
1楼  发表于: 2013-05-14 17:31
我发现这是程序无法正确访问 字符串常量 所致。

复制代码
  1. 2f4:    e59fc0f8     ldr    ip, [pc, #248]    ; 3f4 <serial_init+0x214>
  2. 2f8:    e5c23020     strb    r3, [r2, #32]
  3. 2fc:    e3a01073     mov    r1, #115    ; 0x73
  4. 300:    e5923018     ldr    r3, [r2, #24]
  5. 304:    e3130b01     tst    r3, #1024    ; 0x400
  6. 308:    1afffffc     bne    300 <serial_init+0x120>
  7. 30c:    e5c21020     strb    r1, [r2, #32]
  8. 310:    e5fc1001     ldrb    r1, [ip, #1]!
  9. 314:    e3510000     cmp    r1, #0
  10. 318:    1afffff8     bne    300 <serial_init+0x120>
  11. 3f4:    00000444     andeq    r0, r0, r4, asr #8
  12. 00000444 <.rodata>:
  13. 444:    69726573     ldmdbvs    r2!, {r0, r1, r4, r5, r6, r8, sl, sp, lr}^
  14. 448:    69206c61     stmdbvs    r0!, {r0, r5, r6, sl, fp, sp, lr}
  15. 44c:    2074696e     rsbscs    r6, r4, lr, ror #18
  16. 450:    0a0d6b6f     beq    35b214 <PUTS+0x35ae00>
  17. 454:    00000000     andeq    r0, r0, r0


上面是dump elf 文件得出的。为什么呢?
级别: 新手上路
UID: 55875
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-09-25
最后登录: 2018-02-08
2楼  发表于: 2013-05-15 11:06
原来是链接地址搞错了!