- 论坛徽章:
- 0
|
现在贴出来,与大家分享一下一个最简单的HelloWorld 程序。
部分代码参考了G-bios的上半部份。
简要分析一下,标号TigerEntry是程序的入口地址,CPU在上电复位后执行该处的第一条指令,即 “ldr pc,vect_rest”。
本程序主要向大家演示了如何让CPU在上电复位后以最快的速度从串口控制台中输出“Hello Maxwit”信息。
最后一直让CPU处于空转状态。
写得比较乱,有不当之处请大家指正,详细的代码如下:
#define AT91SAM926X_WDT_BASE 0xfffffd40
#define AT91SAM926X_PA_PMC 0xfffffc00
#define PMC_IDR 0x64
#define PMC_PLLAR 0x28
#define PMC_SR 0x68
#define PMC_MCKR 0x30
#define AT91SAM926X_PIOA_BASE 0xfffff400
#define PIO_PER 0x00
#define PIO_PDR 0x04
#define PIO_OER 0x10
#define PIO_CODR 0x34
#define PIO_ASR 0x70
#define AT921SAM926X_DEBUG_BASE 0xfffff200
.global TigerEntry
.global Hang
TigerEntry:
ldr pc,vect_rest
ldr pc,vect_undef
ldr pc,vect_swi
ldr pc,vect_iabort
ldr pc,vect_dabort
.word (TigerEnd-TigerEntry)
ldr pc,vect_irq
ldr pc,vect_fiq
vect_rest:
.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,#(0x13 | 1<<6 | 1<<7)
@now to disable the watch dog
ldr r0,=AT91SAM926X_WDT_BASE
mov r1,#(1<<15)
str r1,[r0,#4]
@now to light the LED
ldr r0,=AT91SAM926X_PIOA_BASE
mov r1,#(1<<14)
str r1,[r0,#PIO_PER]
str r1,[r0,#PIO_OER]
str r1,[r0,#PIO_CODR]
mov r1,#(1<<23)
str r1,[r0,#PIO_PER]
str r1,[r0,#PIO_OER]
str r1,[r0,#PIO_CODR]
@now to initialize the system clock
ldr r0,=AT91SAM926X_PA_PMC
mvn r1,#0
str r1,[r0,#PMC_IDR]
ldr r1,=0x2060bf09
str r1,[r0, #PMC_PLLAR]
L1:
ldr r1,[r0,#PMC_SR]
adds r1,r1,#2
beq L1
ldr r1,=0x102
str r1,[r0,#PMC_MCKR]
L2:
ldr r1,[r0,#PMC_SR]
tst r1,#8
beq L2
@now to configure PioA port for debug unit
ldr r0,=AT91SAM926X_PIOA_BASE
mov r1,#(3<<9)
str r1,[r0,#PIO_PDR]
str r1,[r0,#PIO_ASR]
@now to init debug unit
#define CPU_CLOCK 208305913
#define M_CLOCK (CPU_CLOCK/2)
#define BOUND_RATE (M_CLOCK/(16*115200))
#define DEBUG_IDR 0x0c
#define DEBUG_CR 0x00
#define DEBUG_BRGR 0x20
#define DEBUG_MR 0x04
#define DEBUG_SR 0x14
#define DEBUG_THR 0x1c
#define DEBUG_CIDR 0x40
ldr r0,=AT921SAM926X_DEBUG_BASE
mvn r1,#0
str r1,[r0,#DEBUG_IDR]
mov r1,#0x10c
str r1,[r0,#DEBUG_CR]
mov r1,#0x50
str r1,[r0,#DEBUG_CR]
@set boudrate
ldr r1,=BOUND_RATE
str r1,[r0,#DEBUG_BRGR]
mov r1,#0x0800
str r1,[r0,#DEBUG_MR]
ldr r2,.L2
mov r3,#0
L3:
ldr r1,[r0,#DEBUG_SR]
tst r1,#2
beq L3
ldr r4,[r2,r3]
@cmp r4,#0
@beq Hang
add r3,r3,#1
cmp r3,#14
beq Hang
str r4,[r0,#DEBUG_THR]
b L3
@Read chip id
Hang:
b Hang
.L2:
.word .L1
.data
.align 2
.L1:
.asciz "Hello Maxwit!"
[ 本帖最后由 tigermmx 于 2009-9-25 19:52 编辑 ] |
|