Linux学习笔记3-GPIO(1)

学习单片机时最开始也是从GPIO开始的,Linux的主芯片I.MX6UL124个GPIO,当然很多是复用的,与之对比,STM32F407系列的单片机GPIO口是112个。回顾之前单片机的学习,大部分的GPIO功能是通过HAL库函数调用的,例如HAL_GPIO_WritePin()HAL_GPIO_TogglePin()都是很方便的操作GPIO的库函数,编程者无需关心寄存器如何设置。那I.MX6UL有没有这种利器呢?答案是有的,NXP为这款主芯片开发了相应的库函数,可以在NXP的官网上下载SDK,有WIN版和LINUX版两种供选择,下载完之后安装,在安装文件夹下找到fsl_common.hfsl_iomuxc.hMCIMX6YH2.h,把这几个头文件复制到自己的工程文件夹里,就可以调用相关的库函数了。
我们还是从GPIO最简单的应用,点亮LED灯开始学习。由于GPIO的复用比较多,首先是选择复用哪个功能,使用IOMUXC_SetPinMux()这个函数,在fsl_iomuxc.h里可以看到函数定义,它一共有6个参数。

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t inputOnfield)
{*((volatile uint32_t *)muxRegister) =IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);if (inputRegister){*((volatile uint32_t *)inputRegister) = IOMUXC_SELECT_INPUT_DAISY(inputDaisy);}
}

实际用的时候,是这样的,IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0)。为什么6个参数变成了2个?因为在这个头文件里还定义了很多宏,这样来方便开发者调用,比如#define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U。通过这种调用开发者就不需要记寄存器啥的,很友好了。

同样在fsl_iomuxc.h里可以看到每个IO口的宏定义:

#define IOMUXC_GPIO1_IO03_I2C1_SDA                           0x020E0068U, 0x0U, 0x020E05A8U, 0x1U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_GPT1_COMPARE3                      0x020E0068U, 0x1U, 0x00000000U, 0x0U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_USB_OTG2_OC                        0x020E0068U, 0x2U, 0x020E0660U, 0x0U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_USDHC1_CD_B                        0x020E0068U, 0x4U, 0x020E0668U, 0x0U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_GPIO1_IO03                         0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_CCM_DI0_EXT_CLK                    0x020E0068U, 0x6U, 0x00000000U, 0x0U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_SRC_TESTER_ACK                     0x020E0068U, 0x7U, 0x00000000U, 0x0U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_UART1_RX                           0x020E0068U, 0x8U, 0x020E0624U, 0x1U, 0x020E02F4U
#define IOMUXC_GPIO1_IO03_UART1_TX                           0x020E0068U, 0x8U, 0x00000000U, 0x0U, 0x020E02F4U

可以看到GPIO1_IO03一共有9个复用功能,你要用哪个功能,选择这个功能的宏即可。

另外一个函数IOMUXC_SetPinConfig()的作用是设置GPIO口的IO属性,具体来看定义

static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t configValue)
{if (configRegister){*((volatile uint32_t *)configRegister) = configValue;}
}

可以看到前5个参数和IOMUXC_SetPinMux()是一模一样的,所以在使用时选择相应的宏即可。最后一个configValue参数就要看手册了,它其实就是设置GPIO的各种参数,例如上下拉、速度,还有一些和单片机不一样的参数,例如SRE(压摆率),代表从0到1需要多少时间,如果时间越小波形的斜率就越大,代表压摆率高,反之压摆率小。还有DSE,代表IO的驱动能力。这是我在chatgpt上问到的信息。

在 i.MX6UL 处理器中,DSE 代表的是 Drive Strength Field,即驱动强度字段。这是用来配置 GPIO 的一个参数,它控制输出驱动器的输出电流。不同的驱动强度设置可以影响 GPIO 引脚的输出电流和稳定性。

这个特性对我来说比较新,需要时间消化。
总之configValue对应的寄存器是IOMUXC_SW_MUX_CTL_PAD_GPIO1_IOXX(XX代表的是IO的号码),这是个32位寄存器,查询IMX6UL参考手册,可以看到这个寄存器的每位定义,它只有低17位有效,具体来看

16位HYS,使能迟滞比较器,当IO作为输入时有效,比较器的意思是即输入信号必须超过一个阈值才能将输出状态切换,并且在输入信号低于另一个较低的阈值时保持输出状态不变。0禁止,1使能
15-14位,上拉或下拉电阻设置,一共4种选择:00-100K欧的下拉;01-47K欧的上拉;10-100K欧的上拉;11-22K欧的上拉
13位:状态保持器,当IO作为输入时有效,为0时当外部电路断电以后此IO口可以保持住以前的状态,为1时使用上下拉
12位,使能或者禁止上下拉/状态保持器功能,为0时禁止,为1时使能
11位,当IO作为输出时有效,0:禁止开路输出;1:使能开路输出
10-8位保留,不用
7-6位,设置GPIO的速度,从00-11有4档可选,50MHz到200MHz
5-3位,上面说的DSE,000:禁止DSE功能;001:R0的阻值,3.3V下是260欧,1.8V下是150欧,接DDR时是240欧;010-111,分别把R0
的值设为001时R0值的1/2到1/7
2-1位保留,不用
0位,上面说的压摆率SRE,0为低压摆率,1为高压摆率

实际使用时,可以这么写函数IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0),按照上述的每位定义,这个0x010B0对应的就是

  • 禁止HYS
  • 100K欧下拉
  • 断电后IO口保持以前状态
  • 使能状态保持器
  • 禁止开路输出
  • 7-6位是10,150MHz速
  • DSE为110
  • 低压摆率

以上的学习针对的都是IO口的复用和相关参数设置,但并没有涉及到GPIO的属性,例如怎么设置输入输出,怎么设置高低电平值等等,这一块是怎么设置的呢?
另外,STM32单片机还需要初始化GPIO的时钟,还有中断,I.MX6UL的这些设置在哪里进行?

(未完待续)

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

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

相关文章

腾讯云标准型SA4服务器AMD处理器性能测评

腾讯云服务器标准型SA4实例CPU采用AMD处理器,新一代腾讯云自研星星海双路服务器,搭配AMD EPYC Genoa处理器,内存采用最新 DDR5,默认网络优化,最高内网收发能力达4500万pps,最高内网带宽可支持100Gbps。阿腾…

IP-guard flexpaper远程命令执行漏洞复现 [附POC]

文章目录 IP-guard flexpaper RCE漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 IP-guard flexpaper RCE漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测…

acwing算法基础之搜索与图论--匈牙利算法求二分图的最大匹配数

目录 1 基础知识2 模板3 工程化 1 基础知识 二分图中的最大匹配数:从二分图中选择一些边(这些边连接集合A和集合B,集合A中结点数目为n1,集合B中结点数目为n2),设为集合S,其中任意两条边不共用一…

Django框架FAQ

文章目录 问题1:Django数据库恢复问题2:null和blank的区别3.报错 django.db.utils.IntegrityError: (1062, “Duplicate entry ‘‘ for key ‘mobile‘“)4.报错 Refused to display ‘url‘ in a frame because it set ‘X-Frame-Options‘ to deny5.报错 RuntimeError: cryp…

NovelD: A Simple yet Effective Exploration Criterion论文笔记

NovelD:一种简单而有效的探索准则 1、Motivation 针对稀疏奖励环境下的智能体探索问题,许多工作中采用各种内在奖励(Intrinsic Reward)设计来指导困难探索环境中的探索 ,例如: ICM:基于前向动力学模型的好奇心驱动探索RND&…

CCF编程能力等级认证GESP—C++1级—样题1

CCF编程能力等级认证GESP—C1级—样题1 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)第一题第二题 参考答案单选题判断题编程题1编程题2 单选题&#xf…

Linux文件系统

1.基础IO (1)文件操作 在C语言中,用来进行文件操作的函数有很多,比如: 所谓文件操作,简而言之就是通过语言层面向系统层面进行函数调用,命令操作系统为在磁盘上为其创建文件,那么这些…

企业级源代码安全审计咨询案例

代码审计网专家服务团队,除了提供网络、现场的源代码审计服务外,为了帮助企业建立代码审计服务平台、代码扫描基线、安全和质量编码规范、制度流程,打通企业研发的各个管理环节,实现自动化等企业级源代码安全审计咨询服务。 企业要…

react Antd3以下实现年份选择器 YearPicker

项目antd版本低,没有直接可使用的年份选择器,参考此篇(使用antd实现年份选择器控件 - 掘金) 一开始在state里设置了time: this.state {isopen: false,time: null } 在类似onChange事件里this.setState({time: valu…

一文搞懂Transformer

近期Transformer系列模型的出现,增加了CV领域的多样性。但是Transformer这一不同领域的模型对学习者来说需要一个细致的学习过程.下面就是本菜鸟总结学习路线。 Transformer是基于attention机制。而attention机制又在Encoder、Decode中。本篇博客将从Attention->…

短视频短剧小程序系统:创新的内容传播与互动体验

随着移动互联网的普及和用户消费习惯的改变,短视频短剧小程序系统逐渐成为内容传播和互动体验的新宠。这种小程序系统以短视频和短剧为主要内容形式,通过创新的内容传播和互动体验,为用户提供了一种全新的娱乐和社交方式。本文将详细介绍短视…

C# Onnx 轻量实时的M-LSD直线检测

目录 介绍 效果 效果1 效果2 效果3 效果4 模型信息 项目 代码 下载 其他 介绍 github地址:https://github.com/navervision/mlsd M-LSD: Towards Light-weight and Real-time Line Segment Detection Official Tensorflow implementation of "M-…

使用 maven 自动将源码打包并发布

maven-source-plugin 作用&#xff1a; 在构建过程中将项目的源代码进行打包&#xff0c;并作为一个jar文件附着在主构件上&#xff0c;在 pom.xml 中添加如下内容&#xff0c;使用 maven 生成 jar 的同时生成 sources 包 在 pom 中配置如下&#xff1a; <build><p…

Hive 查询优化

Hive 查询优化 -- 本地 set mapreduce.framework.namelocal; set hive.exec.mode.local.autotrue; set mapperd.job.trackerlocal; -- yarn set mapreduce.framework.nameyarn; set hive.exec.mode.local.autofalse; set mapperd.job.trackeryarn-- 向量模式 set hive.vectori…

最小二乘法及参数辨识

文章目录 一、最小二乘法1.1 定义1.2 SISO系统运用最小二乘估计进行辨识1.3 几何解释1.4 最小二乘法性质 二、加权最小二乘法三、递推最小二乘法四、增广最小二乘法 一、最小二乘法 1.1 定义 1974年高斯提出的最小二乘法的基本原理是未知量的最可能值是使各项实际观测值和计算…

[数据结构]—带头双向循环链表——超详解

&#x1f493;作者简介&#x1f389;&#xff1a;在校大二迷茫大学生 &#x1f496;个人主页&#x1f389;&#xff1a;小李很执着 &#x1f497;系列专栏&#x1f389;&#xff1a;数据结构 每日分享✨&#xff1a;旅行是为了迷路&#xff0c;迷路是为了遇上美好❣️❣️❣️ …

XoT:一种新的大语言模型的提示技术

这是微软在11月最新发布的一篇论文&#xff0c;题为“Everything of Thoughts: Defying the Law of Penrose Triangle for Thought Generation”&#xff0c;介绍了一种名为XOT的提示技术&#xff0c;它增强了像GPT-3和GPT-4这样的大型语言模型(llm)解决复杂问题的潜力。 当前提…

Spring底层原理学习笔记--第九讲--(aop之ajc增强)

AOP实现之ajc编译器 AOP的另一种实现及原理 A10Application.java package com.lucifer.itheima.a10;import com.lucifer.itheima.a10.service.MyService; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframewor…

如何让组织的KPI成为敏捷转型的推手而不是杀手 | IDCF

作者&#xff1a;IDCF学员 伍雪锋 某知名通讯公司首席敏捷教练&#xff0c;DevOps布道者。2020年到2021年小100人团队从0-1初步完成敏捷转型&#xff0c;专注传统制造业的IT转型&#xff0c;研发效能提升。 一、前言 在公司我们常常听见这么一个流传的故事&#xff0c;只要…

HCIA-经典综合实验(二)

经典综合实验&#xff08;二&#xff09; 实验拓扑配置步骤配置Eth-Trunk聚合链路第一步 配置二层VLAN第二步 配置MSTP生成树第三步 配置相关IP地址第四步 配置DHCP及DHCP中继第五步 配置三层的网关冗余协议 VRRP及OSPF第六步 配置静态路由,NAT地址转换及其他配置完善 配置验证…