• LED——S5PV210的LED的理论与操作


    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

    一、LED物理特性介绍

    LED本身有2个接线点,一个是LED的正极,一个是LED的负极。

    LED的功能就是亮或者不亮,只需要给LED的正极加电压即可点亮LED,去掉电压则熄灭。

    二、X210开发板的LED硬件接法

    查阅原理图,发现开发板上一共有5颗LED:D22、D23、D24、D25、D26。

    其中D26的正极接5V,负极接地,因此这颗LED只要上电就会常亮,分析得知这颗LED是电源指示灯。 

    剩下4颗LED的正极接3.3V,负极接了SoC上的一个引脚(GPIO),具体接法是:

    D22:GPJ0_3

    D23:GPJ0_4

    D24:GPJ0_5

    D25:PWMTOUT1(GPD0_1)  

    因为D22~D25的正极已经接了3.3V,而负极接在SoC的引脚上,因此可以通过SoC中编程来控制负极的电压值。只要负极输出低电平,这样在正负极上就会有电压差,LED即可点亮。

    三、S5PV210的GPIO相关的寄存器

    1、GPIO的含义

    GPIO是“general purpose input output”的缩写,中文意思是“通用输入输出”。

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

    通过之前的分析可知,X210开发板在设计电路时把LED接在了GPIO上,这样一来就可以通过编程控制GPIO的模式和输入输出值来操控LED的亮灭。如果把LED接在非GPIO上那就不行。

    2、GPIO相关的寄存器

    要操作GPIO,必须设置它们的寄存器,关于GPIO的部分,在数据手册的Section2.2中。

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

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

    这里重点地说明两个主要的寄存器:GPJ0CON和GPJ0DAT。

    (1)GPJ0CON寄存器

    由寄存器的内容可知,GPJ0CON寄存器每4bit控制一个GPIO引脚,比如bit[31:28]控制GPJ0_7这个GPIO。

    (1)GPJ0DAT寄存器

    由寄存器的内容可知,当端口被配置成输入输出模式时,GPJ0DAT寄存器bit0~bit7对应着输入或者输出的值。

    三、编程实践

    1、实践一之点亮LED灯

    第一步,操控GPJ0CON寄存器中,选中output模式。

    第二步,操控GPJ0DAT寄存器,相应的位设置为0。

    代码如下所示,这个实验是点亮D22、D23、D24这三个LED灯。

    1. _start:
    2. // 第一步:把0x11111111写入0xE0200240(GPJ0CON)位置
    3. ldr r0, =0x11111111
    4. ldr r1, =0xE0200240
    5. str r0, [r1]
    6. // 第二步:把0x0写入0xE0200244(GPJ0DAT)位置
    7. ldr r0, =0x0
    8. ldr r1, =0xE0200244
    9. str r0, [r1] // 把0写入到GPJ0DAT寄存器中,则引脚即输出低电平,LED点亮
    10. // 下面两行写了一个死循环。因为裸机程序是直接在CPU上运行的,CPU会
    11. // 逐行运行裸机程序直到CPU断电关机。如果我们的程序所有的代码都
    12. // 执行完了CPU就会跑飞(跑飞以后是未定义的,所以千万不能让CPU
    13. // 跑飞),不让CPU跑飞的办法就是在我们整个程序执行完后添加死循环
    14. flag:
    15. b flag

    2、实践二之LED灯闪烁

    代码如下所示。

    1. #define GPJ0CON 0xE0200240
    2. #define GPJ0DAT 0xE0200244
    3. .global _start // 把_start链接属性改为外部,这样其他文件就可以看见_start了
    4. _start:
    5. // 第一步:把所有引脚都设置为输出模式,代码不变
    6. ldr r0, =0x1111111// 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断
    7. ldr r1, =GPJ0CON// 这个数是合法立即数还是非法立即数。一般写代码都用ldr伪指令
    8. str r0, [r1]// 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去
    9. flash:
    10. // 第二步:全部点亮
    11. ldr r0, =((0<<3) | (0<<4) | (0<<5)) // 清清楚楚的看到哪个灭,哪个是亮
    12. ldr r1, =GPJ0DAT
    13. str r0, [r1] // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
    14. // 第三步:延时
    15. bl delay // 使用bl进行函数调用
    16. // 第四步:全部熄灭
    17. ldr r0, =((1<<3) | (1<<4) | (1<<5)) // 清清楚楚的看到哪个灭,哪个是亮
    18. ldr r1, =GPJ0DAT
    19. str r0, [r1]
    20. // 第五步:延时
    21. bl delay
    22. b flash
    23. // 延时函数:函数名:delay
    24. delay:
    25. ldr r2, =9000000
    26. ldr r3, =0x0
    27. delay_loop:
    28. sub r2, r2, #1 //r2 = r2 -1
    29. cmp r2, r3 // cmp会影响Z标志位,如果r2等于r3则Z=1,
    30. bne delay_loop //bne是不相等则跳转
    31. mov pc, lr // 函数调用返回

    3、实践三之LED流水灯

    代码如下所示。

    1. #define GPJ0CON 0xE0200240
    2. #define GPJ0DAT 0xE0200244
    3. .global _start
    4. _start:
    5. // 第一步:把所有引脚都设置为输出模式,代码不变
    6. ldr r0, =0x11111111
    7. ldr r1, =GPJ0CON
    8. str r0, [r1]
    9. // 要实现流水灯,只要在主循环中实现1圈的流水显示效果即可
    10. flash:
    11. // 第1步:点亮LED1,其他熄灭
    12. //ldr r0, =((0<<3) | (1<<4) | (1<<5))
    13. ldr r0, =~(1<<3)
    14. ldr r1, =GPJ0DAT
    15. str r0, [r1]
    16. // 然后延时
    17. bl delay // 使用bl进行函数调用
    18. // 第2步:点亮LED2,其他熄灭
    19. ldr r0, =~(1<<4)
    20. ldr r1, =GPJ0DAT
    21. str r0, [r1]
    22. // 然后延时
    23. bl delay // 使用bl进行函数调用
    24. // 第3步:点亮LED3,其他熄灭
    25. ldr r0, =~(1<<5)
    26. ldr r1, =GPJ0DAT
    27. str r0, [r1]
    28. // 然后延时
    29. bl delay // 使用bl进行函数调用
    30. b flash
    31. // 延时函数:函数名:delay
    32. delay:
    33. ldr r2, =9000000
    34. ldr r3, =0x0
    35. delay_loop:
    36. sub r2, r2, #1 //r2 = r2 -1
    37. cmp r2, r3 // cmp会影响Z标志位,如果r2等于r3则Z=1,不相等则Z=0
    38. bne delay_loop // bne指令判断Z是否等于0,Z等于0则执行delay_loop
    39. mov pc, lr // 函数调用返回
  • 相关阅读:
    inno Setup 打包Java exe可执行文件和MySQL数据库,无需额外配置实现一键傻瓜式安装
    【Elasticsearch】Elasticsearch命令行操作
    Promise解决异步
    7款最佳的图片编辑App
    2022年9月8号Java23设计模式学习(课时四)建造者模式
    Prometheus 采集snmp监控数据
    天龙八部刷马贼和反贼所有坐标
    (UE4升级UE5)Selected Level Actor节点升级到UE5
    OpenGL 坐标系统详解
    所见即所得的3D打印建模设计
  • 原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/126970576