a、原理图分析
b、芯片手册
c、思维导图
d、编写代码
2、为什么要点亮led
在嵌入式软件(bootloader、kernel)开发初期,由于串口等硬件尚未进行初始化,所以可以用来调试的手段很有限。这时通常运用点亮led作为调试的重要手段。也就是说不断改动led点亮程序的位置,来查看那段代码出现了问题,然后进行针对性的修改。
下面我用6410为例进行点亮led的介绍,其他的如2440和210流程相似。
a、原理图分析
从led的原理图我们可以看到,nLED_*低电平有效,也就是对应的s3c6410GPK4-7低电平,这个时候要引出一个概念:GPIO
什么是GPIO
GPIO(General-Purpose Input/Output Ports):通用的输入/输出端口。在嵌入式系统中,cpu需要控制一些结构简单的外部设备,它们通常只用两种状态(开/关)。如果用串口或USB去控制就显得复杂了些,所以在嵌入式微处理器上就引入了一种“通用可编程I/O端口”,也就是GPIO。
一个GPIO端口至少需要两个寄存器,一个是“控制寄存器”,用于选择端口作为输入还是输出。另一个是存放数据的“数据寄存器”。
b、查看芯片手册
在6410手册上查找GPK端口
查看到手册我们得知,将相应的数据填入相应的内存地址就可以了。
c、思维导图
总共分为两步来走
1、设置GPIO控制器,把引脚设置为输出
2、根据原理图设置GPIO的数据寄存器
d、编写led的驱动程序
.text .global _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq undefined_instruction: nop software_interrupt: nop prefetch_abort: nop data_abort: nop not_used: nop irq: nop fiq: nop reset: bl set_peri_port bl set_svc bl disable_watchdog bl disable_interrupt bl disable_mmu bl light_led set_peri_port: ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 mov pc, lr set_svc: mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr, r0 mov pc, lr #define pWTCON 0x7E004000 disable_watchdog: ldr r0, =pWTCON /*mov的操作数最多为8位*/ mov r1, #0x0 str r1, [r0] mov pc, lr disable_interrupt: mvn r1, #0x0 ldr r0, =0x71200014 str r1, [r0] ldr r0, =0x71300014 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 GPKCON0 0x7f008800 #define GPKDAT 0x7f008808 light_led: ldr r0, =GPKCON0 ldr r1, =0x11110000 str r1, [r0] ldr r0, =GPKDAT ldr r1, =0xa0 str r1, [r0] mov pc, lr运行以后,led会两亮两灭。从程序中我们还会看到一个函数set_peri_port。这个函数是对外围设备基地址初始化。原因是arm11的内存与外围接口分开了,这个时候要用此函数把外围寄存器映射到内存中,整个的过程是通过CP15来完成的,也就是告诉CPU外设寄存器的基地址和地址空间实现映射。
set_peri_port: ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15, 0, r0, c15, c2, 40x70000000是SROM的基地址,这段代码的功能就是告诉cpu外围设备寄存器基地址为0x70000000,地址空间为256M(0x70000000-0x7fffffff)。
上一篇:ARM裸机开发bootloader我是bootloader设计师
下一篇:ARM裸机开发bootloader核心初始化
推荐阅读最新更新时间:2024-03-16 14:56