S3C2440 Keil5 开发环境搭建
Posted 大奥特曼打小怪兽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S3C2440 Keil5 开发环境搭建相关的知识,希望对你有一定的参考价值。
在前几节的开发中,我们一直使用编辑器编辑程序,当程序文件比较多的时候,也不方便管理。本节将尝试使用keil开发环境编写S3C2440代码
一、Keil5安装
1.1 软件安装
Keil5的安装就不介绍了,自己去网上下载mdk5软件自行安装即可,这里我使用的是mdk518a.exe。
安装完后,记得设置字体编码:
Edit -> configuration -> Editor
1.2 安装开发包
MDK5以后的版本不在直接支持arm7、arm9的开发。因此我们需要下载相应的arm7、arm9的软件支持包。
打开这个网页 MDK Version 5 - Legacy Support 下载相应的软件支持包就可以了。截图如下,注意要选择自己MDK对应版本的支持包。
下载完成后,双击安装即可。
二、MDK工程建立
2.1 打开Keil,新建一个工程
新建一个工程目录,用于存放一个工程的所有文件:并且取工程名为4.uart并保存,然后创建工程文件,你可以自己命名为uart:
2.2 选择型号
接下来选择CUP database:我们选择samsung的S3C2440A,点击OK:
之后会出现第二个图问你是否拷贝’S3C2440.s’到工程文件夹并加入到工程里,S3C2440.s是启动代码我们选择YES:
如果有兴趣的话,你可以看看官方的S3C2440.s启动程序是如何编写的。
2.3 设置
然后我们需要对S3C2440.s进行一些必须的配置,打开此文件选择编辑界面下面的Configuration wizard进行配置,这里我把全部都打上勾,这样比较保险:
2.4 main.c
之后新建一个c文件并编写代码,我习惯新建一个main目录用来保存这个存放入口函数的文件,然后把这个文件加到工程里:
/*GPIO registers*/
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
void delay(int tim){
while(tim--);
}
int main(){
/* 清零 */
GPBCON &= ~(0x03 << 10);
/* 设置为output */
GPBCON |= (0x01 << 10);
while(1){
/* 将 GPB5 输出低电平 */
GPBDAT &= ~(1<<5);
delay(0x100000);
/* 将 GPB5 输出高电平 */
GPBDAT |= (1<<5);
delay(0x100000);
}
return 0;
}
2.5 其他设置
如果你需要通过Keil5编译程序,那你还需要设置Options for Target,具体可以参考keil5(MDK5)配置S3C2440裸机开发调试环境。
由于我只是将Keil作为一个编辑器使用,使用其进行文件管理、语法检查。并不使用其下载调试功能,就不做其他的配置了。
2.6 修改s3c2440.s文件为start.s
.text
.global _start
_start:
/* 关闭看门狗 */
bl disable_watchdog
/* 设置系统时钟 */
bl system_clock_init
/* 初始化栈 */
bl stack_init
/* 跳到main函数执行 */
bl main
loop:
b loop
/* 关闭开门狗(关闭门狗中断,以及看门狗计数器,禁止复位信号输出) */
#define WTCON 0x53000000 /* 看门狗控制寄存器地址 #define等价于标准汇编里的EQU 用来定义常量 */
disable_watchdog:
ldr r0,=WTCON /* 伪指令加载WTCON值到r0 */
mov r1,#0x00
str r1,[r0] /* 把[WTCON]内存单元清零 */
mov pc,lr
/* 初始化系统时钟 FCLK = 400MHz,HCLK = 100MHz, PCLK = 50MHz, UPLL=48MHz */
#define LOCKTIME 0x4c000000
#define MPLLCON 0x4c000004
#define UPLLCON 0x4c000008
#define CLKDIVN 0x4c000014
#define M_MDIV 92 /* @Fin=12M UPLL=400M */
#define M_PDIV 1
#define M_SDIV 1
#define U_MDIV 56 /* @Fin=12M UPLL=48M */
#define U_PDIV 2
#define U_SDIV 2
#define DIVN_UPLL 0 /* FCLK:HCLK:PCLK=1:4:8 */
#define HDIVN 2
#define PDIVN 1
system_clock_init:
/* 设置Lock Time */
ldr r0,=LOCKTIME
ldr r1,=0xffffffff
str r1,[r0]
/* 设置分频系数 */
ldr r0,=CLKDIVN
ldr r1,=((DIVN_UPLL<<3) | HDIVN <<1 | PDIVN)
str r1,[r0]
/* CPU改为异步总线模式 */
mrc p15,0,r1,c1,c0,0
orr r1,r1,#0xC0000000
mcr p15,0,r1,c1,c0,0
/* 设置UPLL */
ldr r0,=UPLLCON
ldr r1,=((U_MDIV<<12) | (U_PDIV<<4) | U_SDIV)
str r1, [r0]
nop
nop
nop
nop
nop
nop
nop
/* 设置MPLL */
ldr r0,=MPLLCON
ldr r1,=((M_MDIV << 12) | (M_PDIV << 4) | M_SDIV)
str r1,[r0]
mov pc,lr
/* 设置栈 自动分辨是nor flash 启动还是nand flash启动 */
/* 先将一个数写道0地址,然后读出来判断跟写入的值是否一样;跟写入的一样则是nand flash启动,跟写入的值不一样则是nor flash 启动 */
stack_init:
mov r1, #0
ldr r0, [r1] /* 读出原来的值备份 */
str r1, [r1] /* 0->[0] */
ldr r2, [r1] /* r2=[0] */
cmp r1, r2 /* r1==r2? 如果相等表示是NAND启动 */
ldr sp, =0x40000000+0x1000 /* 先假设是nor启动,0x40000000 + 4k处 */
moveq sp, #0x1000 /* nand启动, 将栈设置在4k处 */
streq r0, [r1] /* 恢复原来的值 */
mov pc,lr
2.7 Makefile
新建Makefile文件:
all:start.o main.o
# 链接
arm-linux-ld -Ttext 0x00000000 -o main.elf $^
# 转为bin -S 不从源文件中复制重定位信息和符号信息到目标文件中
arm-linux-objcopy -O binary -S main.elf main.bin
# 反汇编 -D反汇编所有段
arm-linux-objdump -D main.elf > main.dis
%.o : %.S
arm-linux-gcc -g -c $^
%.o : %.c
arm-linux-gcc -g -c $^
.PHONY: clean
clean:
rm *.o *.elf *.bin *.dis
2.8 目录结构调整
调整项目目录结构如下图:
以上是关于S3C2440 Keil5 开发环境搭建的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
ubuntu 12.04内核3.2.0-60搭建ARM S3C2440 交叉编译环境要选择哪个版本的ARM-LINUX-GCC啊?谢谢