程序项目代做,有需求私信(vue、React、Java、爬虫、电路板设计、嵌入式linux等)

Mini2440Keil5 开发环境搭建

在前几节的开发中,我们一直使用编辑器编辑程序,当程序文件比较多的时候,也不方便管理。本节将尝试使用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 目录结构调整

调整项目目录结构如下图:

 

posted @ 2021-06-12 14:43  大奥特曼打小怪兽  阅读(962)  评论(0编辑  收藏  举报
如果有任何技术小问题,欢迎大家交流沟通,共同进步