正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》第 8.1 章

《正点原子资料_A盘/02开发板原理图/IMX6ULL_MINI_V2.2(Mini底板原理图).pdf》

  • 资料盘 开发板资料链接: https://pan.baidu.com/s/1j5Jzbdx9i-g0cWIi3wf2XA 提取码:ag1u


正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第6讲” 的读书笔记。

1. LED 驱动程序

1.1 查看电路原理图中LED连接的GPIO

查看我自己购买的正点原子 I.MX6ULL Mini 开发板对应的电路原理图(电路原理图在正点原子官方网站提供的百度网盘下载链接可以获取到),从电路原理图中找到到 LED 灯所使用的 GPIO 引脚。

代开我自己购买的 “正点原子 I.MX6ULL Mini 开发板” 开发板对应的电路原理图。

在电路原理图中找到“正点原子 I.MX6ULL Mini 开发板”开发板上的 LED 灯对应芯片管脚gpio号。找到Mini 开发板电路原理图中的LED灯的部分,上面标记有 "LED0LED1",继续找到"LED0LED1" 对应芯片的哪个引脚Pin。

在电路原理图PDF文件里搜索"LED0"关键字,找到 LED0 连接到 I.MX6ULL 芯片上的 "GPIO3"引脚上,在Mini 开发板电路原理图里标记为 "GPIO3 LED0"。

1.2 查看I.MX6ULL参考手册寄存器GPIO定义

上面通过电路原理图,已经找到我的“正点原子 I.MX6ULL Mini 开发板”上LED灯连接的是I.MX6ULL芯片的 ‘GPIO3’ 引脚。接下来需要到I.MX6ULL芯片参考手册中找到 ‘GPIO3’对应的寄存器定义。在上一节5讲视频读书笔记中,已经知道I.MX6ULL芯片的每一个 PAD 管脚对应着两个寄存器:

  • 其中一个寄存器配置芯片PAD管脚的复用特性。
  • 另一个寄存器配置芯片PAD管脚的电气特性。

I.MX6ULL芯片参考手册第32章是芯片管脚IO的定义,从这里找到 gpio3 对应的两个寄存器。

'IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03'

'IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03'

1.3 I.MX6ULL IO 复用

在I.MX6ULL芯片参考手册中芯片管脚的定义规律如下

  • I.MX6ULL芯片的是 PAD_XXX_XXX,其中 XXX_XXX 就是管脚的名字,例如,PAD_GPIO_IO03,UART1_TX_DATA、 JTAG_MOD 等。
  • I.MX6ULL芯片的管脚一般对应着两个寄存器,一个寄存器控制IO的复用(Multiplex),另一个寄存器控制IO的电气特性。
  • 控制芯片管脚IO复用的寄存器名字,使用 _SW_MUX_CTL_ 作为名字的一部分(可以理解为 software multiplex control),例如,IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03。
  • 控制芯片管脚IO电气特性的寄存器名字,使用 _SW_PAD_CTL_ 作为名字的一部分(可以理解为 PAD Control),例如,IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03。

“Chapter 32: IOMUX Controller(IOMUXC)”这一章列出了 I.MX6ULL 的所有 IO,如果你找遍 32 章的书签,你会发现貌似 GPIO 只有 GPIO1_IO00~GPIO1_IO09,难道I.MX6ULL 的 GPIO 只有这 10 个?显然不是的, 我们知道 STM32 的很多 IO 是可以复用为其它 功 能 的 , 那 么 I.MX6ULL 的 其 它 IO 也 是 可 以 复 用 为 GPIO 功 能 。同 样 的 ,GPIO1_IO00~GPIO_IO09 也是可以复用为其它外设引脚的,接下来就是 I.MX6ULL IO 复用。

以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”这个 IO 为例,打开参考手册的 1568 页,
如图 8.1.3.1 所示:

从图8.1.3.1 可以看到有有个名为 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的寄存器,寄存器的地址为 0x020E_0068h (大致地址落在范围在 0x0200_0000 = 32*2^20 = 32MB地址区间),这个寄存器是32位的,但只用到了低5位(0-4bit),其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO03 的复用功能。GPIO1_IO03 一种可以服用为9种功能IO, 分别对应 ALT0~ALT8,起重工ALT5就是作为 GPIO1_IO03。GIPIO1_IO03还可以作为 I2C_SCL, GPT1_COMPARE3 等。这个就是 I.MX6U 的 IO  复用。


再来看一个 “IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA”这个IO,这个IO对应的复用如图8.1.3.2所示

同样的,从8.1.3.2可以看出,UART1_TX_DATA 可以服用为8种不同功能的IO,分别为 ALT0~ALT5和ALT8,ALT9,起重工ALT5表示 UART1_TX_DATA 可以复用为 GPIO1_IO16。

由此可见,I.MX6U 的 GPIO 不止 GIPO1_IO00~GPIO1_IO09这10个,其它的IO都可以复用为GPIO来使用。I.MX6U 的 GPIO 一共有5组:GPIO1, GPIO2, GPIO3, GPIO4 和 GPIO5,其中GPIO1有32个IO,GPIO2有22个IO,GPIO3有29个IO,GPIO4有29个IO,GPIO5最少,只有12个IO,这样一共有124个GPIO。如果只想看每个IO能复用什么外设的话可以直接查阅《IMX6ULL参考手册》第4章 "Chapter 4 External Signals and Pin Multiplexing”。如果我们要编写代码,设置某个IO复用功能的话就要查阅第32章“Chapter32:IOMUX Controller(IOMUX)”,第32章详细列出了所有IO对应的复用配置寄存器。

至此我们就解决了 8.1.1 节中的第3个疑问,那就是 I.MX6U 是有IO复用功能的,如果某个IO要作为某个外设引脚使用的话,是要配置复用寄存器的。

1.5 I.MX6U IO 配置

细心的读者应该会发现在《I.MX6UL参考手册》第30章"Chapter 30: IOMUX Controller(IOMUX)"的书签中,每个IO会出现两次,它们的名字差异很小,不仔细看就看不出来,比如 GIPO1_IO00有如下两个书签

IOMUXC_SW_MUX_CTL_PAD_CPIO0_IO00
IOMUXC_SW_PAD_CTL_PAD_CPIO0_IO00

上面两个都是跟 GPIO0_IO00 有关的寄存器,名字上的区别就是红色部分,一个是“MUX”,一个是“PAD”。IOMUXC_SW_MUX_CTL_PAD_GPIO0_IO00 我们前面已经说了,是用来配置GPIO0_IO00复用功能的,那么 IOMUXC_SW_PAD_CTL_PAD_GPIO0_IO00 是做什么的呢?赵

从图8.4.1可以看出,IOMUXC_SW_PAD_CTL_PAD_GPIO0_IO00也是个寄存器,寄存器地址为  0x02E0_02E8。这个也是个32位寄存器,但是只用到了其中的低17位,在看这些位的具体含义之前,先看下图 8.1.4.2 所示的 GPIO 功能图。

我们对照这8.1.4.2 来详细看一下寄存器 IOMUXC_SW_PAD_CTL_GPIO1_IO00的各个位的含义:

HYS(bit16):对应图8.1.4.2中的HYS,用来使能迟滞比较器,当IO作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使能此位。

PUS(bit15:14):对应图8.1.4.2中的PUS,用来设置上下拉电阻的,一种有四种选项可以选择,如下表

位设置含义
00100K下拉
0147K上拉
10100K上拉
1122K上拉

PUE(bit13):图8.1.4.2 没有给出来,当IO作为输入使用的时候,这个位用来设置IO使用上下拉还是状态保持器。当位0的时候使用状态保持器,当位1的时候使用上下拉。状态保持器在IO作为输入的时候才有用,顾名思义,就是当外部电路断电以后此IO口可以保持住以前的状态。

PKE(bit12):对应图8.1.4.2中的PKE,此位用来使能或禁用上下拉/状态保持器功能,位0时禁用上下拉/状态保持器,为1时使能上下拉和状态保持器。

ODE(bit11):对应图8.1.4.2中的ODE,当IO作为输出的时候,此位用来禁止或者使能开路输出,此位为0的时候禁止开路输出,此位为1的时候使能开路输出。

SPEED(bit7:6):对应图8.1.4.2中的SPEED,当IO用作输出的时候,此位用来设置IO速度,设置如下表所示

位设置含义
00低速50M
01中速100M
10中速100M
11最大速度200M

 DSE(bit5:3):对应图8.1.4.2中的DSE,当IO用作输出的时候用来设置IO的驱动能力,总共有8个可选选型,如下表所示。

位设置速度
000输出驱动关闭
001R0(3.3V下R0是260Ω,1.8.V下R0是150Ω,接DDR的时候是240Ω
010R0/2
011R0/3
100R0/4
101R0/5
110R0/6
111R0/7

SRE(bit0):对应图8.1.4.2中的SRE,设置压摆率,当此位为0的时候是低压摆率,当位1的时候是高压摆率。这里的压摆率就是IO电平跳变所需要的时间,比如从0到1需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就低。如果你的产品要过EMC的话那就可以使用小压摆率,因为波形平缓,如果你当前所使用的IO做高速通信的话就可以使用高压摆率。

通过上面的介绍,可以看出寄存器 IOMUXC_SW_PAD_CTL_PAD_GIO1_IO00 是用来配置 GPIO1_IO00 的,包括速度设置,驱动能力设置,压摆率设置等等。至此,我们就解决了8.1.1中的第2个疑问,那就是I.MX6U的IO是可以设置速率的。但是我们没有看到如何设置IO为输入还是输出?IO的默认电平如何设置等等,所以我们继续看。

1.6 I.MX6U GPIO设置

IOMUXC_SW_MUX_CTL_PAD_XXX_XXX 和 IOMUXC_SW_PAD_CTL_PAD_XXX_XXX 这两种寄存器都是配置 IO 的,注意是 IO!不是 GPIO,GPIO 是一个 IO 众多复用功能中的一种。比如 GIPIO1_IO00 这个IO可以复用为: I2C2_SCL, GPT1_CAPTURE1,ANATOP_OTG1_ID,ENET1_REE_CLK,MQS_RIGHT,GPIO1_IO00,ENET1_1588_EVENT0_IN,SRC_SYSTEM_RESET 和 WDOG3_WDOG_B 这9个功能,GPIO1_IO00是其中一种,我们想要把 GPIO1_IO00 用作哪个外设就复用为那个外设功能即可。如果我们要用 GPIO1_IO00 来点个灯,作为按键输入啥的就是使用其 GPIO (通用输入输出)的功能。将其复用为 GPIO 以后,还需要对其GPIO的功能进行配置,关于 I.MX6U 的 GPIO 请参考《IMX6UL 参考手册》的第 26
章“Chapter 26 General Purpose Input/Ouput(GPIO)”,GPIO 的结构如下图所示。

在图 8.1.5.1 的左下角的 IOMUXC 框图中就有 SW_MUX_CTL_PAD_* 和 SW_PAD_CTL_PAD_* 两种寄存器。这两种寄存器就是前面说了用来设置 IO 复用功能 和 IO 电气特性。做上交部分的 GPIO 框图就是,当 IO 用作GPIO的时候需要设置的寄存器,一共有8个:DR,GDIR,PSR,ICR1,ICR2,EDGE_SEL,IMR和ISR。

  1. GPIO.DR
  2. GPIO.GDIR
  3. GPIO.PSR
  4. GPIO.ICR1
  5. GPIO.ICR2
  6. GPIO.EDGE_SEL
  7. GPIO.IMR
  8. GPIOl.ISR

前面我们说了I.MX6U一共有GPIO1~GPIO5共5组GPIO,每组GPIO都有这个8个寄存器。我们来看一下这个8个寄存器都是什么含义。

首先来看一下DR寄存器,此寄存器是数据寄存器,结构如下图所示

《I.MX6U参考手册.pdf》章节28.5 GPIO Data register (GPIOx_DR) 对该寄存器其的解释如下,

28.5.1 GPIO data register (GPIOx_DR)
The 32-bit GPIO_DR register stores data that is ready to be driven to the output lines. If
the IOMUXC is in GPIO mode and a given GPIO direction bit is set, then the
corresponding DR bit is driven to the output. If a given GPIO direction bit is cleared, then
a read of GPIO_DR reflects the value of the corresponding signal.Two wait states are
required in read access for synchronization

GPIOx_DR 寄存器是数据寄存器,其结构如下图所示

此寄存器是32位的,一个GPIO组最大只有32个IO,因此 DR 寄存器中的每个位都对应一个 GPIO。当GPIO被配置为输出功能以后,向指定的为写入数据那么相应的IO就会 输出相应的高低电平,比如要配置 GPIO1_IO00输出高电平,那么就应该设置 GPIO1.DR=0x01。当GPIO配置为输入模式以后,此寄存器就保存这个对应IO的电平值,每个位对应一个GPIO,例如,GPIO1_IO00这个引脚接地的话,GPIO1.DR的bit0就是0。

看完DR寄存器,接着看 GDIR 寄存器,这个是方向寄存器,用来设置某个 GPIO 的工作方向的,即输入/输出,GDIR 寄存器的结构如下所示

GDIR寄存器也是32位,此寄存器用来设置某个IO的方向,是输入还是输出。通样的,每个IO对应一个位,如果要设置GPIO作为输入的话就设置相应为位为0,如果要设置为输出的话就设置为1。比如要设置GPIO1_IO00为输入,那么GPIO1.GDIR=0;

接下来看PSR寄存器,这是GPIO状态寄存器,如下图所示

同样 PSR 寄存器也是一个GPIO对应一个位,读取相应的位即可获取对应的GPIO的状态,也就是GPIO的高低电平值。功能和输入状态下的DR寄存器一样。

接下来ICR1和ICR2这两个寄存器,都是中断控制寄存器,ICR1用于配置低16个GPIO,ICR2用来配置高16个GPIO,ICR1寄存区如下图所示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3588 - RKNN(Rockchip 神经处理单元)的逆向工程

本文翻译自https://jas-hacks.blogspot.com/2024/02/rk3588-reverse-engineering-rknn.html RK3588 NPU 的内部操作和功能主要隐藏在名为RKNPU2的闭源 SDK 中。由于对大型语言模型 (LLM) 的兴趣以及对transform模型最佳矩阵乘法的追求,想了解 RKNPU SDK 新引入的矩阵…

值得让英伟达CEO黄仁勋亲自给OpenAI配送的AI服务器!一文带你了解算力,GPU,CPU!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

【C++】双指针算法:和为s的两个数字

1.题目 虽然在牛客上是个中等题,但我感觉是比较简单的。大家在看完这篇文章后可以看看我的上一篇文章:有效三角形的个数。本文章的题目的解法只是有效三角形的个数这道题目的一个环节。看懂这篇文章后可以更好的解决有效三角形个数那道题目! …

电力系统IEC-104报文主要常用详解

文章目录 1️⃣ IEC-1041.1 前言1.2 报文分类1.3 U帧报文1.3.1 常见报文1.3.1 报文解析 1.4 S帧报文1.4.1 说明1.4.2 报文解析 1.5 I帧报文1.5.1 报文解析 1.6 控制域I帧报文S帧报文U帧报文介绍 1.7 ASDU1.7.1 常见类型标识1.7.2 常见结构限定词1.7.3 常见传送原因1.7.4 信息体…

艾瑞泽5汽车电子控制单元CAN通信数据读写车辆网络系统交互接口

艾瑞泽5的网关接口数据交换通常涉及车辆内部电子设备之间的信息传输,包括车身系统、娱乐系统、远程控制、车辆状态监控、CAN数据采集分析、整车DBC控制策略等信息。 艾瑞泽5作为一款采用CAN协议的汽车,其CAN通信的开发可以提高车辆的安全性、可靠性和实…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1: 方法2: 3.c的调试 3.1调试方法一:先生成执行文件,再调试 3.2调试方法二:同时生成执行文件,调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

uniapp H5实现签名

第一种&#xff1a;跳转签名页面 1、创建审核页面audit.vue <template><view><uni-section title""><view class"auditClass"><uni-forms :model"baseFormData" ref"baseFormRef" :rules"rules&quo…

数据结构初阶——树和二叉树

数据结构初阶——树和二叉树 1. 树的概念和结构1.1 树的概念1.2 树的表示 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的存储结构2.2.1 顺序存储2.2.2 链式存储 3. 二叉树的顺序结构及实现——堆3.1 堆的概念和结构3.2 堆的实现3.2.1 堆的定义3.2.2 堆的向上调整3.2.3 堆的向下…

【网络安全】安全事件管理处置 — 事件分级分类

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、安全事件分级 二、应急事件分级 三、安全事件分类 四、常见安全事件原因分析 1.web入侵 2.漏洞攻击 3.网络攻击 一、安全事件分级 在对安全事件的应急响应过程中&#xf…

【Hadoop】-Apache Hive概述 Hive架构[11]

目录 Apache Hive概述 一、分布式SQL计算-Hive 二、为什么使用Hive Hive架构 一、Hive组件 Apache Hive概述 Apache Hive是一个在Hadoop上构建的数据仓库基础设施&#xff0c;它提供了一个SQL-Like查询语言来分析和查询大规模的数据集。Hive将结构化查询语言&#xff08;…

LT8711UXD助力新款Swtich游戏机底座《4K/60HZ投屏方案》

Nintendo Switch&#xff08;OLED版&#xff09;正面搭载了一块分辨率为720P的7.0英寸OLED屏幕&#xff1b;具有白色和电光蓝电光红2种颜色&#xff1b;机身长度102毫米&#xff0c;宽度242毫米&#xff0c;厚度13.9毫米&#xff0c;重量约420克。 [2]Nintendo Switch&#xff…

明天报名!!济宁教师招聘报名照片及常见问题

明天报名!!济宁教师招聘报名照片及常见问题 山东济宁教师招聘1000多人 报名时间: 2024年4月25日9:00-4月28日16:00 缴费时间: 2024年4月25日11:00-4月30日16:00 打印准考证:2024年5月23日9:00-5月26日9:30 初审时间: 2024年4月25日11:00-4月29日16:00 查询时间: 2024年4月…

10、了解JVM判断对象可回收的神秘法则!

10.1、垃圾回收触发时机? 在我们之前的学习中,我们已经了解到,当我们的系统在运行过程中创建对象时,这些对象通常会被优先分配在所谓的“新生代”内存区域,如下图所示。 在新生代中,当对象数量逐渐增多,接近填满整个空间时,会触发垃圾回收机制。这个机制的作用是回收…

人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用,DETR的原理与结构

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用&#xff0c;DETR的原理与结构。DETR&#xff08;Detected Transformers&#xff09;是一种基于Transformer的端到端目标检测模型&…

IPV4报文格式和IP分片及计算

目录 1.IPV4报文格式 2.IP分片及计算 1.IPV4报文格式 版本&#xff1a;四位&#xff0c;IPV4 0100 4 ;IPV6 0110 6头部长度(IHL):最小值是5&#xff0c;最大值为15&#xff0c;单位4字节。IPV6固定头部长度40字节TOS:为区分服务字段&#xff0c;用区分服务类型&#xff0c;即…

半导体晶圆厂内外网数据单向导出,什么样的方案才安全又便捷?

半导体晶圆厂企业为了隔绝外部⽹络有害攻击、保护⽹络和数据安全&#xff0c;通常采⽤物理隔离的⽅式&#xff0c;将企业内⽹与互联⽹隔离。⽹络隔离后&#xff0c;基于业务开展需求&#xff0c;部分重要数据仍需由内⽹导⼊及导出⾄外部⽹络区域。为保障数据的安全合规性&#…

VMware配置centos虚拟机实现内网互通

VMware配置centos虚拟机实现内网互通 一、安装无桌面模式 环境说明&#xff1a; VMWare版本&#xff1a;VMware Workstation 17 Pro Centos版本&#xff1a;CentOS-7.9-x86_64-DVD-2009.iso 一键下载本文资源包 1. 安装虚拟机 下面是创建具体步骤,其中需要注意的是&#xff1…

如何优雅的实现 iframe 多层级嵌套通讯

前言 在前端开发项目中&#xff0c;不可避免的总会和 iframe 进行打交道&#xff0c;我们通常会使用 postMessage 实现消息通讯。 如果存在下面情况&#xff1a; iframe 父子通讯iframe 同层级通讯iframe 嵌套层级通讯 当面对这种复杂的情况的时候&#xff0c;通讯不可避免…

uniapp制作安卓原生插件踩坑

1.uniapp和Android工程互相引用讲解 uniapp原生Android插件开发入门教程 &#xff08;最新版&#xff09;_uniapp android 插件开发-CSDN博客 2.uniapp引用原生aar目录结构 详细尝试步骤1完成后生成的aar使用&#xff0c;需要新建nativeplugins然后丢进去 3.package.json示例…

机器学习——过拟合

一、过拟合得表现 模型在训练过程中&#xff0c;除了会出现过拟合现象&#xff0c;还有可能出现欠拟合的情况。相比而言&#xff0c;后者通常发生在建模前期&#xff0c;只要做好特征工程一般可以解决模型欠拟合问题。下图描述了模型在训练数据集上的三种情况&#xff1a; 其…