福建建设监理网站,南通丰汇建设有限公司公司网站,iis网站伪静态网站,wordpress导航页面样式1、点亮LED
1.1、硬件工作原理及原理图查阅
1.1.1、LED物理特性 LED本身有2个接线点#xff0c;一个是LED的正极#xff0c;一个是LED的负极。LED这个硬件的功能就是点亮或者不亮#xff0c;物理上想要点亮一颗LED只需要给他的正负极上加正电压即可#xff0c;要熄灭一颗…1、点亮LED
1.1、硬件工作原理及原理图查阅
1.1.1、LED物理特性 LED本身有2个接线点一个是LED的正极一个是LED的负极。LED这个硬件的功能就是点亮或者不亮物理上想要点亮一颗LED只需要给他的正负极上加正电压即可要熄灭一颗LED只需要去掉电压即可。
1.1.2、查阅原理图了解板载LED硬件接法 平面端是正极尖角端是负极 4颗LED的接法是:正极接VDD_IO(3.3V)负极接了SoC上的一个引脚 (GPIO)具体详细接法是 D22: GPJO_3 D23GPJO_4 D24GPJO_5 D25PWMTOUT1(GPDO_1)
1.1.3、分析如何点亮及熄灭LEDGPIO 分析LED点亮的要求是正极和负极之间有正向电压差。 思考在开发板上如何为LED制造这个电压差让它点亮呢? 解答因为正极已经定了(3.3V)而负极接在了SoC的引脚上可以通过SoC中编程来控制负极的电压值因此我们可以通过程序控制负极输出低电平 (0V)这样在正负极上就有了压差LED即可点亮。
1.2、数据手册查阅及相关寄存器浏览
1.2.1、GPIO概念的引入 GPIOgeneral purpose input output 通用输入输出 GPIO就是芯片的引脚芯片上的引脚有些不是GPIO只有一部分是作为GPIO的这类引脚它的功能和特点是可以被编程控制它的工作模式也可以通过编程控制他的电压高低等。 通过之前的分析我们知道我们设计电路时就把LED接在了一个GPIO上这样我们就可以通过编程控制GPIO的模式和输入输出值来操控LED亮还是灭如果你当时设计电路时把LED接在非GPIO上那就不可能了。
1.2.2、阅读数据手册中有关部分 当我们想要通过编程操控GPIO来操作LED时我们首先需要通读一下S5PV210的数据手册中有关于GPIO的部分这部分在数据手册的Section2.2中。
1.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的硬件主要的有GPJ0CONGPJ0DAT 这么2个。 如何点亮LED编程的步骤是
1控制GPJ0CON寄存器中选中output模式
2操控GPJ0DAT寄存器相应的位设置为0
1.2.4、GPJ0CONGPJ0DAT寄存器分析 GPJ0端口一共有8个引脚分别记为GPJ0_0~GPJ0_7,相关重要寄存器就是GPJ0CON和GPJ0DAT。 GPJ0CON寄存器中设置8个引脚的工作模式 (32/8-4每个引脚可以分到4位例如GPJO 对应的bit位为bit0~bit3GPJ0_3对应的位为bit12~bit15。工作方法是给相应的寄存器位写入相应的值该引脚硬件就会按照相应的模式去工作。例如给bit12~bit15写入0b0001GPJ0_3引脚就成为输出模式了)
1.3、从零开始写代码操作寄存器
1.3.1、先决条件 1硬件接法和引脚GPJ0_3、GPJ0_4、GPJ0_5 2GPJ0CON0xE0200240寄存器和GPJ0DAT0xE0200244寄存器 3工程管理makefile等
1.3.2、编译、下载、运行看结果 编译时用工程管理直接make编译得到led.bin通过usb下载和210.bin通过sd卡下载 下载运行可以用usb启动dnw下载也可以用SD卡烧录下载一般都用usb下载方便 注意裸机启动地址0xd0020010原理看之前说的
1.4、使用位运算实现复杂点亮要求 让代码看的更漂亮一点 1用宏定义来定义寄存器名字再来操作。 2将之前的死循环语句改为
b . //.在汇编中代表当前这一句指令的地址这个就是高大上的死循环 3用.global把_start链接属性改为外部消除链接时的警告
1.4.1、如何只点亮之间一颗LED 程序其实就是写了GPJ0CON和GPJ0DAT这两个寄存器而已共呢个更改也要从这里入手。GPJ0CON寄存器不需要修改GPJ0DAT中设置相应的输出值即可。
1.4.1.1、直接解法不使用位运算 GPJ0DAT 0x28 代码见3.leds_s
总结 1这样写可以完成任务 2这样写有缺陷。缺陷就是需要人为的去计算这个特定的设置值而且看代码的也不容易懂。
解决方案 在写代码时用位运算去让编译器帮我们计算这个特定值。
1.4.1.2、使用位运算实现功能
常用位运算与、或、非、移位 位与、位或|、位非取反~、移位左移 右移 13 等于0b1000 15 等于0b100000 (13) | (15) 等于0b00101000
1.5、汇编编写延时函数并实现LED闪烁效果
1.5.1、闪烁效果原理分析 闪烁 亮 延时 灭 延时 亮 延时、、、、、、
1.5.2、延时函数原理 在汇编中实现延时的方法用一些没有目的的代码来执行消耗时间达到延时的效果。
1.5.3、汇编编写延时函数 汇编编写延时函数的原理用一个寄存器存放一个数字然后在循环中每个循环里给数字减1然后再判断这个数字的值是否为0。如果为0则停止循环如果不为0则继续循环。
1.5.4、汇编编写及调用函数的方式 汇编中整个汇编的主程序是一个死循环这个死循环是我们汇编程序的主体类似于C中的main函数。 其他函数必须写在这个主死循环程序的后面(死循环外)不然会出错。 汇编编写delay延时函数时要注意函数的厨师换和函数体的位置不能把初始化写在了循环体内。 汇编中调用函数用bl指令子函数中最后用mov pclr来返回。
1.6、实现流水灯效果
1.6.1、流水灯原理分析 流水灯又叫跑马灯实现的效果就是挨着的LED一次点亮熄灭同时只有1颗LED是亮的。
1.6.2、流水灯编写使用循环 LED1亮延时LED2亮延时 LED3亮延时循环
1.6.3、复杂点的实现 用位取反操作来轻松愉快的实现单颗LED点亮流水效果
1.7、总结 一步步写根本不难 从一步一步点亮LED1开始到6写了8个示例代码一步步的实现了更复杂的效果其间夹杂使用了位运算来给LED赋值以实现想要的点亮效果。如果按部就班实际上非常简单。编程操控一个硬件的步骤1、分析硬件工作原理 2、分析原理图 3 、分析数据册 4、 找到相关的SFR 5、写代码设置寄存器得到想要的效果
2、反汇编工具objdump的使用简介
2.1、反汇编的原理 objdump是gcc工具链中的反汇编工具作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码。
arm-linux-objdump -D led.elf led_elf.dis
//-D 表示反汇编
//左边的是elf的可执行程序反汇编时的原材料右边的是反汇编生成的反汇编程序
2.2、为什么要反汇编 1逆向破解。 2调试程序时反汇编代码可以帮助我们理解程序学习时使用objdump主要目的是这个 尤其是在理解链接脚本、链接地址等概念时。 3把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。
2.3、反汇编文件的格式和看法 汇编assembly 反汇编dissembly 标号地址、标号名字、指令地址、指令机器码、指令机器码反汇编到的指令。 扩展ARM汇编中用地址池方式来实现非法立即数
2.4、初识指令地址 下载烧录执行的bin文件内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址这个地址是连接的时候ld给指定的 ld根据我们写的链接脚本来指定。
2.5、展望反汇编工具帮助我们分析链接脚本 反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址而我们写代码时通过指定链接脚本来让链接器给我们链接合适的地址。 但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样)这时候可以通过看反汇编文件来分析这个链接脚本的效果看是不是我们想要的如果不是可以改了再看。