嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十四)具体单板的GPIO操作方法

简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十四)具体单板的GPIO操作方法

这部分的工作比较复杂,其实写gpio,就是要学会看芯片手册。打印芯片手册,然后研读是学习的必要。最好英文版。


1.具体单板的GPIO操作方法


1.1 IMX6ULL的GPIO操作方法


CCM: Clock Controller Module (时钟控制模块)

IOMUXC : IOMUX Controller,IO复用控制器

GPIO: General-purpose input/output,通用的输入输出口


1.1.1 IMX6ULL的GPIO模块结构


参考资料:芯片手册《Chapter 28: General Purpose Input/Output (GPIO)》


有5组GPIO(GPIO1~GPIO5),每组引脚最多有32个,但是可能实际上并没有那么多。

GPIO1有32个引脚:GPIO1_IO0~GPIO1_IO31;

GPIO2有22个引脚:GPIO2_IO0~GPIO2_IO21;

GPIO3有29个引脚:GPIO3_IO0~GPIO3_IO28;

GPIO4有29个引脚:GPIO4_IO0~GPIO4_IO28;

GPIO5有12个引脚:GPIO5_IO0~GPIO5_IO11;


GPIO的控制涉及4大模块:CCM、IOMUXC、GPIO模块本身,框图如下:

1670916476605.jpg


1.1.2 CCM用于设置是否向GPIO模块提供时钟


参考资料:芯片手册《Chapter 18: Clock Controller Module (CCM)》


GPIOx要用CCM_CCGRy寄存器中的2位来决定该组GPIO是否使能。

哪组GPIO用哪个CCM_CCGR寄存器来设置,请看上图红框部分。

CCM_CCGR寄存器中某2位的取值含义如下:

1670916489840.jpg

① 00:该GPIO模块全程被关闭

② 01:该GPIO模块在CPU run mode情况下是使能的;在WAIT或STOP模式下,关闭

③ 10:保留

④ 11:该GPIO模块全程使能


GPIO2时钟控制:

1670916498938.jpg

GPIO1、GPIO5时钟控制:

1670916506630.jpg

GPIO3时钟控制:

1670916513300.jpg

GPIO4时钟控制:

1670916519565.jpg


1.1.3 IOMUXC:引脚的模式(Mode、功能)


参考资料:芯片手册《Chapter 32: IOMUX Controller (IOMUXC)》。

1670916531449.jpg

对于某个/某组引脚,IOMUXC中有2个寄存器用来设置它:

① 选择功能:

IOMUXC_SW_MUX_CTL_PAD_:Mux pad xxx,选择某个pad的功能 IOMUXC_SW_MUX_CTL_GRP_:Mux grpxxx,选择某组引脚的功能

某个引脚,或是某组预设的引脚,都有8个可选的模式(alternate (ALT) MUX_MODE)。

1670916540532.jpg

比如:

1670916548532.jpg

② 设置上下拉电阻等参数:

IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>:pad pad xxx,设置某个pad的参数

IOMUXC_SW_PAD_CTL_GRP_:pad grp xxx,设置某组引脚的参数

1670916556298.jpg

比如:

1670916563862.jpg


1.1.4 GPIO模块内部


框图如下:

1670916581343.jpg


我们暂时只需要关心3个寄存器:

① GPIOx_GDIR:设置引脚方向,每位对应一个引脚,1-output,0-input

1670916590762.jpg

② GPIOx_DR:设置输出引脚的电平,每位对应一个引脚,1-高电平,0-低电平

1670916599694.jpg

③ GPIOx_PSR:读取引脚的电平,每位对应一个引脚,1-高电平,0-低电平

1670916606571.jpg


1.1.5 怎么编程


读GPIO

1670916618040.jpg

翻译一下:

① 设置CCM_CCGRx寄存器中某位使能对应的GPIO模块 // 默认是使能的,上图省略了

②设置IOMUX来选择引脚用于GPIO

③ 设置GPIOx_GDIR中某位为0,把该引脚设置为输入功能

④读GPIOx_DR或GPIOx_PSR得到某位的值(读GPIOx_DR返回的是GPIOx_PSR的值)


1.1.6 写GPIO

1670916628789.jpg

翻译一下:

① 设置CCM_CCGRx寄存器中某位使能对应的GPIO模块 // 默认是使能的,上图省略了

②设置IOMUX来选择引脚用于GPIO

③ 设置GPIOx_GDIR中某位为1,把该引脚设置为输出功能

④ 写GPIOx_DR某位的值


需要注意的是,你可以设置该引脚的loopback功能,这样就可以从GPIOx_PSR中读到引脚的有实电平;你从GPIOx_DR中读回的只是上次设置的值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路了,你通过设置GPIOx_DR让它输出高电平并不会起效果。

相关文章
|
4月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
4月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1632 10
|
4月前
|
Ubuntu Linux 图形学
推广与体验Ubuntu Linux的便捷方法
如果你的朋友或家人对尝试Linux感兴趣,但希望在安装之前先体验一下,你可以分享以下链接给他们:Ubuntu在线导览。通过这个链接,他们可以在任何地方轻松体验Ubuntu,无需安装即可深入了解这个流行的操作系统。
|
4月前
|
XML 缓存 Linux
在Linux环境下解决Visual Studio Code字体显示异常和字体替换方法。
解决Linux下VS Code字体显示异常,需要对Linux字体渲染机制有所理解,并对VS Code的配置选项进行合理设置。替换字体时则要通过系统字体配置或VS Code设置来完成。通过上述方法,可以有效地解决字体显示问题,从而提升代码编辑的视觉体验。
581 0
|
7月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
392 32
|
9月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
2294 77
|
7月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
335 16
|
5月前
|
网络协议 Ubuntu Linux
Wireguard in Linux的安装方法
本文介绍了如何在Ubuntu和Rocky Linux中安装配置WireGuard,并探讨了配置过程中可能出现的DNS泄露问题及解决方法,包括通过nmtui设置DNS及调整DNS优先级参数。
|
8月前
|
Linux Shell
Linux系统下快速批量创建和删除文件的方法
总的来说,使用shell脚本来批量处理文件是一种非常强大的工具,只要你愿意花时间学习和实践,你会发现它能大大提高你的工作效率。
470 19

热门文章

最新文章