一、一步步点亮LED1_硬件工作原理及原理图查阅

1、LED物理特性介绍

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

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)

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

分析:LED点亮的要求是:正极和负极之间有正向电压差。
思考:在开发板上如何为LED制造这个电压差让它点亮呢?
解答:因为正极已经定了(3.3V),而负极接在了SoC的引脚上,可以通过SoC中编程来控制负极的电压值,因此我们可以通过程序控制负极输出低电平(0V),这样在正负极上就有了压差,LED即可点亮。

4、一步步点亮LED2_数据手册查阅及相关寄存器浏览

1、GPIO概念的引入
GPIO : general purpose input output 通用输入输出
GPIO就是芯片的引脚(芯片上的引脚有些不是GPIO,只有一部分是),作为GPIO的这类引脚,他的功能和特点是可以被编程控制它的工作模式,也可以编程控制他的电压高低等。
通过之前的分析我们知道,我们设计电路时就把LED接在了一个GPIO上,这样我们就可以通过编程控制GPIO的模式和输入输出值来操控LED亮还是灭;如果你当时设计电路时把LED接在非GPIO上那就不可能了。

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

3、GPIO相关的寄存器介绍
回忆下之前说过的,软件操作硬件的接口是:寄存器。
我们当前要操作的硬件是LED,但是LED实际是通过GPIO来间接控制的,所以当前我们实际要操作的设备其实是SoC的GPIO。要操作这些GPIO,必须通过设置他们的寄存器。
查阅数据手册可知,GPJ0相关的寄存器有以下:
GPJ0CON, (GPJ0 control)GPJ0控制寄存器,用来配置各引脚的工作模式
GPJ0DAT, (GPJ0 data)当引脚配置为input/output模式时,寄存器的相应位和引脚的电平高低相对应。
(控制LED主要是前面两个寄存器)
GPJ0PUD, (pull up down)控制引脚内部弱上拉、下拉
GPJ0DRV, (driver)配置GPIO引脚的驱动能力
GPJ0CONPDN,(记得是低功耗模式下的控制寄存器)
GPJ0PUDPDN (记得是低功耗模式下的上下拉寄存器)
注:在驱动LED点亮时,应该将GPIO配置为output模式。
实际上真正操控LED的硬件,主要的有:GPJ0CON, GPJ0DAT 这么2个。

如何点亮LED,编程的步骤是:
1、操控GPJ0CON寄存器中,选中output模式
2、操控GPJ0DAT寄存器,相应的位设置为0(bit0~7)

5、一步步点亮LED3_从零开始手写汇编点亮LED

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写入0x0001,GPJ0_3引脚就成为输出模式了)

2、从零开始写代码操作寄存器
需要哪些先决条件才能写呢?
1. 硬件接法和引脚:GPJ0_3 GPJ0_4 GPJ0_5 低电平亮/高电平灭
2. GPJ0CON(0xE0200240)寄存器和GPJ0DAT(0xE0200244)寄存器
3. 工程管理:Makefile等
根据以上分析,我们就知道代码的写法了,代码所要完成的动作就是:
把相应的配置数据写入相应的寄存器即可。
用汇编控制GPIO实现LED的流水灯
代码演示:

/** 文件名:  led.s   * 作者:    朱老师* 描述: 流水灯*/#define GPJ0CON    0xE0200240
#define GPJ0DAT 0xE0200244.global _start                    // 把_start链接属性改为外部,这样其他文件就可以看见_start了
_start:// 第一步:把所有引脚都设置为输出模式,代码不变ldr r0, =0x11111111          // 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数ldr r1, =GPJ0CON            // 是合法立即数还是非法立即数。一般写代码都用ldr伪指令str r0, [r1]              // 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去// 要实现流水灯,只要在主循环中实现1圈的流水显示效果即可
flash:// 第1步:点亮LED1,其他熄灭//ldr r0, =((0<<3) | (1<<4) | (1<<5))  // 清清楚楚的看到哪个灭,哪个是亮ldr r0, =~(1<<3)ldr r1, =GPJ0DATstr r0, [r1]               // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮// 然后延时bl delay                 // 使用bl进行函数调用// 第2步:点亮LED2,其他熄灭   ldr r0, =~(1<<4)ldr r1, =GPJ0DATstr r0, [r1]                // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮// 然后延时bl delay                 // 使用bl进行函数调用// 第3步:点亮LED3,其他熄灭   ldr r0, =~(1<<5)ldr r1, =GPJ0DATstr r0, [r1]                // 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮// 然后延时bl delay                 // 使用bl进行函数调用b flash// 延时函数:函数名:delay
delay:ldr r2, =9000000ldr r3, =0x0
delay_loop: sub r2, r2, #1              //r2 = r2 -1cmp r2, r3                 // cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立bne delay_loopmov pc, lr                    // lr寄存器的值放到PC寄存器里,进行函数调用返回

Makefile:

led.bin: led.o arm-linux-ld -Ttext 0x0 -o led.elf $^arm-linux-objcopy -O binary led.elf led.binarm-linux-objdump -D led.elf > led_elf.disgcc mkv210_image.c -o mkx210./mkx210 led.bin 210.bin%.o : %.Sarm-linux-gcc -o $@ $< -c%.o : %.carm-linux-gcc -o $@ $< -c clean:rm *.o *.elf *.bin *.dis mkx210 -f

3、编译、下载、运行看结果
编译时用我们的工程管理,直接make编译得到led.bin和210.bin
下载运行可以用usb启动dnw下载;也可以用sd卡烧录下载,根据自己的情况用
一般都用usb下载,因为方便。如果电脑主板插上dnw会死机没法解决,那只有sd卡下载启动了。
注意:开发板上按下电源键之后4颗LED默认都是半亮的,当我们下载程序后其中3颗变的很亮,这说明我们的程序已经运行了。

4、总结和回顾(软件控制硬件思想、寄存器意义、原理图数据手册的作用)
软件到底是怎么控制硬件的?为什么程序一运行硬件就能跟着动?
软件编程控制硬件的接口就是:寄存器

6、反汇编工具objdump的使用简介

1、反汇编的原理&为什么要反汇编
arm-linux-objdump -D led.elf > led_elf.dis
objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码
-D表示反汇编 > 左边的是elf的可执行程序(反汇编时的原材料),>右边的是反汇编生成的反汇编程序

反汇编的原因有以下:
(1)逆向破解。
(2)调试程序时,反汇编代码可以帮助我们理解程序(我们学习时使用objdump主要目的是这个),尤其是在理解链接脚本、链接地址等概念时。
(3)把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。

2、反汇编文件的格式和看法
(汇编 assembly 反汇编 dissembly)
标号地址、标号名字、指令地址、指令机器码、指令机器码反汇编到的指令
扩展:ARM汇编中用地址池方式来实现非法立即数

3、初识指令地址
下载烧录执行的bin文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是连接的时候ld给指定的(ld根据我们写的链接脚本来指定)

4、展望:反汇编工具帮助我们分析链接脚本
反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址。
但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。

本文是根据朱有鹏的《ARM裸机全集》的视频笔记整理而得。

ARM裸机的知识总结(4) ------- 利用GPIO控制LED相关推荐

  1. 从ARM裸机看驱动之按键中断方式控制LED(二)

    硬件环境:Samsung Cortex-A9 Exynos4412 BSP 软件环境:Linux3.14 =============================================== ...

  2. 从ARM裸机看驱动之按键中断方式控制LED(一)

    硬件环境:Samsung Cortex-A9 Exynos4412 BSP + JTAG ARM 仿真器 软件环境:Eclipse ================================== ...

  3. K210应用2-使用GPIO控制LED状态

    使用gpio控制led 实验目的 本次主要应用K210最基础的功能,了解FPIOA引脚映射,以及GPIO设置.该节验证方式为通过控制LED的亮灭来进行验证. 实验准备 1).带发光二极管(LED)的K ...

  4. keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)

    [朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...

  5. Java 通过GPIO控制LED灯的亮灭(一)

    Java 通过GPIO控制LED灯的亮灭(Firefly-RK3399)(一) Note: 为Android 开发,开发工具AndroidStudio 什么是 GPIO ,(General-purpo ...

  6. 树莓派GPIO控制LED彩灯

    树莓派使用GPIO接口来控制LED灯,自制五彩炫光的节日彩灯. 1.硬件准备 a. 树莓派(Raspberry Pi)一个 b. 彩色RGB二极管 c. 杜邦线 d. 5V电源引脚 以上所有零件均可在 ...

  7. arm裸机【4】 --- 一步步点亮LED(一)

    目录 1. 一步步点亮LED1_硬件工作原理及原理图查阅 2.数据手册查阅及相关寄存器浏览 3.从零开始手写汇编点亮LED a.GPxCON.GPxDAT寄存器分析 b.从零开始写代码操作寄存器 c. ...

  8. Linux——Linux驱动之设备树下platform总线驱动编写实战(手把手教你设备树下platform总线利用GPIO控制蜂鸣器完整实现过程)

    [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战>

  9. CC2530利用中断控制LED

    #include<ioCC2530.h> #define led P1_4 #define key P1_1           /*           *延时函数           ...

最新文章

  1. 浅谈单图像三维重建算法
  2. sklearn中的分类决策树
  3. 【2020任燕翔-考研专业院校选择指南】【计算机考研——针对教材、攻略】
  4. hibernate基础之无法自动创建表总结
  5. AGC044E Pandom Pawn(期望+凸包)
  6. 如何交付机器学习项目:一份机器学习工程开发流程指南
  7. matlab 判断两个矩阵有元素相等_Matlab入门教程 第 1 章 Matlab基础知识之基本运算...
  8. java 多个timer_java – Timer正在创建多个计时器实例
  9. php中%3c w() %3e,DedeCMS V5.7 SP2后台存在代码执行漏洞
  10. Win7 可以下载python最高什么版本?
  11. clustalw序列比对_CLUSTALW(muscle序列比对)
  12. Assimp库代码存档
  13. 如何在linux系统下的抓包文件保存在u盘里,在xp系统中打开,【Linux】Wireshark在Linux系统下的安装及使用...
  14. 麦考瑞大学计算机专业,麦考瑞大学计算机专业
  15. 网页三栏布局五种实现方式(左中右)
  16. 随机邻域嵌入_诠释数据降维算法:一文讲尽t-分布邻域嵌入算法(t-SNE)如何有效利用-阿里云开发者社区...
  17. bellman_ford算法 由边数限制的最短路
  18. 【附源码】计算机毕业设计SSM校园论坛
  19. STM32F4基础工程移植FreeRTOS
  20. JAVA 取余 余数

热门文章

  1. html 图片点击查看,Html点击实现图片预览和查看原图
  2. 如何少花钱又过好日子(转载)
  3. android局域网udp视频对讲,Android基于UDP语音对讲系列(一)
  4. NVIDIA CUDA初级教程(P11)CUDA程序基本优化
  5. tornado模板引擎原理
  6. golang采集淘宝产品详情信息 解决禾匠小程序 采集淘宝失效的问题
  7. ggplot2箱线图的美化之路: 箱线图到直方图加散点图再加误差线的美化之路
  8. python123九宫格输入法_【带你成为pyq最靓的仔】朋友圈九宫格(一)之图片切割篇...
  9. 科普一下 IT 行业各种备份术语
  10. 计算机不支持win10 1809更新,win10更新版本1809后,完全关闭系统自动更新方法,亲测可行...