您当前的位置:五五电子网电子知识单片机-工控设备ARM单片机如何开发arm(4) 正文
如何开发arm(4)

如何开发arm(4)

点击数:7625 次   录入时间:03-04 11:52:58   整理:http://www.55dianzi.com   ARM单片机

/**************************************************************************
* CPU_init_critICal临界区寄存器
* 设置一些重要的寄存器,并进行内存测试。
*************************************************************************
*/

#define INTCON (0x01c00000+0x200000) /* 中断控制器 */
#define INTMSK (0x01c00000+0x20000c) /* 中断控制屏蔽寄存器 */
#define LOCKTIME (0x01c00000+0x18000c)
#define PLLCON (0x01c00000+0x180000)
#define CLKCON (0x01c00000+0x180004)
#define WTCON (0x01c00000+0x130000)

cpu_init_crit:

        /* 关闭看门狗 */
        ldr         r0, =WTCON
        ldr        r1, =0x0
        str        r1, [r0]

        /** 清除所有中断位,设置INTMRs实现。*/
        ldr        r1,=INTMSK
        ldr        r0, =0x03fffeff
        str        r0, [r1]
        ldr        r1, =INTCON
        ldr        r0, =0x05
        str        r0, [r1]

        /* 设置时钟控制寄存器 */
        ldr        r1, =LOCKTIME
        ldrb        r0, =800
        strb        r0, [r1]

        /* 设置锁相环,控制CPU运行速度。 */
        ldr        r1, =PLLCON

#if CONFIG_S3C44B0_CLOCK_SPEED==66
        ldr        r0, =0x34031         /* 66MHz (QUARTz=11MHz) */

#elif CONFIG_S3C44B0_CLOCK_SPEED==75
        ldr        r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz  */
#else

# error CONFIG_S3C44B0_CLOCK_SPEED undefined

#endif
        str        r0, [r1]
        ldr        r1,=CLKCON
        ldr        r0, =0x7ff8
        str        r0, [r1]

        /* 调用子函数返回 */
        mov        pc, lr

/*************************************************/
/*        实际的中断向量表        */
/*************************************************/

real_vectors:
        b        reset
        b        undefined_instruction
        b        SOFtware_interrupt
        b        prefetch_abort
        b        data_abort
        b        not_used
        b        IRQ
        b        fiq
/*************************************************/

undefined_instruction:
        mov        r6, #3
        b        reset

software_interrupt:
        mov        r6, #4
        b        reset

prefetch_abort:
        mov        r6, #5
        b        reset

data_abort:
        mov        r6, #6
        b        reset

not_used:
        /* we *should* never reach this */
        mov        r6, #7
        b        reset
irq:
        mov        r6, #8
        b        reset
fiq:
        mov        r6, #9
        b        reset

把引导的汇编看完,已经准备C的运行环境,下面就开始学习C的源程序,从start.S文件里到跳文件lib_arm\board.c里运

行.

/*引导程序从汇编start.S里跳到这里执行。蔡军生 2005/07/19*/

void start_armboot (void)
{
        /* 声明一个全局指针,它是指向一个数据结构,用于保存参数。
        并且它占用r8寄存器,用它来保存内存地址,达到全局使用目的。
        */
        DECLARE_GLOBAL_DATA_PTR;
        ulong size;
        init_fnc_t **init_fnc_ptr;
        char *s;

#if defined(CONFIG_VFD) defined(CONFIG_LCD) unsigned long addr;

#endif
        /* gd指针可写,因为已经分配一个寄存器给它作为变量。
        这里就相当于把后面算出来的地址保存到r8寄存器.
        */
        gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

       /* 下面一句是阻止3.4以上版本的GCC进行代码优化,把后面的代码删除掉。 */

        __asm__ __volatile__("": : :"memory");

        /* 清空gd指向的结构 */
        MEMSet ((void*)gd, 0, sizeof (gd_t));
        /*  */
        gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
        mEMSet (gd->bd, 0, sizeof (bd_t));
        monitor_flash_len = _bss_start - _armboot_start;

这一段准备好保存参数的全局变量区.
后面就是一系列的初始化和获取正确的参数.

[1] [2]  下一页


本文关键字:如何  开发  ARM单片机单片机-工控设备 - ARM单片机