当前位置: 首页 > news >正文

Linux——GPIO输入输出裸机实验

学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习,现在进行一下小结:

启动文件start.S的编写

.global _start
.global _bss_start
_bss_start:.word __bss_start.global _bss_end
_bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/mrs r0, cpsr           /*读取cpsr到r0*/bic r0, r0, #0x1f      /*清除cpsr的bit4-0*/orr r0, r0, #0x13      /*使用SVC模式*/msr cpsr, r0           /*将r0写入到cpsr*//*清除bss段*/ldr r0, =_bss_startldr r1, =_bss_endmov r2, #0
bss_loop:stmia r0!, {r2}cmp r0, r1ble bss_loop/*设置sp指针*/ldr sp, =0x80200000b main                 /*跳转到C语言main函数*/

.global指令用于定义全局变量

 .word指令定义了两个符号 _bss_start_bss_end,它们都初始化为对应的符号 __bss_start__bss_end 的地址(在后面讲到的链接脚本文件imx6u.lds中有为这两个符号赋值地址)。这些符号通常用于标识程序中BSS段的开始和结束。

BSS段(Block Started by Symbol)是程序数据段的一部分,用于存储未初始化的全局变量和静态变量。在程序启动时,BSS段会被清零,并且其大小会被计算到程序的总内存占用中,尽管它在磁盘上的表示可能非常小或甚至没有。

程序启动会先从启动文件开始执行,默认从_start处开始执行。

Makefile编写

通过make指令可以执行目录下的Makefile文件,我们可以在Makefile文件里编写编译过程的一系列指令,方便开发。 

Makefile文件以及相应的注释如下:

#变量赋值,?=如果前面已经有赋值,则用前面的,没有就用等号后面的
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET		  ?= beepCC            	:= $(CROSS_COMPILE)gcc
LD            	:= $(CROSS_COMPILE)ld
OBJCOPY       	:= $(CROSS_COMPILE)objcopy
OBJDUMP       	:= $(CROSS_COMPILE)objdump
#保存头文件所在目录的变量
# \ 表示本行和下一行属于同一行。为换行符
INCUDIRS	  	:=  project \imx6u \bsp/clk \bsp/led \bsp/delay \bsp/beep#保存源文件所在目录的变量				
SRCDIRS	  	  	:=  project \bsp/clk \bsp/led \bsp/delay \bsp/beep#将变量INCUDIRS里的值都加上-I前缀
#加-I是以为makefile语法指定头文件目录时候前面要加-I
#patsubst语法:在INCUDIRS中所有的单词前加上-I,因为%为通配符
INCLUDE			:=	$(patsubst %,-I%,$(INCUDIRS))
#foreach作用是将SRCDIRS变量的值赋值给dir然后执行最后的表达式wildcard,
#wildcard的作用是将dir目录下的所有.S文件(前面带着目录)都存入SFILES变量
SFILES			:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
#notdir作用是删除SFILES变量的目录成分,只留文件名
SFILENDIR		:=  $(notdir $(SFILES))
CFILENDIR		:=  $(notdir $(CFILES))
#将没有目录的SFILENDIR的值都加上obj/前缀,并将.S.c替换成.o
SOBJS			:=	$(patsubst %.S,obj/%.o,$(SFILENDIR))
COBJS           :=  $(patsubst %.c,obj/%.o,$(CFILENDIR))
#保存所有的.o文件
OBJS			:=  $(SOBJS) $(COBJS)
#如果当前目录找不到目标文件和依赖文件,就到指定的路径去找
VPATH			:=  $(SRCDIRS)
#伪目标
.PHONY:clean
# 目标文件 : 依赖文件
#-T后面接链接脚本
#-o 指定输出文件名
#$^表示所有的依赖文件,指令的作用是链接所有的依赖文件成可执行文件.elf
#-O表示指定输出的格式为纯二进制文件
#-S表示剥除符号表和重定义表,无调试信息
#$@表示目标文件
#-D表示输出汇编文件 -m表示指定目标架构arm
#>是shell中的重定向操作符,将输出文件重定向到文件.dis
$(TARGET).bin : $(OBJS)$(LD) -Timx6u.lds -o $(TARGET).elf $^$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis#-Wall表示显示警告信息
#-nostdlib表示在链接时不使用标准库
#-c表示只进行编译和汇编,不进行链接
#$@表示目标文件  $<表示规则中的第一个依赖文件
$(SOBJS) : obj/%.o : %.S$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
#清除编译生成的各种文件
clean:rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).dis $(OBJS)
#打印编译过程生成的变量
print:@echo INCLUDE = $(INCLUDE)@echo SFILES  = $(SFILES)@echo CFILES  = $(CFILES)	@echo SFILENDIR  = $(SFILENDIR)@echo CFILENDIR  = $(CFILENDIR)	@echo SOBJS  = $(SOBJS)@echo COBJS  = $(COBJS)	@echo OBJS  = $(OBJS)	

链接脚本imx6u.lds

SECTIONS{. = 0x87800000;.text :{obj/start.o*(.text)}.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4) : {*(.data)}__bss_start=.;.bss ALIGN(4) : {*(.bss) *(COMMON)}__bss_end=.;
}

链接脚本的主要作用有定义链接起始地址、调整链接顺序(第一个要连接的文件必须是start.o)

.为定位计数器,默认定位计数器为0,给这个特殊符号赋值0x87800000,后面的链接起始地址就会是0x87800000

代码段可以分为text段、只读数据段、数据段和BSS段'

ALIGN(4)的作用是4字节对齐

BSS段(Block Started by Symbol)是程序数据段的一部分,用于存储未初始化的全局变量和静态变量。在程序启动时,BSS段会被清零,并且其大小会被计算到程序的总内存占用中,尽管它在磁盘上的表示可能非常小或甚至没有

GPIO输入输出配置的库函数

配置复用功能函数

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);

上面示例中的 IOMUXC_GPIO1_IO03_GPIO1_IO03是一个宏定义,如下:

上面的操作是我们通过传递参数,将对应模式的值放到我们的寄存器地址。也就是将0x5写到0x020E0068为地址的寄存器里,查看参考手册

就是向我们这个寄存器写入0x5,将其复用为GPIO1_IO03

 配置电气属性函数

IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0x10B0);

与我们的复用功能函数类似,也是通过传入参数到我们相关的配置寄存器地址中,如下:

为地址为0x020E02F4的配置寄存器写入0x10b0

通过查看参考手册进行对应的电气属性配置

写入0x10B0是配置为输出模式

写入0xF080是配置为输入模式,上拉,使能迟滞比较器

 GPIO寄存器组

 通过结构体指针操作寄存器组,进而配置GPIO为输入还是输出模式,1为输出模式。0为输入模式

相关文章:

Linux——GPIO输入输出裸机实验

学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习&#xff0c;现在进行一下小结&#xff1a; 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…...

华为鸿蒙HarmonyOS NEXT升级HiCar:打造未来出行新体验

随着科技的不断进步&#xff0c;智能出行已成为我们生活中不可或缺的一部分。华为凭借其在智能科技领域的深厚积累&#xff0c;推出了全新的鸿蒙HarmonyOS NEXT系统&#xff0c;旨在为用户打造一个“人车家”的无缝协同出行体验。这一系统的核心亮点之一&#xff0c;就是其内置…...

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …...

计算机23级数据结构上机实验(第3-4周)

A 二叉树删除子树 编写程序对给定二叉树执行若干次删除子树操作&#xff0c;输出每次删除子树后剩余二叉树的中根序列。二叉树结点的数据域值为不等于0的整数。每次删除操作是在上一次删除操作后剩下的二叉树上执行。 输入格式: 输入第1行为一组用空格间隔的整数&#xff0c;表…...

【大数据学习 | HBASE高级】region split机制和策略

1. region split机制 ​ HRegionServer拆分region的步骤是&#xff0c;先将该region下线&#xff0c;然后拆分&#xff0c;将其子region加入到hbase:meta表中&#xff0c;再将他们加入到原本的HRegionServer中&#xff0c;最后汇报Master。 split前&#xff1a;hbase:meta表有…...

flink实战 -- flink SQL 实现列转行

在 SQL 任务里面经常会遇到一列转多行的需求,下面就来总结一下在 Flink SQL 里面如何实现列转行的,先来看下面的一个具体案例. 需求 原始数据格式如下: namedatatest[{"content_type":"flink","url":"111"},{"content_type&quo…...

React中右击出现自定弹窗

前言 在react中点击右键,完成阻止浏览器的默认行为,完成自定义的悬浮框(Menu菜单). 版本 "react": "^18.2.0", "umijs/route-utils": "^4.0.1", "antd": "^5.18.1", "ant-design/pro-components": &q…...

Unity类银河战士恶魔城学习总结(P128 Switch UI with KeyBoard用键盘切换UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了用键盘切换角色UI&#xff0c;技能树UI&#xff0c;合成面板UI和设置UI UI.cs 1. 变量与字段 characterUI&#xff0c;skill…...

基于Springboot+微信小程序的急救常识学习系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...

【云计算解决方案面试整理】3-7主流云计算平台、云计算架构、安全防护

准备面云计算解决方案的岗位,整理了一些,也请大佬们指点。 文档分为 云计算基础概念、云计算技术原理、主流云计算平台(以天翼云为例)、云计算架构(弹性设计、高可用设计、高性能设计)、安全防护几个方面。 三、主流云计算平台 1.阿里云云计算平台 强大的计算能力:拥有…...

数据库范式、MySQL 架构、算法与树的深入解析

一、数据库范式 在数据库设计中&#xff0c;范式是一系列规则&#xff0c;用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计&#xff0c;数据可能会以平铺式罗列&#xff0c;仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…...

设计模式之责任链模式(Chain Of Responsibility)

一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链 传递请求&#xff0c;直到有一个对…...

SQLite 全文检索:快速高效的文本查询方案

文章目录 什么是全文检索&#xff1f;如何启用 FTS&#xff1f;插入数据执行全文检索关联原始表与 FTS 表数据更新结论 说明: 本文以博客内容全文检索为例。 什么是全文检索&#xff1f; 全文检索是指对文本数据进行索引和查询的一种技术。与常规的 LIKE 查询不同&#xff0c…...

【微信小程序】报修管理

一、报修管理 报修管理是为方便业主联系维修师傅的一个服务&#xff0c;业主确认需要维修的房到后&#xff0c;再指定维修项目以及上门的时间待待师傅联系上门服务即可。 1.1 在线报修 业主通过在线的方式填写报修的信息&#xff0c;包括房屋信息、维修项目、联系电话、上门…...

C++——视频问题总结

1、C和C的区别 CC面向过程对象注重程序的实现逻辑程序的整体设计内容C语言采用了一种有序的编程方法——结构化编程&#xff1a;将一个大型程序分解为一个个小型的&#xff0c;易于编写的模块&#xff0c;所有模块有序调动&#xff0c;形成了一个程序的完整的运行链C将问题分解…...

Ubuntu24.04 network:0 unclaimed wireless adapter no found

前言&#xff1a; 所遇问题原因在于&#xff0c;折腾显卡cuda版本&#xff0c;导致nvidia驱动没了&#xff0c;使用sudo ubuntu-drivers autoinstall后&#xff0c;驱动有了&#xff0c;但是reboot后无线网卡无法识别&#xff0c;此外usb无线网络也无法使用&#xff0c;ifconfi…...

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中&#xff0c;使用MyBatis-Plus通过创建的实体类对数据库的操作过程中&#xff0c;通过实体创建数据库表是没有问题的&#xff0c;而在接口调用服务类操作数据库的时候&#xff0c;会出现报错。报错详情如下&#xff1a; 服务请求异…...

深入浅出 ChatGPT 底层原理:Transformer

Transformer 在人工智能和自然语言处理领域,Transformer架构的出现无疑是一个里程碑式的突破。它不仅推动了GPT(Generative Pre-trained Transformer)等大型语言模型的发展,还彻底改变了我们处理和理解自然语言的方式。 GPT与Transformer GPT 近几年&#xff0c;人工智能技…...

opc da 服务器数据 转 IEC61850项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 用IEC61850协议转发数据 7 网关使用多个逻辑设备和逻辑节点的方法 8 在服务器上运行仰科OPC DA采集软件 9 案例总结 1 案例说明 在OPC DA服务器上运行OPC …...

SystemVerilog学习笔记(十一):接口

在Verilog中&#xff0c;模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构&#xff0c;它封装了模块之间的通信。一个 inter…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...