Chinaunix

标题: at91sam9261 inituart debug problem [打印本页]

作者: longxinhui    时间: 2009-09-25 15:55
标题: at91sam9261 inituart debug problem
At91sam9261 inituart 问题:
在调试At91sam9261 UART时遇到把初始化程序烧录到板子后,打开keimit显示RomBOOT,reset之后也是显示RomBOOT,贴出inituart的代码:

@uart
    ldr   r1,=0xfffff404
    ldr   r2,=(1<<9)|(1<<10)
    str   r2,[r1]

@peripheral a
    ldr   r1,=0xfffff470
    ldr   r2,=(1<<9)|(1<<10)
    str   r2,[r1]

@interrupt disable
    ldr   r1,=0xfffff20c
    mvn   r2,#0
    str   r2,[r1]

@Debug Unit Control Register
    ldr   r1,=0xfffff200
    ldr   r2,=0x15c
    str   r2,[r1]

@Baud rate
    ldr   r1,=0xfffff220
    ldr   r2,=55
    str   r2,[r1]

    ldr   r1,=0xfffff204
    mov   r2,#0x800
    str   r2,[r1]

L3:
    ldr   r1,=0xfffff214
    ldr   r0,[r1]
    tst   r0,#0x2
    beq   L3

L4:
ldr   r1,=0xffff21c
mov   r2,#97
str   r2,[r1]
b   L4
问代码逻辑上是不是错了。
作者: fleyahjj    时间: 2009-09-25 16:09
L3:
    ldr   r1,=0xfffff214
    ldr   r0,[r1]
    tst   r0,#0x2
    beq   L3

L4:
ldr   r1,=0xffff21c
mov   r2,#97
str   r2,[r1]
b   L4


你是不是想循环打引‘a’啊?
这个逻辑好像有点问题,你改成下面的代码看看可行?
L3:
    ldr   r1,=0xfffff214
    ldr   r0,[r1]
    tst   r0,#0x2
    beq   L3

ldr   r1,=0xffff21c
mov   r2,#97
str   r2,[r1]
b   L3

作者: fleyahjj    时间: 2009-09-25 16:17
@Baud rate
    ldr   r1,=0xfffff220
    ldr   r2,=55
    str   r2,[r1]


你的Baud rate是怎么计算得到55的? 时钟MCK初始化之后是多少?
作者: conke    时间: 2009-09-25 16:56
标题: 回复 #1 longxinhui 的帖子
不错,但有几个地方需要改进

@uart
    ldr   r1,=0xfffff404
    ldr   r2,=(1<<9)|(1<<10)
    str   r2,[r1]

@peripheral a
    ldr   r1,=0xfffff470
    ldr   r2,=(1<<9)|(1<<10)
    str   r2,[r1]


1、注释好像写反了——先是配置成non-PIO模式,然后选择Peripheral A,即串口DBGU

2、少用magic number,可改用宏

3、ldr/str同组register时可用[base, #offset]寻址方式,而不是多次使用ldr=伪指令:
    ldr   r1,=0xfffff404
    ldr   r1,=0xfffff470

4、尽量少用ldr=伪指令,“ldr   r2,=(1<<9)|(1<<10)”或改成“mov r2, #0x600”

5、r2没变动,无需重复赋值

综上,代码可改进如下:
#define PBASE_PIOA  0xFFFFF400
#define PBASE_PDR   0x04
#define PBASE_ASR   0x70

@ PIO for DBGU
ldr  r0, =PBASE_PIOA
mov  r1, #0x600
str  r1, [r0, #PIO_PDR]
str  r1, [r0, #PIO_ASR]
作者: conke    时间: 2009-09-25 16:58
后面的代码有类似的问题,外加fleyahjj的建议,一并改进后再贴出来看看
作者: longxinhui    时间: 2009-09-25 17:05
按楼主的代码改了,还是那种现象,我加了点led灯调试程序,一直执行到了Baud rate,Baudrate要是没设对,也应该会打印出信息即使乱码,reset之后不应该只是RomBoot.
Led灯能亮,但是打印不出信息
@Baud rate
    ldr   r1,=0xfffff220
    ldr   r2,=55
    str   r2,[r1]

    ldr   r1,=0xfffff204
    mov   r2,#0x800
    str   r2,[r1]

@LED
    mov   r1, #0x13
    mov   r2, #0x1
    orr   r1, r2, lsl #7
    msr   cpsr, r1
    ldr   r1,=0xfffff400
    mov   r1,#0x1
    mov   r2,r1,lsl #14
    mov   r3,r1,lsl #23
    orr   r2,r3
    str   r2,[r1]
    ldr   r1,=0xfffff410
    str   r2,[r1]
    ldr   r1,=0xfffff434
    str   r2,[r1]
    mov   r2,#0x1
    mov   r2,r2,lsl #15
    ldr   r1,=0xfffffd40
    str   r2,[r1]
L3:
    ldr   r1,=0xfffff214
    ldr   r0,[r1]
    tst   r0,#0x2
    beq   L3  
    ldr   r1,=0xffff21c
    mov   r2,#97
    str   r2,[r1]
    b   L3
作者: longxinhui    时间: 2009-09-25 17:19
我找到问题之一了,把led点灯程序移到beq  L3之后灯不亮说明一直没准备好发送数据
作者: whamse    时间: 2009-09-25 17:32
标题: 关于PIO control选择问题
问:
enable PIO to control pin ,disables peripheral control of the pin(LED是这种方法)
disable PIO to contro pin, enable peripheral control of the pin(串口用这种方法)

LED和串口都是外设 他们能选下面那种方法行吗?
什么时候选PIO to control 什么时候选peripheral control ?
作者: voidjackjiang    时间: 2009-09-25 17:32
还遇见一个问题,就是汇编源文件如果使用了宏,当文件以小s做为后缀时,编译会报如下错误:
internal_relocation (type: OFFSET_IMM) not fixed up
而以大S做为文件后缀,编译则不会报错。
作者: voidjackjiang    时间: 2009-09-25 17:43
标题: 回复 #8 whamse 的帖子
我的理解是这样的,虽然led和uart都是外设,但是当我们操作led时,向pio端口写数据是我们编写的汇编程序直接去写的,而当该pio端口作为uart的数据接口使用时,数据实际是由DBGU发给pio端口的,此时pio只是被动接受者。所以我总结的规律如下:如果pio需要直接编程控制的,则应该设置其为enable PIO,其余情况设置为disable。
作者: conke    时间: 2009-09-25 17:53
原帖由 whamse 于 2009-9-25 17:32 发表
问:
enable PIO to control pin ,disables peripheral control of the pin(LED是这种方法)
disable PIO to contro pin, enable peripheral control of the pin(串口用这种方法)

LED和串口都是外设 他们 ...





典型的情况,GPIO可配置成两大类功能:
1、普通IN/OUT引脚,可配置成为普通in或out引脚
2、特定设备,分配给特定设备的引脚,如UART、IRQ引脚等


你所说的

enable PIO to control pin ,disables peripheral control of the pin
disable PIO to contro pin, enable peripheral control of the pin

就是ATMEL GPIO中的第一次(第一层)配置,即PIO引脚还是特定设备,而且现在还没决定具体是什么设备。



具体怎么配置取决于你最终的用途,即上图中第二层的选择。
作者: conke    时间: 2009-09-25 18:18
看来有初学者混淆了AT91中两个基本概念:PA/PB与Peripheral A/Peripheral B
PA/PB:即PIO A,AT91SAM9261中有三组PIO:A/B/C。
Peripheral A/B:AT91中将某些设备统称为Peripheral,注意,PIO等章节中谈到Peripheral时,PIO本身不在Peripheral之列!即除PIO之外的特定设备,如UART/Clock/IRQ等。(这也是AT91系列文档的一个不足之处)
作者: conke    时间: 2009-09-25 18:22
原帖由 voidjackjiang 于 2009-9-25 17:32 发表
还遇见一个问题,就是汇编源文件如果使用了宏,当文件以小s做为后缀时,编译会报如下错误:
internal_relocation (type: OFFSET_IMM) not fixed up
而以大S做为文件后缀,编译则不会报错。


GNU Toolchain支持.S(大S)中使用C预编译语法,包括#define/#include等,但须用gcc编译,否则可使直接使用as编译
作者: longxinhui    时间: 2009-09-25 19:09
#include"atmel.h"

.global GTopHalfEntry
.global Hang

GTopHalfEntry:
        ldr   pc,vect_reset
    ldr   pc, vect_undef
    ldr   pc, vect_swi
    ldr   pc, vect_iabort
    ldr   pc, vect_dabort
    .word 512
    ldr   pc, vect_irq
    ldr   pc, vect_fiq

vect_reset:
    .word handle_reset
vect_undef:
    .word handle_undef
vect_swi:
    .word handle_swi
vect_iabort:
    .word handle_iabort
vect_dabort:
    .word handle_dabort
vect_irq:
    .word handle_irq
vect_fiq:
    .word handle_fiq

handle_fiq:
handle_irq:
handle_dabort:
handle_iabort:
handle_swi:
handle_undef:
handle_reset:
    msr   cpsr, #((ARM_MODE_SVC) | (ARM_INT_MASK))

@LED
    ldr   r0,=GPIOA_BASE
        ldr   r1, =(1<<14)|(1<<23)
    str   r1,[r0]
    str   r1,[r0,#PIO_OER]
    str   r1,[r0,#PIO_CODR]
    mov   r1,#(1<<15)
    ldr   r0,=WDT
    str   r1,[r0]

@set_clock
        ldr   r0, =PMC_BASE
        ldr   r1, =(0x20<<16)|(0x3f<<|(0x20000000)|0x3
        str   r1, [r0,#CKGR_PLLAR]

L1:
        ldr   r1, [r0,#PMC_SR]
        tst   r1, #0x2
        beq   L1

        ldr   r1, =0x102
        str   r1, [r0,#PMC_MCKR]

L2:
        ldr   r1, [r0,#PMC_SR]
        tst   r1, #0x8
        beq   L2

@init_uart
        ldr   r0, =GPIOA_BASE
        ldr   r1, =(1<<9)|(1<<10)
        str   r1, [r0,#PIO_PDR]

@peripheral a
        str   r1, [r0,#PIO_ASR]

@interrupt disable
        ldr   r0, =DBUG_BASE
        mvn   r1, #0
        str   r1, [r0,#DBGU_IDR]

@Debug Unit Control Register
        mov   r1, #0x15c
        str   r1, [r0]

@Baud rate
        mov   r1, #55
        str   r1, [r0,#DBGU_BRGR]

        mov   r1, #0x800
        str   r1, [r0,#DBGU_MR]

L3:
        ldr   r1,[r0,#DBGU_SR]
        tst   r1,#0x2
        beq   L3
        mov   r1,#97
        str   r1,[r0,#DBGU_THR]
        b   L3
       
Hang:
        b Hang
作者: longxinhui    时间: 2009-09-25 19:11
#include"atmel.h"

.global GTopHalfEntry
.global Hang

GTopHalfEntry:
        ldr   pc,vect_reset
    ldr   pc, vect_undef
    ldr   pc, vect_swi
    ldr   pc, vect_iabort
    ldr   pc, vect_dabort
    .word 512
    ldr   pc, vect_irq
    ldr   pc, vect_fiq

vect_reset:
    .word handle_reset
vect_undef:
    .word handle_undef
vect_swi:
    .word handle_swi
vect_iabort:
    .word handle_iabort
vect_dabort:
    .word handle_dabort
vect_irq:
    .word handle_irq
vect_fiq:
    .word handle_fiq

handle_fiq:
handle_irq:
handle_dabort:
handle_iabort:
handle_swi:
handle_undef:
handle_reset:
    msr   cpsr, #((ARM_MODE_SVC) | (ARM_INT_MASK))

@LED
    ldr   r0, =GPIOA_BASE
    ldr   r1, =(1<<14)|(1<<23)
    str   r1, [r0]
    str   r1, [r0,#PIO_OER]
    str   r1, [r0,#PIO_CODR]
    mov   r1, #(1<<15)
    ldr   r0, =WDT
    str   r1, [r0]

@set_clock
        ldr   r0, =PMC_BASE
        ldr   r1, =(0x20<<16)|(0x3f<<|(0x20000000)|0x3
        str   r1, [r0,#CKGR_PLLAR]

L1:
        ldr   r1, [r0,#PMC_SR]
        tst   r1, #0x2
        beq   L1

        ldr   r1, =0x102
        str   r1, [r0,#PMC_MCKR]

L2:
        ldr   r1, [r0,#PMC_SR]
        tst   r1, #0x8
        beq   L2

@init_uart
        ldr   r0, =GPIOA_BASE
        ldr   r1, =(1<<9)|(1<<10)
        str   r1, [r0,#PIO_PDR]

@peripheral a
        str   r1, [r0,#PIO_ASR]

@interrupt disable
        ldr   r0, =DBUG_BASE
        mvn   r1, #0
        str   r1, [r0,#DBGU_IDR]

@Debug Unit Control Register
        mov   r1, #0x15c
        str   r1, [r0]

@Baud rate
        mov   r1, #55
        str   r1, [r0,#DBGU_BRGR]

        mov   r1, #0x800
        str   r1, [r0,#DBGU_MR]

L3:
        ldr   r1, [r0,#DBGU_SR]
        tst   r1, #0x2
        beq   L3
        mov   r1, #97
        str   r1, [r0,#DBGU_THR]
        b     L3
       
Hang:
        b Hang
作者: conke    时间: 2009-09-25 19:39

  1.   1 #include"atmel.h"
  2.   2
  3.   3 .global GTopHalfEntry
  4.   4 .global Hang
  5. ~~~~~~~~~~~~~~ why global?

  6.   5
  7.   6 GTopHalfEntry:
  8.   7         ldr   pc,vect_reset
  9.   8     ldr   pc, vect_undef
  10.   9     ldr   pc, vect_swi
  11. 10     ldr   pc, vect_iabort
  12. 11     ldr   pc, vect_dabort
  13. 12     .word 512
  14. 13     ldr   pc, vect_irq
  15. 14     ldr   pc, vect_fiq
  16. 15
  17. 16 vect_reset:
  18. 17     .word handle_reset
  19. 18 vect_undef:
  20. 19     .word handle_undef
  21. 20 vect_swi:
  22. 21     .word handle_swi
  23. 22 vect_iabort:
  24. 23     .word handle_iabort
  25. 24 vect_dabort:
  26. 25     .word handle_dabort
  27. 26 vect_irq:
  28. 27     .word handle_irq
  29. 28 vect_fiq:
  30. 29     .word handle_fiq
  31. 30
  32. 31 handle_fiq:
  33. 32 handle_irq:
  34. 33 handle_dabort:
  35. 34 handle_iabort:
  36. 35 handle_swi:
  37. 36 handle_undef:
  38. ~~~~~~~~~~~~~ no exception handler needed in a simple case.


  39. 37 handle_reset:
  40. 38     msr   cpsr, #((ARM_MODE_SVC) | (ARM_INT_MASK))
  41. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ msr   cpsr, #(ARM_MODE_SVC | ARM_INT_MASK)

  42. 39 @LED
  43. 40     ldr   r0, =GPIOA_BASE
  44. 41     ldr   r1, =(1<<14)|(1<<23)
  45. 42     str   r1, [r0]
  46. ~~~~~~~~~~~~~~ "str  r1, [r0, #PIO_PER]" is prefer

  47. 43     str   r1, [r0,#PIO_OER]
  48. 44     str   r1, [r0,#PIO_CODR]
  49. 45     mov   r1, #(1<<15)
  50. 46     ldr   r0, =WDT
  51. 47     str   r1, [r0]
  52. ~~~~~~~~~~~~~~ str  r1, [r0, #xxxx]

  53. 48 @set_clock
  54. 49         ldr   r0, =PMC_BASE
  55. 50         ldr   r1, =(0x20<<16)|(0x3f<<8)|(0x20000000)|0x3
  56. 51         str   r1, [r0,#CKGR_PLLAR]
  57. 52 L1:     
  58. 53         ldr   r1, [r0,#PMC_SR]
  59. 54         tst   r1, #0x2
  60. 55         beq   L1
  61. 56         ldr   r1, =0x102
  62. 57         str   r1, [r0,#PMC_MCKR]
  63. 58         
  64. 59 L2:     
  65. 60         ldr   r1, [r0,#PMC_SR]
  66. 61         tst   r1, #0x8
  67. 62         beq   L2
  68. 63 @init_uart
  69. 64         ldr   r0, =GPIOA_BASE
  70. 65         ldr   r1, =(1<<9)|(1<<10)
  71. ~~~~~~~~~~~~~~~~~ mov r1, #((1 << 10) | (1 << 9))

  72. 66         str   r1, [r0,#PIO_PDR]
  73. 67 @peripheral a
  74. 68         str   r1, [r0,#PIO_ASR]
  75. 69 @interrupt disable
  76. 70         ldr   r0, =DBUG_BASE
  77. 71         mvn   r1, #0
  78. 72         str   r1, [r0,#DBGU_IDR]
  79. 73 @Debug Unit Control Register
  80. 74         mov   r1, #0x15c
  81. 75         str   r1, [r0]
  82. 76 @Baud rate
  83. 77         mov   r1, #55
  84. ~~~~~~~~~~~~~~~~ DO NOT use any magic number!

  85. 78         str   r1, [r0,#DBGU_BRGR]
  86. 79         mov   r1, #0x800
  87. 80         str   r1, [r0,#DBGU_MR]
  88. 81 L3:     
  89. 82         ldr   r1, [r0,#DBGU_SR]
  90. 83         tst   r1, #0x2
  91. 84         beq   L3
  92. 85         mov   r1, #97
  93. ~~~~~~~~~~~~~~~ mov r1, #'a'

  94. 86         str   r1, [r0,#DBGU_THR]
  95. ~~~~~~~~~~~~~~~~~~~~~~~ use "strb" instead!
  96. 87         b     L3
  97. 88 Hang:   
  98. 89         b Hang
复制代码

作者: zhiyuan1106    时间: 2009-09-28 09:12
标题: 关于romboot的问题
纠正一下楼主的问题!

楼主是不是新用AT91SAM926X啊?这个片子默认启动就先打印如下
//*************以下****************
RomBOOT
>
**************以上***************//

波特率为115200-8-N-1




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2