你的位置:首页 > 操作系统

[操作系统]s5pv210学习之如何一步步点亮LED回顾


 

如何一步步点亮LED

 

注:实验是基于s5pv210的板子,这篇笔记参考自《朱老师物联网大讲堂》朱老师随堂笔记

文中提到的手册下载链接:(https://yunpan.cn/OcSz7Yh35ISJK7  访问密码 6665;https://yunpan.cn/OcSz7SzsfS7a6p  访问密码 180f)

  想要点亮LED,首先就得知道LED为什么会被点亮。那么就先来了解一下LED的一些物理特性:LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗LED只需要去掉电压即可。

  那么现在开始一步步去达到点亮LED的目的。

  想要点亮板子上的LED等,那么就需要去查阅硬件手册(X210BV3),找到LED所对应的原理图如下:

 

 

  通过查找到的内容我们可以得到的信息如下:

    D26是电源指示灯,因为一端接5V电压,一端接地,只要一上电,这颗LED就会亮;

    其余四颗LED的正极是确定的,所以如果我们想要这四颗LED亮,我们能做的就只能在负极上做文章,让正负极之间形成电压差,从而点亮,那么怎么去控制负极的电压,后面会一步步到那里去,所以耐心的往后看

    其余的四颗LED可以得到他们负极分别所对应的引脚号是多少:

      D22 -> GPJ0_3

      D23 -> GPJ0_4

      D24 -> GPJ0_5

      D25 -> PWMTOUT1(GPD0_1,怎么得到的这个引脚号呢,通过PWMTOUT1这个名字去核心板的手册<x210cv3.pdf>查找所对应的引脚)

 

    当进行到这一步,你可能会有一些疑问,为什么要去找每颗LED对应的引脚号呢?查找到对应的引脚号又有什么用呢?

    那么针对这些个问题,我们需要在了解了下面的知识后才能知道为什么?

    1.我们是想通过写程序去控制LED亮或者不亮,那么我们为什么可以通过程序去控制硬件?

      <1>编写程序去控制硬件的关键就是寄存器

      <2>那么什么是寄存器?

      寄存器分为通用寄存器和特殊功能寄存器,我在这里讲的寄存器是特殊功能寄存器(SFR:special function register)

        *寄存器属于CPU外设的硬件组成部分

        *CPU可以像访问内存一样访问寄存器

        *寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”

        *正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。

 

  关于寄存器就说到这里,那么接下来我想描述的就是与寄存器有关一个内部外设--GPIO(general purpose input/output):通用输入输出。在这里,我们可以把GPIO理解成芯片上的引脚,当然,芯片上有很多引脚,不是所有的引脚都是GPIO,只有一部分是。作为GPIO的这类引脚,他的特点就是可以通过编程去控制它的工作模式,也可以变成控制它的电压高低

 

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

  所以了解到了这里,应该就明白我们为什么要去查找每颗LED所对应的引脚号了。因为LED的正极的电压是3.3V(这个可以通过手册知道),而LED的负极是接在GPIO上的,所以我们想要点亮LED,我们就得去控制GPIO的工作模式输出,并且输出一个低电压,从而让正负极形成电压差,LED就被点亮,而我们想要去控制GPIO的工作模式和输出电压的高低,那就需要去通过寄存器,也就 是特殊功能寄存器,通过对寄存器的值的配置从而达到对GPIO的设定。

   那么我们既然知道了想要控制LED,由于LED的负极接在GPIO上,是输入还是输出,是高电压还是低电压是GPIO说了算,所以我们需要去控制GPIO,而想要控制GPIO,又需要通过寄存器去配置寄存器中的相关值,从而达到对GPIO的控制,达到对LED的控制。

   所以到此,我们需要做的就是去修改寄存器当中的值,那么怎么去修改寄存器当中的值?这肯定不能说想怎么改就这么改,得去查数据手册,因为这些都是人家设计者在设计时就确定好了的,所以我们需要去查数据手册作为参考,按设计者提供的信息去做相应的修改,才能达到最终想要的结果。

现在开始查阅数据手册(S5PV210_UM_REV1.1.pdf)  

  打开数据手册,找到section 02_system下的2 GENERAL PURPOSE INPUT/ OUTPUT下的2.2.20  PORT GROUP GPJ0 CONTROL REGISTER 。因为我们接的引脚是GPJ0的是3、4、5.(当然还有一个接GPD0的就不说了,都是一样的原理和查法)。所以就得找到GPJ0所对应的寄存器,我们通过目录找到关于GPJ0对应寄存器的信息地方,我们可以看到

 

 

 

 

  在这里我只截取了GPJ0CON、GPJ0DAT,的相关内容,因为点亮LED只需要这两个寄存器就可以实现,其他的暂时没有去了解

查阅数据手册可知,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个。

通过这样查找过后,我提取出这样一些需要的信息:

***GPJ0CON的地址:Address = 0xE0200240(因为s5pv210是I/O与内存统一编址,我想操作寄存器可以像访问地址一样通过地址去访问寄存器,去读写)

0001 = intput(如果想要让对应的引脚为输出模式,就需要把对应的引脚的位配置成 0001)所以我们编程序,需要把GPJ0_3,GPJ0_4,GPJ0_5对应的寄存器的对应位设置成0001,其他的位就不用管。

***关于GPJ0DAT寄存器我们可以得到的信息是:

GPJ0DAT,的地址:Address = 0xE0200240;【When the port is configured as input port, the corresponding bit is the pin state. When the port is configured as output port,the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefined value will be read.(翻 译:把端口作为输入端口配置时,对应的比特为引脚状态,把端口作为输出端口配置时,引脚状态和对应的比特相同,端口作为功能型引脚配置时,可读出未定义值。)】

这段话是什么意思呢,意思就是如果想要让GPJ0_3的引脚输出高电压,那么GPJ0DAT对应的比特位(有0~7位)的bit 3就要配置为1.如果想要让GPJ0_3的引脚输出低电压,那么GPJ0DAT对应的比特位(有0~7位)的bit 3就要配置为0.   GPJ0DAT中的0~7八个比特位分别对应GPJ0CON中的0~7个端口。

 

当了解完这些过后,我就可以真正的开始写程序去实现点亮LED等了

 

_start:

//首先需要把对应的端口配置为输出模式,所以我们需要把bit12~bit23 配置0001 //0001 0001

ldr r0, =0x11111111 //给r0写入一个值,这个值的作用是把相应的位置1

ldr r1, = 0xE0200240 //把寄存器地址写入r0中

str r0 ,[r1] //把GPJ0_3、GPJ0_4、GPJ0_5配置成输出模式

 

//当配置好引脚的模式后,接下来需要做的就是通过GPJ0DAT寄存器让引脚输出低 //电压

ldr r0, =(1 << 3) | (1<<4) | (1<<5) //给r0写入一个值,这个值的作用是把相应的位置1

ldr r1, = 0xE0200244 //把寄存器地址写入r0中

str r0 ,[r1]

 

b . //最后写的跳转指令是个死循环,为了防止cpu跑飞

 

当这个程序经过一系列的编译链接后,最后会得到一个bin文件,将这个bin文件通过usb启动,有dnw软件将这个文件下载到开发板里,当cpu工作的时候,就会读取代码,最终会看到LED被成功点亮