zoukankan      html  css  js  c++  java
  • 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 目录结构调整

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

     

  • 相关阅读:
    mysql支持跨表delete删除多表记录
    三种循环的流程图画法总结
    巧用svn create patch(打补丁)方案解决定制版需求
    svn branch and merge(svn切换分支和合并)详解
    visualvm
    Java -verbose[:class|gc|jni] 转 ----JAVA源码分析
    BootstrapClassloader ExtClassloader AppClassloader
    LINUX 源码+内核所有参数说明
    SDN
    人工智能之数学基础
  • 原文地址:https://www.cnblogs.com/zyly/p/14878229.html
Copyright © 2011-2022 走看看