电子元器件
采购信息平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 公众号

    电子元器件

    采购信息平台

  • 移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

如何开发arm(4)

来源:-- 作者:-- 浏览:201

标签:

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

/**************************************************************************
* 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;

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

/* 用循环调用所有初始化函数 */
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0)
{
/* 当每个函数初始化失败时,就会挂机在这里。 */
hang();
}
}
上次说到在函数指针数组里,不断地调用所有初始化函数进行初始化,下面就来仔细地分析一下,它们到底是做什么

的,做什么样的初始化,怎么样为后面做好运行的准备工作。看到第一个初始化函数,就是CPU初始化(cpu_init),

这个函数是在cpu\s3c44b0\cpu.c里,它的作用就是进行S3C44B0初始化工作。看到这个函数内容如下:

/* CPU初始化。蔡军生 2005/07/23*/
int cpu_init (void)
{
/* 清空缓冲区 */
icache_enable();
return 0;
}
它在里面调用了函数icache_enable(),它就是用来初始化S3C44B0的缓冲区,并且启用CPU缓冲区。因为CPU在加电之

后,它的初始化值是不启用内部的8K缓冲区的,必须由程序进行设置。接着看看那个调用的函数又是怎么样初始化内

部缓存区的呢?

/* CPU内存的缓冲初始化。蔡军生 2005/07/23*/
void icache_enable (void)
{
ulong reg;
/* 清空内存的缓冲区. */
s3c44b0_flush_cache();
/* 初始化缓冲区,设置非缓冲区的起始地址和结束地址。第一个寄存器指明下面的地址不要缓存,低16位是起始地址,高16位是结束地址。并且空间大小都是以4K为界。0x0000:0000 - 0x0C00:0000*/

NCACHBE0 = 0xC0000000;
NCACHBE1 = 0x00000000;

/* 设置SYSCFG寄存器启用8K缓冲区。 */

reg = SYSCFG;
reg = 0x00000006; /* 8kB */

SYSCFG = reg;
}

在这个函数里,第一个先调用函数是进行缓冲区清0的工作,它有一些特别的地方,如下:

/

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67
Baidu
map