您的位置 首页 硬件

ARM裸机开发bootloader—点亮LED灯

1、编写LED驱动的流程a、原理图分析b、芯片手册c、思维导图d、编写代码2、为什么要点亮led在嵌入式软件(bootloader、kernel)开发初期,由…

1、编写LED驱动的流程

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 resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr 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 fiqundefined_instruction:nopsoftware_interrupt:nopprefetch_abort:nopdata_abort:nopnot_used:nopirq:nopfiq:nopreset:bl set_peri_portbl set_svcbl disable_watchdogbl disable_interruptbl disable_mmubl light_ledset_peri_port:ldr r0, =0x70000000orr r0, r0, #0x13mcr p15,0,r0,c15,c2,4mov pc, lr	set_svc:mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr, r0mov pc, lr#define pWTCON 0x7E004000disable_watchdog:ldr r0, =pWTCON	/*mov的操作数最多为8位*/mov r1, #0x0str r1, [r0]mov pc, lrdisable_interrupt:mvn r1, #0x0ldr r0, =0x71200014str r1, [r0]ldr r0, =0x71300014str r1, [r0]mov pc, lrdisable_mmu:mcr p15, 0, r0, c7, c7, 0mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00000007mcr p15, 0, r0, c1, c0, 0mov pc, lr#define GPKCON0 0x7f008800#define GPKDAT 0x7f008808light_led:ldr r0, =GPKCON0ldr r1, =0x11110000str r1, [r0]ldr r0, =GPKDATldr r1, =0xa0str r1, [r0]mov pc, lr

运转今后,led会两亮两灭。从程序中咱们还会看到一个函数set_peri_port。这个函数是对外围设备基地址初始化。原因是arm11的内存与外围接口分开了,这个时分要用此函数把外围寄存器映射到内存中,整个的进程是经过CP15来完结的,也便是告知CPU外设寄存器的基地址和地址空间完成映射。

set_peri_port:ldr r0, =0x70000000orr r0, r0, #0x13mcr p15, 0, r0, c15, c2, 4

0x70000000是SROM的基地址,这段代码的功用便是告知cpu外围设备寄存器基地址为0x70000000,地址空间为256M(0x70000000-0x7fffffff)。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/265158.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部