一步步点亮LED

本文从硬件工作原理、查阅原理图和数据手册开始,详细讲解如何使用汇编语言通过GPIO控制LED的点亮、熄灭、闪烁及流水灯效果。涉及GPIO概念、寄存器操作、位运算应用以及延时函数编写,逐步解析编程控制硬件的思路和方法。
摘要由CSDN通过智能技术生成

1 硬件工作原理及原理图查阅

1.1 LED物理特性介绍

LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给它的正负极上加正电压即可,要熄灭一颗LED只需要去掉电压即可。

1.2 查阅原理图了解板载LED硬件接法

查阅原理图,发现开发板上一共有4颗LED。这4颗LED的接法是:正极接3.3V,负极接了SoC上的一个引脚(GPIO),具体详细接法是:
D22:GPJ0_3
D23:GPJ0_4
D24:GPJ0_5
D25:PWMTOUT1(GPD0_1)

这里写图片描述

1.3 分析如何点亮及熄灭LED(GPIO)

分析:LED点亮的要求是:正极和负极之间有正向电压差。

思考:在开发板上如何为LED制造这个电压差让它点亮呢?

解答:因为正极已经定了(3.3V),而负极接在了SoC的引脚上,可以通过SoC中编程来控制负极的电压值,因此我们可以通过程序控制负极输出低电平(0V),这样在正负极上就有了压差,LED即可点亮。

2 数据手册查阅及相关寄存器浏览

2.1 GPIO概念的引入

GPIO:general purpose input output 通用输入输出。

GPIO就是芯片的引脚(芯片上的引脚有些不是GPIO,只有一部分是),作为GPIO的这类引脚,他的功能和特点是可以被编程控制它的工作模式,也可以编程控制他的电压高低等。

通过之前的分析我们知道,我们设计电路时就把LED接在了一个GPIO上,这样我们就可以通过编程控制GPIO的模式和输入输出值来操控LED亮还是灭;如果你当时设计电路时把LED接在非GPIO上那就不可能了。

2.2 阅读数据手册中有关部分

当我们想要通过编程操控GPIO来操作LED时,我们首先需要通读一下S5PV210的数据手册中有关于GPIO的部分,这部分在数据手册的Section2.2中。

2.3 GPIO相关的寄存器介绍

回忆下之前说过的,软件操作硬件的接口是:寄存器。

我们当前要操作的硬件是LED,但是LED实际是通过GPIO来间接控制的,所以当前我们实际要操作的设备其实是SoC的GPIO。要操作这些GPIO,必须通过设置他们的寄存器。

查阅数据手册可知,GPJ0相关的寄存器有以下:

  • GPJ0CON, (GPJ0 control)GPJ0控制寄存器,用来配置各引脚的工作模式
  • GPJ0DAT, (GPJ0 data)当引脚配置为input/output模式时,寄存器的相应位和引脚的电平高低相对应。
  • GPJ0PUD, (pull up down)控制引脚内部弱上拉、下拉
  • GPJ0DRV, (driver)配置GPIO引脚的驱动能力
  • GPJ0CONPDN,(记得是低功耗模式下的控制寄存器)
  • GPJ0PUDPDN (记得是低功耗模式下的上下拉寄存器)

    注:在驱动LED点亮时,应该将GPIO配置为output模式。

实际上真正操控LED的硬件,主要的有:GPJ0CON, GPJ0DAT 这么2个。
如何点亮LED,编程的步骤是:
1、操控GPJ0CON寄存器中,选中output模式
2、操控GPJ0DAT寄存器,相应的位设置为0

3 从零开始手写汇编点亮LED

3.1 GPxCON、GPxDAT寄存器分析

GPJ0端口一共有8个引脚,分别记住:GPJ0_0 ~ GPJ0_7,相关重要寄存器就是GPJ0CON和GPJ0DAT。

GPJ0CON寄存器中设置8个引脚的工作模式(32/8=4,每个引脚可以分到4位,譬如GPJ0_0对应的bit位为bit0~bit3,GPJ0_3对应的位为bit12~bit15。工作方法是:给相应的寄存器位写入相应的值,该引脚硬件就会按照相应的模式去工作。譬如给bit12~bit15写入0b0001,GPJ0_3引脚就成为输出模式了)

3.2 从零开始写代码操作寄存器

需要哪些先决条件才能写呢?
1. 硬件接法和引脚:GPJ0_3 GPJ0_4 GPJ0_5 低电平亮/高电平灭
2. GPJ0CON(0xE0200240)寄存器和GPJ0DAT(0xE0200244)寄存器
3. 工程管理:Makefile等

根据以上分析,我们就知道代码的写法了,代码所要完成的动作就是:把相应的配置数据写入相应的寄存器即可。

// makefile
led.bin: led.o 
    arm-linux-ld -Ttext 0x0 -o led.elf $^
    arm-linux-objcopy -O binary led.elf led.bin
    arm-linux-objdump -D led.elf > led_elf.dis
    gcc mkv210_image.c -o mkx210
    ./mkx210 led.bin 210.bin

%.o : %.S
    arm-linux-gcc -o $@ $< 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值