• GPIO和LED


    1.1、LED物理特性介绍
    LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗LED只需要去掉电压即可。
    1.2、查阅原理图了解板载LED硬件接法
    查阅原理图,发现开发板上一共有5颗LED。其中一颗D26的接法是:正极接5V,负极接地。因此这颗LED只要上电就会常亮。因此我们分析这颗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.0、一步步点亮LED2_数据手册查阅及相关寄存器浏览
    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.0、一步步点亮LED3_从零开始手写汇编点亮LED
    3.1、GPxCON、GPxDAT寄存器分析
    GPJ0端口一共有8个引脚,分别记住:GPJ0_0 ~ GPJ0_7,相关重要寄存器就是GPJ0CON和GPJ0DAT
    GPJ0CON寄存器中设置8个引脚的工作模式(32/8=4,每个引脚可以分到4位,譬如GPJ0_0对应的bit位为bit0bit3,GPJ0_3对应的位为bit12bit15。工作方法是:给相应的寄存器位写入相应的值,该引脚硬件就会按照相应的模式去工作。譬如给bit12~bit15写入0b0001,GPJ0_3引脚就成为输出模式了)
    3.2、从零开始写代码操作寄存器
    需要哪些先决条件才能写呢?
    1. 硬件接法和引脚:GPJ0_3 GPJ0_4 GPJ0_5 低电平亮/高电平灭
    2. GPJ0CON(0xE0200240)寄存器和GPJ0DAT(0xE0200244)寄存器
    3. 工程管理:Makefile等
    根据以上分析,我们就知道代码的写法了,代码所要完成的动作就是:
    把相应的配置数据写入相应的寄存器即可。
    3.3、编译、下载、运行看结果
    编译时用我们的工程管理,直接make编译得到led.bin和210.bin
    下载运行可以用usb启动dnw下载;也可以用sd卡烧录下载,根据自己的情况用
    一般都用usb下载,因为方便。如果电脑主板插上dnw会死机没法解决,那只有sd卡下载启动了。
    注意:开发板上按下电源键之后4颗LED默认都是半亮的,当我们下载程序后其中3颗变的很亮,这说明我们的程序已经运行了。
    3.4、总结和回顾(软件控制硬件思想、寄存器意义、原理图数据手册的作用)
    软件到底是怎么控制硬件的?为什么程序一运行硬件就能跟着动?
    软件编程控制硬件的接口就是:寄存器

    4.0、一步步点亮LED4_使用位运算实现复杂点亮要求
    上节回顾:代码写的更漂亮一些
    1. 用宏定义来定义寄存器名字,再来操作。
    2. 用 b . 来实现死循环
    3. 用.global把_start链接属性改为外部,消除链接时的警告
    4.1、问题提出:如何只点亮中间1颗(两边是熄灭的)LED
    分析:程序其实就是写了GPJ0CON和GPJ0DAT这2个寄存器而已,功能更改也要从这里下手。
    GPJ0CON寄存器不需要修改,GPJ0DAT中设置相应的输出值即可。
    4.2、直接解法(不使用位运算)和它的弊端
    GPJ0DAT = 0x28
    代码见<3.led_s>
    总结:1. 这样写可以完成任务。
    2. 这样写有缺陷。缺陷就是需要人为的去计算这个特定的设置值,而且看代码的也不容易看懂。
    解决方案:在写代码时用位运算去让编译器帮我们计算这个特定值。
    4.3、常用位运算:与、或、非、移位
    位与(&) 位或(|) 位非(取反 ~) 移位(左移<< 右移>>)
    4.4、使用位运算实现功能
    1<<3 等于 0b1000
    1<<5 等于 0b100000
    (1<<3)|(1<<5) 等于 0b101000

    5.0一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
    5.1、闪烁效果原理分析
    闪烁 = 亮 + 延时 + 灭 + 延时 + 亮 + 延时 ······
    5.2、延时函数原理
    在汇编中实现延时的方法:用一些没有目的的代码来执行消耗时间,达到延时的效果。
    5.3、汇编编写延时函数
    汇编编写延时函数的原理,用一个寄存器存放一个数字,然后在循环中每个循环里给数字减1,然后再判断这个数字的值是否为0.如果为0则停止循环,如果不为0则继续循环。
    5.4、汇编编写及调用函数的方式
    汇编中整个汇编的主程序是一个死循环,这个死循环是我们汇编程序的主体,类似于C中的main函数。其他函数必须写在这个主死循环程序的后面(死循环外),不然会出错。
    汇编编写delay延时函数时,要注意函数的初始化和函数体的位置,不能把初始化写在了循环体内。
    汇编中调用函数用bl指令,子函数中最后用mov pc, lr来返回。

    6.0一步步点亮LED6_再难一点的流水灯效果
    6.1、流水灯原理分析
    流水灯又叫跑马灯,实现的效果就是:挨着的LED一次点亮熄灭(同时只有1颗LED亮的)
    6.2、流水灯编写(使用循环)
    LED1亮延时 + LED2亮延时 + LED3亮延时 + 循环
    6.3、复杂点的实现
    用位取反操作符来轻松愉快的实现单颗LED点亮流水效果
    6.4、总结:一步步写,根本不难
    从一步一步点亮LED1开始到6,写了8个示例代码,一步步的实现了更复杂的效果,其间夹杂使用了位运算来给LED赋值,以实现想要的点亮效果。如果按部就班实际上非常简单。
    编程操控一个硬件的步骤:1 分析硬件工作原理 2 分析原理图 3 分析数据手册 4 找到相关的SFR 5 写代码设置寄存器得到想要的效果

  • 相关阅读:
    c++的正则库 pcre
    http://alibench.com
    常用正则表达式,来自新浪微博的js
    mysql的反向
    字母汉子组合的验证码,包括实现看不清换一个的功能
    什么是Ajax
    做“时间日志”
    计划比目标还要重要!
    成功座右铭一
    建立组织
  • 原文地址:https://www.cnblogs.com/hyxk/p/14535264.html
Copyright © 2020-2023  润新知