发现问题:

前面我们编写 LED 流水灯 裸机驱动,需要添加了 启动代码 (杨铸 startup.s) ,也就是初始化把 开发板带到 C 语言环境(也就是 xmain 函数)

 1      ;
 2 ; MDK跑马灯实验
 3 ;
 4     PRESERVE8
 5     AREA RESET, CODE, READONLY
 6     ENTRY
 7 start
 8     ; close watchdog
 9     ldr r0, = 0x53000000    ; 将看门狗控制寄存器地址放入r0
10     mov r1, #0
11     str r1, [r0]            ; 设置看门狗控制寄存器的值为0
12     
13     bl initmem                ; 跳转到initmem代码段,初始化内存
14     
15     IMPORT xmain            ; 引入xmain.c中的xmain函数
16     ldr sp, =0x34000000        ; 调用C程序之前先初始化栈指针
17     ldr lr, =endxmain        ; 设置xmain函数的返回地址
18     ldr pc, =xmain            ; 跳转到C程序中的xmain函数的入口处执行
19 
20 endxmain
21     ldr r0, =0x56000010        ; LED的GPIO接口配置寄存器
22     ldr r1, =0x00015400        ; GPIO配置数据
23     str r1, [r0]               ; 设置GPIO
24     ldr r0, =0x56000014     ; LED控制寄存器地址
25     ldr r1, =0x000000e0       ; 全部LED亮
26     str r1,[r0]   
27 loop
28     b loop                    ; 死循环
29 
30 initmem                            ; 内存初始化
31     ldr r0, =0x48000000            ; 加载内存相关寄存器首地址r0
32     ldr r1, =0x48000034            ; 加载内存相关寄存器尾地址到r1
33 
34     adr r2, memdata                ; 将寄存器配置数据地址段首地址加载到r2
35 initmemloop
36     ldr r3, [r2], #4            ; 循环设置存寄存器
37     str r3, [r0], #4
38     teq r0, r1
39     bne initmemloop                ; 循环到最后一个寄存器时退出函数
40       BX lr  
41 
42 memdata
43     DCD    0x22000000         ;BWSCON
44     DCD    0x00000700        ;BANKCON0    
45     DCD    0x00000700        ;BANKCON1    
46     DCD    0x00000700        ;BANKCON2    
47     DCD    0x00000700      ;BANKCON3        
48     DCD    0x00000700        ;BANKCON4    
49     DCD    0x00000700        ;BANKCON5    
50     DCD    0x00018005        ;BANKCON6    
51     DCD    0x00018005        ;BANKCON7    
52     DCD    0x008e07a3        ;REFRESH    
53     DCD    0x000000b1        ;BANKSIZE    
54     DCD    0x00000030        ;MRSRB6    
55     DCD    0x00000030        ;MRSRB7
56     
57     END
startup.s

相关文章: