lv11 嵌入式开发 GPIO实验 9

目录

1 简介

1.1 GPIO

2 LED实验步骤

2.1 通过电路原理图分析LED的控制逻辑        

2.2 通过电路原理图查找LED与Exynos4412的连接关系    

2.3 通过数据手册分析GPIO中哪些寄存器可以控制LED    

2.4 通过程序去操控对应的寄存器完成对LED的控制

2.4.1 使用寄存器写入命令STR,把控制寄存器和数据寄存器内写入值

2.4.2 使用编译

2.4.3 烧录

3 实现led亮灭翻转


1 简介

SOC概念,芯片厂商在做芯片的时候出了CPU之外还会集成很多外设。如三星4412,处理cpu外,还集成了许多硬件控制器。

1.1 GPIO

GPIO(General-purpose input/output)即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能

2 LED实验步骤

2.1 通过电路原理图分析LED的控制逻辑        

2.2 通过电路原理图查找LED与Exynos4412的连接关系    

2.3 通过数据手册分析GPIO中哪些寄存器可以控制LED    

通过阅读4412芯片手册分析GPIO寄存器,搜索原理图中的GPX2_7

分别查看到与GPX2相关的控制寄存器、数据寄存器、上下拉寄存器、驱动强度寄存器(与LED有关的主要是控制寄存器)

控制寄存器

把32位寄存器分成了不同的位,每个位负责控制引脚配置为不同的功能。 

0x0 = Input                      输入
0x1 = Output                   输出(LED选项此项)
0x2 = Reserved 
0x3 = KP_ROW[7]          键盘
0x4 = Reserved
0x5 = ALV_DBG[19]        模拟
0x6 to 0xE = Reserved
0xF = WAKEUP_INT2[7] 唤醒
数据寄存器

也是32位寄存器,只用了[7:0] 

  • R(Read):表示将端口配置为输入(input)端口,可以读取(read)该端口的状态或值。
  • W(Write):表示将端口配置为输出(output)端口,可以写入(write)一个特定的状态或值到该端口。
  • X(Undefined):表示将端口配置为功能引脚(functional pin),并且读取(read)该端口时将会获得未定义(undefined)的值。

上拉下拉寄存器

在嵌入式系统中,上拉和下拉寄存器通常用于配置微控制器的引脚。当引脚被配置为输入模式时,上拉或下拉寄存器决定了引脚的默认电平状态。在输出模式下,上拉和下拉功能通常不会被使用。

  • 上拉:当引脚被配置为输入模式并且没有外部连接时,上拉寄存器会使得引脚的电平保持高电平状态。
  • 下拉:当引脚被配置为输入模式并且没有外部连接时,下拉寄存器会使得引脚的电平保持低电平状态。

一般而言,在将引脚配置为输入模式时,需要根据具体的硬件平台和需求来选择是否启用上拉或下拉。如果希望引脚在空闲时保持稳定的状态,可以启用上拉或下拉以确保引脚的默认状态。

驱动寄存器

通常,DRV寄存器的位数与系统中IO端口的数量相对应。每个位表示一个IO端口,可以设置为不同的驱动能力级别,例如低、中、高等级。

通过调整DRV寄存器中各个位的设置,可以控制每个IO端口的驱动能力,以满足特定的电流和电压要求。这样可以确保与外部设备或其他系统组件的连接质量和稳定性。

我们原理图中有三极管,这个寄存器也不需要使用到。

2.4 通过程序去操控对应的寄存器完成对LED的控制

2.4.1 使用寄存器写入命令STR,把控制寄存器和数据寄存器内写入值

led-asm.s

.text
_start:LED_CONFIG:LDR R2, =0x11000c40LDR R1, =0x10000000STR R1, [R2]LED_OFF:LDR R2, =0x11000c44LDR R1, =0x00000000STR R1, [R2]STOP:B STOP.end

2.4.2 使用编译

直接编译会报错:

gcc编译过程分为四个步骤:

1.预处理(Pre-Processing)    gcc -E

2.编译(Compiling)                gcc -S

3.汇编(Assembling)              gcc -c  (我们只需要从这里开始就可以)

4.链接(Linking)                     gcc (生产可执行文件.elf)

写一个MakeFile

TARGET = led-asm
CROSS_COMPILE = arm-none-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopyall:$(CC) -c $(TARGET).s -o $(TARGET).o$(LD) $(TARGET).o -Ttext 0x40008000 -o $(TARGET).elf$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).binclean:rm $(TARGET).o $(TARGET).elf $(TARGET).bin

Makefile详见 

https://blog.csdn.net/m0_60718520/article/details/127218677 

arm-none-linux-gnueabi-ld

常被用于交叉编译,即在一个系统上编译生成另一个不同体系结构的目标文件。由于 ARM 架构通常用于嵌入式设备和移动设备等场景,因此 arm-none-linux-gnueabi 工具链也经常被用于嵌入式和移动应用的开发。

需要注意的是,arm-none-linux-gnueabi-ld 并不直接编译源代码,而是用于链接目标文件。在 Linux 下进行 ARM 应用程序开发时,通常需要使用交叉编译器来编译和生成 ARM 架构的目标文件,然后再使用 arm-none-linux-gnueabi-ld 进行链接。

-Ttest 

在 Linux 编译中,使用 -Ttext 选项可以指定链接器脚本中代码段(text segment)的起始地址。在你提到的例子中,-Ttext 0x40008000 将代码段的起始地址设置为 0x40008000。

这个选项通常用于嵌入式系统或者一些特定的应用场景,例如需要将程序加载到特定的内存地址上执行。如果你有这样的需求,可以在编译时通过 -Ttext 选项来指定代码段的起始地址。但是在一般的应用开发中,并不需要手动指定代码段的起始地址,因为链接器会为你处理好这些细节

arm-none-linux-gnueabi-objcopy

这个命令是使用 GNU objcopy 工具将目标文件转换为二进制文件

((TARGET).elf)转换为二进制文件((TARGET).bin)。这个命令的参数含义如下:

  • -O binary:指定输出格式为二进制。
  • -S:在复制过程中去除调试符号,减小二进制文件的大小。
  • $(TARGET).elf:输入的目标文件。
  • $(TARGET).bin:输出的二进制文件。

使用 objcopy 工具可以将可执行文件或目标文件转换为不同的格式,包括二进制、Intel Hex、Motorola S-record 等。在这个命令中,选择了二进制格式作为输出。

这个命令通常用于在嵌入式系统中,将生成的可执行文件转换为可以直接加载到目标设备上运行的二进制文件。转换后的二进制文件可以通过各种方式进行烧录或传输到目标设备上。

请注意,在运行这个命令之前,先确保已经编译生成了目标文件($(TARGET).elf)作为输入。

把bin文件放到共享目录。

2.4.3 烧录

打开SecureCRT,连接串口115200

开发板上电3秒内按回车输入命令行

输入命令loadb 0x40008000

传输文件

输入命令 go 0x40008000跳转至内存其实位置执行程序,LED灯便会从亮变灭

3 实现led亮灭翻转

led-asm.s

.text
_start:MAIN:BL LED_CONFIG
LOOP:              @循环BL LED_ONBL DELAYBL LED_OFFBL DELAYB  LOOPLED_CONFIG:        @配置控制寄存器LDR R2, =0x11000c40LDR R1, =0x10000000STR R1, [R2]MOV PC, LRLED_ON:            @数据寄存器输出高电平LDR R2, =0x11000c44LDR R1, =0x00000080STR R1, [R2]MOV PC, LRLED_OFF:           @数据寄存器输出低电平LDR R2, =0x11000c44LDR R1, =0x00000000STR R1, [R2]MOV PC, LRDELAY:LDR R1, =100000000  @主频1000Mhz,因为三级流水线及其他跳转因素相当于一秒钟闪烁2、3次
L:SUB R1, R1, #1CMP R1, #0BNE L          @ 不等于0一直循环MOV PC, LRSTOP:B STOP.end

实现了led亮灭的功能

编译烧录参考2.4.2与2.4.3

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

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

相关文章

过渡曲线的构造之平面PH曲线

平面PH曲线的构造及其相应性质 平面PH曲线的构造及其相应性质PH曲线理论三次PH曲线的构造及性质四次PH曲线的构造及性质五次PH曲线的构造及性质非尖点五次PH曲线尖点五次PH曲线 参考文献 平面PH曲线的构造及其相应性质 过渡曲线常需要满足在连接点处位置连续、曲率连续以及切线…

韵达快递查询,韵达快递单号查询,一键筛选出单号中的退回件

批量查询韵达快递单号的物流信息,并将其中的退回件一键筛选出来。 所需工具: 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,第一次使用的朋友记得先注册&#xff…

鸿蒙(HarmonyOS)应用开发——装饰器

简介 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,扩展了声明式UI、状态管理等相应的能力,让开发者可以以更简洁、更自然的方式开发高性能应用。TS是JavaScript(简称JS)的超…

MySQL 库操作 | 表操作

文章目录 一.MySQL库的操作1.创建数据库2.字符集和校验规则3.操纵数据库 二.MySQL表的操作1.创建表2.操作表3.删除表 一.MySQL库的操作 1.创建数据库 创建数据库 创建数据库的SQL如下: CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name…

一篇文章完成Hbase入门

文章目录 一、简介1、数据模型结构2、物理存储结构3、数据模型4、基本架构 二、安装1、下载解压安装包2、修改配置文件3、启动服务(单机、集群)4、配置高可用(HA) 三、命令行操作1、建表2、新增/更新数据3、查看表数据4、删除数据5、修改默认保存的数据版本 四、架构1、RegionS…

数据提取PDF SDK的对比推荐

PDF 已迅速成为跨各种平台共享和分发文档的首选格式,它作为一种数据来源,常见于公司的各种报告和报表中。为了能更好地分析、处理这些数据信息,我们需要检测和提取 PDF 中的数据,并将其转换为可用且有意义的格式。而数据提取的 PD…

物联网中基于信任的安全性调查研究:挑战与问题

A survey study on trust-based security in Internet of Things: Challenges and issues 文章目录 a b s t r a c t1. Introduction2. Related work3. IoT security from the one-stop dimension3.1. Output data related security3.1.1. Confidentiality3.1.2. Authenticity …

快速认识Linux的几个指令

我们先简单认识几个指令,为之后的指令学习打好基础 打开XShell并登录云服务器 01.pwd指令 pwd命令的作用是显示当前在Linux系统中所处的路径 02.ls指令 ls命令的作业是罗列出当前路径下的文件名(即pwd的路径下),由于我们没有新…

Docker Swarm总结+Jenkins安装配置与集成(4/4)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…

Python可迭代对象排序:深入排序算法与定制排序

更多Python学习内容:ipengtao.com 排序在计算机科学中是一项基础而关键的操作,而Python提供了强大的排序工具来满足不同场景下的排序需求。本文将深入探讨Python中对可迭代对象进行排序的方法,涵盖基础排序算法、sorted函数的应用、以及定制排…

【C++初阶】STL详解(八)List的模拟实现

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

【深度学习笔记】03 微积分与自动微分

03 微积分与自动微分 导数和微分导数解释的可视化偏导数梯度链式法则自动微分非标量变量的反向传播分离计算 导数和微分 假设我们有一个函数 f : R → R f: \mathbb{R} \rightarrow \mathbb{R} f:R→R,其输入和输出都是标量。 如果 f f f的导数存在,这个…

GIT版本控制和常用命令使用介绍

GIT版本控制和常用命令使用介绍 1. 版本控制1.1 历史背景1.2 什么是版本控制1.3 常见版本控制工具1.4 版本控制的分类 2 Git介绍2.1 Git 工作流程2.2 基本概念2.3 文件的四种状态2.4 忽略文件2.5 Git命令2.5.1 查看本地git配置命令2.5.2 远程库信息查看命令2.5.3 分支交互命令2…

WorkPlus即时通讯软件,以自主安全为底座,连接工作的一切

在当今竞争激烈的商业环境中,中大型企业对于移动办公平台的需求越来越迫切。在众多可选的平台中,WorkPlus凭借其高性价比和针对中大型企业的特色功能,成为了许多企业的首选。本文将为各位读者深度解析WorkPlus私有化部署的优势,带…

学习.NET验证模块FluentValidation的基本用法(续2:其它常见用法)

FluentValidation模块支持调用When和Unless函数设置验证规则的执行条件,其中when函数设置的是满足条件时执行,而Unless函数则是满足条件时不执行,这两个函数的使用示例如及效果如下所示: public AppInfoalidator() {RuleFor(x>…

Mysql 解决Invalid default value for ‘created_at‘

在mysql版本 8.0 和 5.* 之间数据互导的过程中,老是会出现各种错误,比如 这个created_at 一定要有一个默认值, 但是我加了 default null 还是会报错,于是对照了其他的DDL 发现,需要再加 null default null 才行&#…

从0开始学习JavaScript--JavaScript事件:响应与交互

JavaScript的事件处理是Web开发中至关重要的一部分,通过事件,能够实现用户与页面的互动,使得网页更加生动和交互性。本文将深入探讨JavaScript事件的各个方面,包括事件的基本概念、事件类型、事件对象、事件冒泡与捕获、事件委托、…

如何看待 2023 OPPO 开发者大会?潘塔纳尔进展如何?AndesGPT 有哪些亮点?

在2023年11月16日举行的OPPO开发者大会(ODC23)上,OPPO带来了全新ColorOS 14、全新互联网服务生态以及健康服务进展,这些新动态中有许多值得关注的地方。 1、全新ColorOS 14: 效率提升:ColorOS 14通过一系列…

虚拟机可ping树莓派树莓派无法ping虚拟机 的解决办法

问题描述 在学习交叉编译的过程中,发现了树莓派无法ping通虚拟机的问题。所以我尝试了各种ping,发现: 虚拟机可以ping通树莓派和主机树莓派可以ping通主机主机可以ping通树莓派和虚拟机唯独树莓派没法ping通虚拟机 尝试各种方法后找到一种…

Qt手写ListView

创建视图: QHBoxLayout* pHLay new QHBoxLayout(this);m_pLeftTree new QTreeView(this);m_pLeftTree->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑m_pLeftTree->setFixedWidth(300);创建模型和模型项: m_pLeftTree…