本帖最后由 cf0609 于 2014-8-1 02:06 编辑
S3c2416是arm926ej内核,使用的是armv5指令集,相对于armv4的指令集,指令只是增加了软件断点bkpt,双字加载,存储指令ldrd/strd等。所以只要能编译armv4指令集的编译器都可以用来开发s3c2416.现在常见的编译器iar,mdk,arm-linux-gcc。特别是对于嵌入式linux的开发,几乎全部选用arm-linux-gcc。现在用做裸机方面的开发,因此选用一款windows下的一个集成开发环境更方便。在这里使用mdk,做为裸机方面的开发集成环境。
打开mdk,创建一个新的工程,在先择目标设备时,可以找到这款芯片s3c2416,如(图1)
图1
选择好目标设备后,点击ok。工程创建完成。
因为要生成bin文件,还需要在进行下面的设置如(图2)
图2
红色方框的内容为:
fromelf --bin "..\output\@L.axf"--output "..\output\@L.bin"
#要结合自己的输出文件路径来设置此项,如:我的xxx.axf编译后在output目录下,可以设置为上面的内容。
在options for Target窗口的link选项页还要添加s3c2416_Startup.sct文件如(图3)
图3
s3c2416_Startup.sct中的内容如下:
;*************************************************************
; *** Scatter-Loading Description Filegenerated by uVision ***
;*************************************************************
LR_IROM1 0x40000000 0x00010000 { ;load region size_region
; Steppingstone 0x40000000,8k size(IROMboot)
ER_IROM1 0x40000000 0x00002000 { ; load address = executionaddress
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
;IRAM 64k-8k = 56k
RW_IRAM1 0x40002000 0x0000E000 { ; RW data
.ANY (+RW +ZI)
}
}
基本的设置完成了,开始编写代码,实现helper2416开发板上的一个用户led闪烁。
在原理图中可以看到如(图4)
图4
在启动分析的那个帖子里面已经说过helper2416的两种启动式,为了方便下面的裸机程序我选择使用IROM SD/MMC 卡启动。
; Internal Memory Base Addresses(IROM boot)
IRAM_BASE EQU 0x40000000 ;IRAM的起始地址,程序被复制到此,然后从这里开始运行
; Watchdog Timer Base Address
WT_BASE EQU 0x53000000 ;看门狗寄存器地址
; IO port for controling LEDs
GPBCON EQU 0x56000010 ; GPIO_B的控制寄存器地址
GPBDAT EQU 0x56000014
GPBUDP EQU 0x56000018
GPBSEL EQU 0x5600001c
;----------------------- CODE----------------------------------
PRESERVE8 ;当前代码中的数据栈是8字节对齐的
AREA RESET, CODE, READONLY
ENTRY
ARM ;使用ARM指令
Start
LDR R0, =WT_BASE ;关看门狗
MOV R1, #0
STR R1, [R0]
BL GPIO_Init ;初始化GPIO
Loop
LDR R1, =GPBDAT ; 关led
LDR R2, [R1]
ORR R2, R2, #(1<<1)
STR R2, [R1] ;灭
LDR R0, =1000 ;延时大约1s
BL Delay_ms
BIC R2, R2, #(1<<1) ;开led
STR R2, [R1] ; ;亮
LDR R0, =1000 ;延时大约1s
BL Delay_ms
B Loop
GPIO_Init
LDR R0, =GPBCON
LDR R1, [R0] ;把GPBCON的值读到r1
BIC R1, R1, #(0x3<<2) ;使r1的bit[3:2] = 0
ORR R1, R1, #(0x1<<2) ;使r1的bit[3:2] =0x01
STR R1, [R0] ;设置GPB1为输出
LDR R0, =GPBUDP
BIC R1, R1, #(0x03<<1)
ORR R1, R1, #(0x02<<1)
STR R2, [R0] ;设置上拉
BX LR
;软件延时函数r0*1ms
;由于没有设置时钟,用系统上电后默认的时钟
;由于是从IROM SD/MM 卡启动
;OM[0] = 0所以 系统输入时钟为 = 12MHz
Delay_ms
STMFDSP!, {R1}
Delay1
LDR R1, =30000 ;
Delay2
SUBSR1, R1, #1 ;
BNE Delay2 ;
SUBSR0, R0, #1
BNE Delay1
LDMFDSP!, {R1} ;
BX LR
END;
把文件添加到工程中,如果没有问题会在output目录下生成led.bin
调整一下led.bin的大小,使用(如图5)
图5
来调整led.bin的大小,调整后的文件大小为8k(很熟悉的一个数字吧,在启动分析里提到过8k哦)。会在文件的当前目录下生面led_1.bin文件。
再使用如(图6)在写sd卡是如果是win7系统要用管理员身份打开此软件,要不然不能使用。
图6
把led_1.bin写入到SD卡中。
好像是有点麻烦了,既要调整led.bin的大小,又要烧写到SD卡中,还使用两个不同的软件来做,如果可以这两个过程合并为一次就好了,找时间自己写个这样的小应用程序。
把SD卡插入到班子上就可以看到液晶屏下的一个led闪烁了。
由于本人也是学习这方面的知识不久,写的如有不正确或是有异议的地方,欢迎大家批评指正。
论坛ID:cf0609
提交时间:2014.08.01