//读取CPSR寄存器的内容到R0 mrs r0,cpsr //清除R0中的0 - 4 这5个位后保存到R0中 //也就是清除用户模式位 bic r0,r0,#0x1f //置R0的0 1 4 6 7 位为真 //也就是选择SVC模式,同时IRQ和FIQ被禁止,处理器处于ARM状态 //关闭中断和快速中断 orr r0,r0,#0xd3 //将R0中的值保存到CPSR上 msr cpsr,r0 # define pWTCON 0x53000000 ;看门狗控制寄存器WTCON
# define INTMSK 0x4A000008 ;中断屏蔽寄存器INTMSK
# define INTSUBMSK 0x4A00001C ;辅助中断屏蔽寄存器,由于外设中断源太多,要用此寄存器屏蔽剩余的中断源 # define LOCKTIME 0x4c000000 ;PLL锁定时间计数寄存器
# define MPLLCON 0x4c000004 ;主时钟锁相环控制寄存器 # define UPLLCON 0x4c000008 # define CLKDIVN 0x4C000014 ;时钟分频寄存器/* clock divisor register */
# define INTSUBMSK_val 0xffff # define MPLLCON_val ((184 << 12) + (2 << 4) + 2) /*406M*/ # define UPLLCON_val ((60 << 12) + (4 << 4) + 2) /* 47M */ # define CLKDIVN_val 7 /* FCLK:HCLK:PCLK = 1:3:6 */ # define CAMDIVN 0x4C000018 //取得看门狗寄存器的地址 ldr r0, =pWTCON //将R1寄存器清0 mov r1, #0x0 //将看门狗寄存器清0,即将看门狗禁止,包括定时器定时,溢出中断及溢出复位等 str r1, [r0] /* * mask all IRQs by setting all bits in the INTMR - default */ //设R1寄存器为0xFFFF FFFF mov r1, #0xffffffff //读取中断屏蔽寄存器的地址 ldr r0, =INTMSK //将中断屏蔽寄存器中的位全设1,屏蔽所有中断 str r1, [r0] //# define INTSUBMSK_val 0xffff //设R1寄存器为0xFFFF ldr r1, =INTSUBMSK_val //读取辅助中断屏蔽寄存器的地址 ldr r0, =INTSUBMSK //将辅助中断屏蔽寄中的11个中断信号屏蔽掉,本人觉得INTSUBMS_val应设成7ff str r1, [r0] //# define LOCKTIME 0x4c000000 //读取PLL锁频计数器寄存器地址到R0中 ldr r0,=LOCKTIME //将R1设为0x00FF FFFF ldr r1,=0xffffff //M_LTIME为最大的0xFFF //U_LTIME为最大的0xFFF str r1,[r0] ;0xfff=4096>1800,远远满足锁定要求 /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ //# define CLKDIVN 0x4C000014 /* clock divisor register */ //读取时钟分频寄存器的地址 ldr r0, =CLKDIVN //# define CLKDIVN_val 7 /* FCLK:HCLK:PCLK = 1:3:6 */ //将R1设为0x7 mov r1, #CLKDIVN_va //PDIVN - 1: PCLK has the clock same as the HCLK/2. //HDIVN - 11 : HCLK = FCLK/3 when CAMDIVN[8] = 0. // HCLK = FCLK/6 when CAMDIVN[8] = 1. str r1, [r0] /* Make sure we get FCLK:HCLK:PCLK = 1:3:6 */ //# define CAMDIVN 0x4C000018 //读取摄像头时钟分频寄存器的地址 ldr r0, =CAMDIVN //将R1设为0 mov r1, #0 //将摄像头时钟分频寄存器清0 str r1, [r0] /* Clock asynchronous mode */ //MRC p15, 0, Rd, c1, c0, 0 ; read control register //读取控制寄存器中的值到R1中 mrc p15, 0, r1, c1, c0, 0 ;将协处理器p15的寄存器c1和c0的值传到arm处理器的R1寄存器中 //31 iA bit Asynchronous clock select //30 nF bit notFastBus select orr r1, r1, #0xc0000000 ;将最高两位置1 //MCR p15, 0, Rd, c1, c0, 0 ; write control register
//将R1中的值写到控制寄存器中 mcr p15, 0, r1, c1, c0, 0 将arm的寄存器R1的32位数据传到协处理器p15的两个16位寄存器c1和c0 //# define UPLLCON 0x4c000008 //读取UPLL设置寄存器的地址到R0中 ldr r0,=UPLLCON //# define UPLLCON_val ((60 << 12) + (4 << 4) + 2) /* 47M */ ldr r1,=UPLLCON_val //将R1中的值写入UPLL设置寄存器中 str r1,[r0] //ARM920T为5级流水线,需要至少5个周期来让指令生效 nop nop nop nop nop nop nop nop //读取MPLL设置寄存器的地址到R0中 ldr r0,=MPLLCON //# define MPLLCON_val ((184 << 12) + (2 << 4) + 2) /*406M*/ ldr r1,=MPLLCON_val //将R1中的值写入MPLL设置寄存器中 str r1,[r0] #define GPJCON 0x560000D0 #define GPJDAT 0x560000D4 #define GPJUP 0x560000D8 //跳转到cpu_init_crit处执行 //并将下一条指令的地址写入LR寄存器中 bl cpu_init_crit
|