用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
物联网
›
物联网
›
嵌入式Linux驱动—— 1 GPIO设置
嵌入式Linux驱动—— 1 GPIO设置
傲渊山岳
论坛元老
|
2025-4-6 17:36:56
|
显示全部楼层
|
阅读模式
楼主
主题
1868
|
帖子
1868
|
积分
5604
目录
1.GPIO操作
1.1 IO命名
1.2 GPIO 时钟使能(CCM)
1.3 IO 复用(IOMUXC)
1.4 IO 设置
1.5 GPIO 设置
1.GPIO操作
GPIO操作重要是以下流程:
使能某组GPIO模块(GPIO1、2、...)(设置CCM寄存器)
设置 IO 的复用功能和参数(设置 IOMUXC寄存器)
设置GPIO(设置DR、GDIR、PSR...寄存器)
重要是
设置相关寄存器
,相关寄存器及其设置如下:
1.1 IO命名
形如 “IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00” 的就是 GPIO 命名,命名形式就是“IOMUXC_SW_MUC_CTL_PAD_XX_XX”,背面的 “XX_XX” 就是 GPIO 命名
IMX6ULL 的 GPIO 并不像 STM32 一样以 PA0~15 如许命名,他是根据某个 IO 所拥有的功能来命名的
比如:我们一看到 GPIO1_IO01 就知道这个肯定能做 GPIO,看到 UART1_TX_DATA 肯定就知道这个 IO 肯定能做 为 UART1 的发送引脚。
不外固然IO的名字差别,但实际上他们都可以
复用为GPIO(就是一个引脚多种功能)
1.2 GPIO 时钟使能(CCM)
CMM
有 CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 IMX6U 的全部外设时钟开关
我们以 CCM_CCGR0 为例来看一下怎样禁止或使能一个外设的时钟
CCM_CCGR0 是个 32 位寄存器,其中
每 2 位控制一个外设的时钟
,比如 bit31:30 控制着 GPIO2 的外设时钟,两个位就有 4 种操作方式:
根据上述,假如我们要打开 GPIO2 的外设时钟,那么只需要设置 CCM_CCGR0 的 bit31 和 bit30 都为 1 即可 ,反之,假如要关闭 GPIO2 的外设时钟 , 那就设置 CCM_CCGR0 的 bit31 和 bit30 都为 0 即可 。
1.3 IO 复用(IOMUXC)
以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”这个 IO
寄存器
为例:
可以看出,这是一个
32位的寄存器
,但是只用到了最低 5 位,地址为 0X020E005C
bit0~bit3 (MUX_MODE)
就是设置 GPIO1_IO00 的复用功能的。GPIO1_IO00 一共可以复用为 9 种功能 IO,分别对应 ALT0~ALT8,其中
ALT5 就是作为 GPIO1_IO00
其实就是设置这个寄存器:
a)
IOMUXC_SW_MUX_CTL_PAD_<
AD_NAME>
:Mux pad xxx,选择某个 IO 引脚的功能
b) IOMUXC_SW_MUX_CTL_GRP_<GROUP_NAME>:Mux grp xxx,选择某组引脚的功能(这是设置一整组的)
IMX6U的 GPIO 一共有5组:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5, 其中 GPIO1 有32个 IO,GPIO2 有22个IO,GPIO3 有29个 IO、GPIO4 有 29 个IO,GPIO5 最少,只有12个IO,如许一共有124个GPIO。
具体复用设置可以查阅手册第 32 章“Chapter 32: IOMUX Controller(IOMUXC)”
1.4 IO 设置
我们会发现在《I.MX6UL 参考手册》第 30 章“Chapter 30: IOMUX Controller(IOMUXC)”的书签中,每一个 IO 会出现两次,它们的名字差别很小,比如 GPIO1_IO00 有如下两个书签:
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00
上面两个都是跟 GPIO_IO00 有关的寄存器,名字上的区别就是赤色部门
一个是“MUX”, 一个是“PAD”。IOMUX_SW_MUX_CTL_PAD_GPIO1_IO00 前面已经说了,是用来设置 GPIO1_IO00 复用功能的
那么 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 是做什么的呢?
可以看出,IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 也是个32 位寄存器,地址为 0X020E02E8。只用到了其中的低 17 位
这个寄存器其实就是用来设置引脚参数的:
a)
IOMUXC_SW_PAD_CTL_PAD_<
AD_NAME>:
pad pad xxx,设置某个IO引脚的参数
b)
IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>:
pad grp xxx,设 置某组引脚的参数
寄存器差别的位代表了差别的参数,
具体设置了哪些参数可以看正点原子的手册
1.5 GPIO 设置
IOMUXC_SW_MUX_CTL_PAD_XX_XX 和 IOMUXC_SW_PAD_CTL_PAD_XX_XX 这两 种寄存器都是设置 IO 的,
注意是 IO!不是 GPIO
,GPIO 是一个 IO 浩繁复用功能中的一种。
将其复用为 GPIO 以后还 需要对其 GPIO 的功能举行设置
PS:关于 I.MX6U 的 GPIO 请参考《IMX6UL 参考手册》的第 26 章“Chapter 26 General Purpose Input/Ouput (GPIO)”
当 IO 用作 GPIO 的时候需要设置的寄存器,一共有八个:
DR、GDIR、PSR、ICR1、ICR2、EDGE_SEL、IMR 和 ISR。
DR 寄存器:数据寄存器
此寄存器是 32 位的,一个 GPIO 组最大只有 32 个 IO,因此 DR 寄存器中的每个位都对应 一个 GPIO。
当 GPIO 被设置为输出功能以后,向指定的位写入数据那么相应的 IO 就会输出相 应的高低电平
当 GPIO 被设置为输入模式以后,此寄存器就保存着对应 IO 的电平值,每个位对对应一个 GPIO
GDIR 寄存器:方向寄存器
GDIR 寄存器也是 32 位的,此寄存器用来设置某个 IO 的工作方向,是输入还是输出。
每个 IO 对应一个位,假如要设置 GPIO 为输入的话就设置相应的位为 0,假如要设置为输出的话就设置为 1。
比如要设置 GPIO1_IO00 为输入,那么 GPIO1.GDIR=0;
PSR 寄存器:状态寄存器
PSR 寄存器也是一个 GPIO 对应一个位,读取相应的位即可获取对应的 GPIO 的状 态,也就是 GPIO 的高低电平值。功能和输入状态下的 DR 寄存器一样。
ICR1、ICR2、EDGE_SEL、IMR 和 ISR
都是跟中断相关的寄存器,具体可以看正点原子手册P313
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
傲渊山岳
论坛元老
这个人很懒什么都没写!
楼主热帖
2022你不容错过的软件测试项目实战(we ...
SQL Server创建表
【微服务专题之】.Net6下集成微服务网 ...
Swift之Codable自定义解析将任意数据类 ...
MySQL max() min() 函数取值错误
ThinkPHP5 远程命令执行漏洞
K8S 性能优化 - K8S APIServer 调优 ...
kubernetes top查看内存CPU使用情况 ...
变量的定义和使用
前端的自我修养
标签云
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
人工智能
快速回复
返回顶部
返回列表