ARM裸机-12(GPIO和LED)

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

        D23:GPJO_4

        D24:GPJO_5

        D25:PWMTOUT1(GPDO_1)

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

        分析:LED点亮的要求是:正极和负极之间有正向电压差。

        思考:在开发板上如何为LED制造这个电压差让它点亮呢?

        解答:因为正极已经定了(3.3V),而负极接在了SoC的引脚上,可以通过SoC中编程来控制负极的电压值,因此我们可以通过程序控制负极输出低电平 (0V),这样在正负极上就有了压差,LED即可点亮。

1.2、数据手册查阅及相关寄存器浏览

1.2.1、GPIO概念的引入

        GPIO:general 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的硬件,主要的有:GPJ0CON,GPJ0DAT 这么2个。

        如何点亮LED,编程的步骤是:

(1)控制GPJ0CON寄存器中,选中output模式

(2)操控GPJ0DAT寄存器,相应的位设置为0

1.2.4、GPJ0CON,GPJ0DAT寄存器分析

        GPJ0端口一共有8个引脚,分别记为:GPJ0_0~GPJ0_7,,相关重要寄存器就是GPJ0CON和GPJ0DAT。

        GPJ0CON寄存器中设置8个引脚的工作模式 (32/8-4,每个引脚可以分到4位,例如GPJO 对应的bit位为bit0~bit3,GPJ0_3对应的位为bit12~bit15。工作方法是:给相应的寄存器位写入相应的值,该引脚硬件就会按照相应的模式去工作。例如给bit12~bit15写入0b0001,GPJ0_3引脚就成为输出模式了)

1.3、从零开始写代码操作寄存器

1.3.1、先决条件

        (1)硬件接法和引脚:GPJ0_3、GPJ0_4、GPJ0_5

        (2)GPJ0CON(0xE0200240)寄存器和GPJ0DAT(0xE0200244)寄存器

        (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、使用位运算实现功能

常用位运算:与、或、非、移位

        位与(&)、位或(|)、位非(取反~)、移位(左移<<  右移>>)

        1<<3        等于0b1000

        1<<5        等于0b100000

        (1<<3) | (1<<5)        等于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 pc,lr来返回。

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、展望:反汇编工具帮助我们分析链接脚本

        反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定链接脚本来让链接器给我们链接合适的地址。

        但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。

        

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/19988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP 状态码的分类和含义

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;状态码是由服务器向客户端传输的 HTTP 响应中的一个三位数字代码。它们提供了关于请求的处理状态和结果的信息。以下是一些常见的 HTTP 状态码及其含义&#xff1a; 1xx 信息响应&#xff1a;指示服务器已收到请求&…

【linux-zabbix】zabbix-agent启动报错:Daemon never wrote its PID file. Failing.

背景&#xff1a; 发现有部分的agent失联&#xff0c;排查发现机器正常&#xff0c;agent没起来。 排查日志发现&#xff1a; # journalctl -xe -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit zabbix-agent.service has begun start…

自学安全卷不动,是放弃还是继续?

有天我想去搜一下怎么约女孩子看电影比较不油腻的时候&#xff0c;突然看到一个话题“自学网络安全的人都是什么感受”。 因为我的粉丝们大部分都是在自学或者是准备入行的大学生&#xff0c;所以我很认真一个一个去看了下别人的回答。基本都是劝退自学为主&#xff0c;因为自学…

智能化RFID耳机装配系统:提升效率、精准追踪与优化管理

智能化RFID耳机装配系统&#xff1a;提升效率、精准追踪与优化管理 在当今的智能化时代&#xff0c;无线射频识别技术&#xff08;RFID&#xff09;被广泛应用于各个行业。本文将介绍一种基于RFID技术的智能耳机装配案例&#xff0c;通过RFID技术实现耳机装配过程的自动化控制…

vue 新学习 04 css样式绑定,渲染,key的重要意义

之前的html文件如何去绑定css样式&#xff1f; 01.首先在html文件中&#xff0c;在<head>标签中&#xff0c;用<style>中去写样式&#xff0c;通过html标签(每一个标签都有这样子的属性)中的class或者是id属性来完成<style>中的描绘的样式的用。 例子&#x…

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循…

LeetCode题解:剑指 Offer 56 - I. 数组中数字出现的次数,哈希表,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/ 解题思路&#xff1a; 遍历nums&#xff0c;使用Set保存第一次遇到的数字。如果第二次遇到相同数字&#xff0c;将其从Set中删除。最终Set中只会留下2个数字&#xff0c;即…

操作系统启动后网络还需要比较慢的时间才启动(差不多二分钟)

环境 linux 4.14.61 systemd version 247.3 问题 启动时发现网络其实很快就起来了&#xff0c;但是mqtt和docker启动的很慢&#xff0c;导致相关依赖启动很慢。 问题分析 实际通过systemctl list-units发现systemd-networkd-wait-online启动失败 而且从字面上看也有延时…

数据结构和算法

数据结构和算法目录表 CCJava线性结构 1. 数组、单链表和双链表 2. Linux内核中双向链表的经典实现 数组、单链表和双链表 数组、单链表和双链表 栈 栈 栈 队列 队列 队列树形结构 二叉查找树 二叉查找树 二叉查找树 AVL树 AVL树 AVL树 伸展树 伸展树 伸展树 1. 红黑树(一)之…

图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

大家好&#xff0c;最近重新整理了一版 TCP 三次握手和四次挥手的面试题&#xff08;2023最新版&#xff09;。 ----- 任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 巨巨巨巨长的提纲&#xff0c;发车&#xff01;发车&#xff01; img TCP 基本认识 TCP 头格式有哪些…

chrony服务器

目录 1.chrony简介 2.chrony安装配置 2.1 chrony安装及配置 非常重要&#xff1a;在配置之前&#xff0c;检查防火墙和selinux是否关闭 3.将chrony配置为其他主机的时间服务器 3.1 修改chrony配置文件 4.chronyc命令 1.chrony简介 chrony 是开源的遵循网络时间协议&…

【Selenimu+AutoIT】非input标签上传文件(带参数)

工具下载 非input标签上传文件&#xff0c;就需要借助第三方工具&#xff0c;如AutoIT。 AutoIT下载 安装步骤略 使用 1.打开Auto Window Info 找到这个打开 拖住红框里面的标到需要定位的地方记录下来 2.打开SciTE Script Editor 打开后&#xff0c;修改为UTF-8&am…

统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)

统信UOS离线全套安装教程&#xff08;手把手教程&#xff09; 银河麒麟的各种离线全套安装教程&#xff1a; https://blog.csdn.net/ACCPluzhiqi/article/details/131988147 1.统信UOS桌面系统安装mysql&#xff08;mariadb&#xff09; 2.统信UOS桌面系统安装JDK 3.统信UOS桌…

【K210视觉模块】使用K210视觉模块,点击按键拍摄照片并保存到SD卡(每轮拍照数可调整)(实测可用)

上代码&#xff08;实测可用&#xff09; 1、原理&#xff1a; 为了确保每次拍摄的照片都具有唯一的编号&#xff0c;需要在保存照片之前找到已存在照片文件夹中最大的编号。我定义了一个名为fin_max_num()的函数来实现这个功能。该函数会遍历文件夹中的所有图片文件&#xff…

【iOS】App仿写--天气预报

文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报&#xff0c;特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页&#xff0c;搜索界面&#xff0c;添加界面&#xff0c;浏…

PostgreSQL-数据库命令

PostgreSQL-数据库命令 介绍 一个数据库是一个或多个模式的集合,而模式包含表、函数等。因此,完整的逻辑组织结构层次是服务器实例(PostgreSQL Server)、数据库(Database)、模式(Schema)、表(Table),以及某些其他对象(如函数)。一个PostgreSQL服务器实例可以管理…

【NLP概念源和流】 04-过度到RNN(第 4/20 部分)

接上文 【NLP概念源和流】 03-基于计数的嵌入,GloVe(第 3/20 部分) 一、说明 词嵌入使许多NLP任务有了显著的改进。它对单词原理图的理解以及将不同长度的文本表示为固定向量的能力使其在许多复杂的NLP任务中非常受欢迎。大多数机器学习算法可以直接应用于分类和回归任务的…

【vue】 vue2 监听滚动条滚动事件

代码 直接上代码&#xff0c;vue单文件 index.vue <template><div class"content" scroll"onScroll"><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/&#xff0c;下载对应CUDA版本的PyTorch【不能直接pip install&#xff0c;否则安装上的是CPU版本的】 2. 查看GPU信息 &#xff08;1&#xff09;重要信息 !nvidia-smi我的GPU版本很垃圾&#xff0c;本blog仅…