深入理解LED开发过程

概述

不知道你是否想过,一个LED灯点亮过程的本质是什么。当你是一个小白的时候,点亮一个LED灯,IDE都会帮你做好所有的事情,你只需要点击一下编译即可。但是,当你成长到一定程度时,就需要好好想想,一个LED的点亮,其实是对单片机中背后原理机制真正的深入理解。今天我就带你,来深入理解一个LDE点亮的过程。

什么是SOC

想要深入理解LED灯的点亮,你就不得不先了解你LED所用的硬件设备了,尤其是控制它的大脑(微控制器)。一般,作为嵌入式开发者来说,使用的处理器不是一个简简单单的CPU,而是一颗SOC级别的芯片。

SOC实物图
在这里插入图片描述

SOC架构简图
在这里插入图片描述
所以当你要操作GPIO、IIC、SPI、UART等的时候,其实只要根据手册配置相应的寄存器即可。当你可以很好的理解这个概念之后,你就可以根据厂家提供的各种技术手册操纵一切芯片厂家在设计芯片时所提供的功能。这就是,为什么会有很多公司会要求你具有看手册的能力,因为你在设计相关功能与解bug的时候,很多时候都需要参照手册来。从另一方面来说,其实一颗芯片在你拿到手之后,基本就已经决定了你能够做出什么样的产品。更多的时间,你仅仅是参照手册与领导的要求,实现相应的任务而已。正如,现在只把相关硬件、对应的芯片手册和开发板的原理图给你,那么你应该怎样点亮一颗LED灯呢?

注: 我使用的微控制器(也可以说是一颗SOC)是2440

从无到有,点亮一颗LED

下面具体介绍一下,点亮一颗LED的完整过程。

1.明确任务,分析电路图

任务: 点亮LED(这个是硬件中最基本的任务,我就不介绍灯亮的原理了)
分析原理图: 找到你的开发板所对应的原理图,我的原理图LED如下(整套原理图链接):
在这里插入图片描述
从图中我们可以看出,我的开发板是支持三个LED的(这里我们先来点亮nLED1),之后需要查看,nLED1是微控制器的哪一个引脚来控制。如下图:
在这里插入图片描述
图中,可以看出,GPF4/EINT4来控制nLED1。这个时候,硬件我们就全部分析完毕。

我们通过编程需要控制微控制器的GPF4/EINT4引脚,从而来控制nLED1的亮灭。下面分析2440的芯片手册。

2.分析芯片手册

通过对硬件原理图的分析可知,我们需要配置GPF4引脚。如下图所示(芯片手册参考链接):
在这里插入图片描述
从图中可以看出,①需要通过GPFCCN(0x56000050)寄存器的[9:8]位配置GPF4引脚的属性(例如是输入还是输出),这里应该配置为输出,即[9:8]为01,因此GPFCCN(0x56000054)的值应该为0x100。②配置GPFDAT(0x56000054)的[4]位为0(打开)\1(关闭)。

至此,我们就分析完了打开一个LED微控制器所需要做的事情。下面我们开始实现。

3.编写点亮LED程序

(1)使用汇编怎样点亮LED

在以往的开发中,使用IDE打开一个LED等,都是直接调用别人封装好的函数,但是如果你要是在一个裸板上面仅仅依靠自己,应该怎样控制LED呢?
没错,就是编写汇编程序。
汇编代码:

/*
*
*点亮LED:GPIF4
*/
//固定格式
.text
.global _start

_start:
	

/*
*
*配置GPIF4为输出引脚
*把0x100写到地址0x56000050
*/
	ldr r1, =0x56000050
	mov r0, #0x100 /*ldr ro, = 0x100*/
	str r0, [r1]

/*
*设置GPF4输出高电平
*把0写到地址0x56000054
*/
	ldr r1, =0x56000054
	mov r0, #0x0 /*ldr ro, = 0x0*/
	str r0, [r1]

/*死循环*/

LOOP:
    B LOOP

.text 表示下面的语句都属于代码段
.global将本文件中的某个程序标号定义为全局的,比如上面的代码表示_start个全局函数

之后在Linux中使用gcc工具对该文件进行编译—>链接—>生成bin文件。下面是我使用的Makefile,可以参考一下。

all:
	arm-linux-gcc -c -o led_on.o led_on.S
	arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
	arm-linux-objcopy -O binary -S led_on.elf led_on.bin

clean:
	rm *.bin *.o *.elf

(2)使用C语言怎样点亮LED

在我们实际的开发过程中,为了提高开发的效率,我们应该怎样使用C语言来点亮一颗LED呢?

a. 首先需要分配内存的使用,由于LED的点亮,仅仅涉及到了局部变量,也就是仅初始化一个栈空间即可。因此我们先来创建一个start.S文件,使用汇编完成栈的初始化与调用main函数,代码如下:

.text

.global _start

_start:

	/*set stack storage local varible*/
	ldr sp, = 4096;//start nand flash
	//ldr sp, = 0x40000000 + 4096;start nor flash

	/*call main*/
	bl main


halt:

	b halt

b. 之后使用C语言来点亮我们的LED,代码如下:

int main()
{
    /*config GPF*/
    int* pGPFCON =  (unsigned int *)0x56000050;//int * pGPFCON = 0x56000050;and *pGPFCON = 0x100;
    *pGPFCON = 0X100;
    /*write data to control led on/off */
    int * pGPFDAT=  (unsigned int *)0x56000056;
    //*pGPFDAT = 0X10;   //close LED 
    *pGPFDAT = 0;		//open  LED
	
    return 0;
}

c. c代码编辑完成后,我们依然在Linux中使用gcc来进行变异,我使用的Makefile代码如下:

all:
	arm-linux-gcc -c -o led_on.o led_on.c
	echo "1"
	arm-linux-gcc -c -o start.o start.S
	echo "2"
	arm-linux-ld -Ttext 0 start.o led_on.o -o led_on.elf
	echo "3"
	arm-linux-objcopy -O binary -S led_on.elf led_on.bin
	echo "3"
	arm-linux-objdump -D led_on.elf > led_on.dis
	echo "4"
  
clean:
	rm *.bin *.o *.elf

4.烧写.bin到开发板

JATAG、Jlink、UART、USB下载,网口下载等方式烧写到开发板即可。
在这里插入图片描述

总结

编程的开发七分靠分析,三分靠编程。所以在接受一项任务时,首先需要明确目标,分析问题,最后才是编程实现。正如我们点亮一颗LED灯一样,如果你可以深入理解LED灯点亮过程,那么其他的也都是千篇一律而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值