首页 > 其他 > 详细

ARM裸机开发—点亮LED灯

时间:2014-02-28 12:41:14      阅读:569      评论:0      收藏:0      [点我收藏+]

1、编写LED驱动的流程

a、原理图分析

b、芯片手册

c、思维导图

d、编写代码

2、为什么要点亮led

在嵌入式软件(bootloader、kernel)开发初期,由于串口等硬件尚未进行初始化,所以可以用来调试的手段很有限。这时通常运用点亮led作为调试的重要手段。也就是说不断改动led点亮程序的位置,来查看那段代码出现了问题,然后进行针对性的修改。

下面我用6410为例进行点亮led的介绍,其他的如2440和210流程相似。

a、原理图分析

bubuko.com,布布扣

bubuko.com,布布扣

从led的原理图我们可以看到,nLED_*低电平有效,也就是对应的s3c6410GPK4-7低电平,这个时候要引出一个概念:GPIO

什么是GPIO

GPIO(General-Purpose Input/Output Ports):通用的输入/输出端口。在嵌入式系统中,cpu需要控制一些结构简单的外部设备,它们通常只用两种状态(开/关)。如果用串口或USB去控制就显得复杂了些,所以在嵌入式微处理器上就引入了一种“通用可编程I/O端口”,也就是GPIO。

一个GPIO端口至少需要两个寄存器,一个是“控制寄存器”,用于选择端口作为输入还是输出。另一个是存放数据的“数据寄存器”。

b、查看芯片手册

在6410手册上查找GPK端口


bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣


查看到手册我们得知,将相应的数据填入相应的内存地址就可以了。

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, 4
0x70000000是SROM的基地址,这段代码的功能就是告诉cpu外围设备寄存器基地址为0x70000000,地址空间为256M(0x70000000-0x7fffffff)。

ARM裸机开发—点亮LED灯,布布扣,bubuko.com

ARM裸机开发—点亮LED灯

原文:http://blog.csdn.net/renren900207/article/details/20034087

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!