编程思路
核心初始化
1、参照S3C2440规格书,设置中断向量
2、设置SVC
1). 关键词: bic orr MRS MSR CPSR SPSR-> mrs r0 cpsr // cpsr 值保存到R0
-> bic r0, r0,#0x1f // 后5位清零
-> orr r0, r0,#0x13 // 写1
-> msr cpsr, r0
3、关闭看门狗
将wtdog 填0#define pWTCON 0x53000000
ldr r0, = pWTCON
mov r1, #0x0
str r1, [r0]
4、关闭中断
将INTMASK寄存器 全部写1mvn r0, #0x0 //0取反赋值
ldr r0, = #0x4a000008 // intmask 地址写入r0
str r1, [r0]
5、关闭mmu和cache
cache: 处于处理器和主存储器之间,用于缓存最近使用的数据拷贝,容量小,速度快。I-Cache: 存储命令
D-Cache: 存储数据
mmu: 将虚拟地址转换成真实地址
-> mcr p15,0,r0,c7,c7,0 // icashe dcashe失效
-> mrc p15,0,r0,c1,c0,0 //关闭id cashe 和mmu
-> bic r0,r0,#0x00000007
-> mcr p15,0,r0,c1,c0,0
点亮LED
1、设置控制寄存器
2、设置数据寄存器
代码
@***************************
@ File: start.S
@ Auth: Ryan
@ Date: 2018/04/11
@***************************
.text
.global _start
_start:
/* 设置中断向量表 */
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _abort_prefetch
ldr pc, _abort_data
ldr pc, _not_use
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_abort_prefetch: .word abort_prefetch
_abort_data: .word abort_data
_not_use: .word not_used
_irq: .word irq
_fiq: .word fiq
undefined_instruction:
nop
software_interrupt:
nop
abort_prefetch:
nop
abort_data:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
bl set_svc
bl disable_watchdog
bl disable_irq
bl disable_mmu
bl set_led
/* set svc mode */
set_svc:
mrs r0, cpsr
bic r0,r0,#0x1f
orr r0,r0,#0x13
msr cpsr, r0
mov pc, lr
#define pWTCON 0x53000000
disable_watchdog:
ldr r0, = pWTCON
mov r1, #0x0
str r1, [r0]
mov pc, lr
/*disable interrput */
disable_irq:
mvn r0, #0x0
ldr r0, = 0x4a000008
str r1, [r0]
mov pc, lr
disable_mmu:
mcr p15,0,r0,c7,c7,0
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00000007
mcr p15,0,r0,c1,c0,0
mov pc, lr
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
set_led:
ldr r0, =GPBCON
ldr r1,=0x15400
str r1, [r0]
set_led_loop:
ldr r0, =GPBDAT
ldr r1, = 0B11110011111 // PB5 PB6 is low
str r1, [r0]
bl delay
ldr r0, =GPBDAT
ldr r1, = 0B11001111111 // pb7 pb8 is low
str r1, [r0]
bl delay
bl set_led_loop
mov pc, lr
delay:
ldr r2, =50000
ldr r3, =0
delay_loop:
sub r2, r2, #1 // r2=r2-1
cmp r2, r3 // cmp 比较r2 r3 如果相等 Z 为1
bne delay_loop // 当Z为1时执行跳转
mov pc, lr