** 个人名片:**
🦁作者简介:一名喜欢分享和记录学习的在校大学生
🐯个人主页:妄北y🐧个人QQ:2061314755
🐻个人邮箱:2061314755@qq.com
🦉个人WeChat:Vir2021GKBS
🐼本文由妄北y原创,首发CSDN🎊🎊🎊
🐨座右铭:大多数人想要改造这个世界,但却罕有人想改造自己。
专栏导航:
妄北y系列专栏导航:
C/C++的基础算法:C/C++是一种常用的编程语言,可以用于实现各种算法,这里我们对一些基础算法进行了详细的介绍与分享。🎇🎇🎇
C/C++刷题库:分享一些关于编程的练习基础题,也会后续加入一系列的算法题,分享自己的解题思路和方法。🥰🥰🥰
计算机网络:对计算机网络的基础知识框架有一个简单的学习与认识,对计算机网络中常见的题型进行一个总结与归纳。🍾🍾🍾
QT基础入门学习:对QT的基础图形化页面设计进行了一个简单的学习与认识,利用QT的基础知识进行了翻金币小游戏的制作🤹🤹🤹
Linux基础编程:初步认识什么是Linux,为什么学Linux,安装环境,进行基础命令的学习,入门级的shell编程。🍻🍻🍻
Linux的系统编程+网络编程:IO编程、进程、线程、进程间通讯(包括管道、信号、信号量、共享内存等)网络编程主要就是socket,poll,epoll,以及对TCP/IP的理解,同时要学会高并发式服务器的编写。🙌🙌🙌
Linux应用开发基础开发:分享Linux的基本概念、命令行操作、文件系统、用户和权限管理等,网络编程相关知识,TCP/IP 协议、套接字(Socket)编程等,可以实现网络通信功能。💐💐💐
Linux项目开发:Linux基础知识的实践,做项目是最锻炼能力的一个学习方法,这里我们会学习到一些简单基础的项目开发与应用,而且都是毕业设计级别的哦。🤸🤸🤸
非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
文章介绍:
🎉本篇文章对Linux 驱动开发基础知识学习的相关知识进行分享!🥳🥳🥳
当我们学习C 语言的时候,我们会写个 Hello 程序。 那当我们写 ARM 程序,也该有一个简单的程序引领我们入门,这个程序就是点亮 LED。
如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!💪💪💪
🎁感谢大家点赞👍收藏⭐评论✍️
目录:
一、硬件知识_LED 原理图
我们怎样去点亮一个 LED 呢?分为三步:
第1步 看原理图,确定控制 LED 的引脚;
第2步 看主芯片的芯片手册,确定如何设置控制这个引脚;
第3步 写程序;
原理图
LED 样子有很多种,像插脚的,贴片的。
它们长得完全不一样,因此我们在原理图中将它抽象出来。
点亮 LED 需要通电源,同时为了保护 LED,加个电阻减小电流。
控制 LED 灯的亮灭,可以手动开关 LED,但在电子系统中,不可能让人来控制开关,通过编程,利用芯片的引脚去控制开关。
LED 的驱动方式,常见的有四种。
(1)使用引脚输出 3.3V 点亮 LED,输出 0V 熄灭 LED。
(2)使用引脚拉低到 0V 点亮 LED,输出** 3.3V 熄灭 LED**。
(3)有的芯片为了省电等原因,其引脚驱动能力不足,这时可以使用三极管驱动。
(4)使用引脚输出 1.2V 点亮 LED,输出 0V 熄灭 LED。 使用引脚输出 0V 点亮 LED,输出 1.2V 熄灭 LED。
由此,主芯片引脚输出高电平/低电平,即可改变 LED 状态,而无需关注 GPIO 引脚输出的是 3.3V 还是 1.2V。所以简称输出 1 或 0:
逻辑 1-->高电平 逻辑 0-->低电平
二、普适的 GPIO 引脚操作方法
GPIO: General-purpose input/output,通用的输入输出口
1.GPIO 模块一般结构
有多组 GPIO,每组有多个 GPIO
使能:电源/时钟
模式(Mode):引脚可用于 GPIO 或其他功能
方向:引脚 Mode 设置为 GPIO 时,可以继续设置它是输出引脚,还是输入引脚
数值:
对于输出引脚,可以设置寄存器让它输出高、低电平
对于输入引脚,可以读取寄存器得到引脚的当前电平
2.GPIO 寄存器操作
芯片手册一般有相关章节,用来介绍:power/clock
可以设置对应寄存器**使能某个 GPIO 模块(Module)**
有些芯片的 GPIO 是**没有使能开关的,即它总是使能**的
一个引脚可以用于 GPIO、串口、USB 或其他功能
有对应的寄存器来选择引脚的功能
对于已经设置为 GPIO 功能的引脚,有方向寄存器用来设置它的方向:输出、 输入
对于已经设置为 GPIO 功能的引脚,有数据寄存器用来写、读引脚电平状态 GPIO 寄存器的 2
操作方法:原则:不能影响到其他位
** 更高效的办法,对于有些处理器有设置和清除寄存器**
(1)直接读写:读出、修改对应位、写入
要设置 bit n:
val = data_reg;
val = val | (1<<n);
data_reg = val;
要清除 bit n:
val = data_reg;
val = val & ~(1<<n);
data_reg = val;
** (2)set-and-clear protocol:**
set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器
a) 要设置 bit n:set_reg = (1<<n);
b) 要清除 bit n: clr_reg = (1<<n);
三、具体单板的 GPIO 操作方法
1.IMX6ULL 的 GPIO 操作方法
2. IMX6ULL 的 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、模块本身
(1)CCM 用于设置是否向 GPIO 模块提供时钟
GPIOx 要用 CCM_CCGRy 寄存器中的 2 位来决定该组 GPIO 是否使能。哪组 GPIO 用哪个 CCM_CCGR寄存器来设置,请看上图红框部分,CCM_CCGR 寄存器中某 2 位的取值含义如下:
00:该 GPIO 模块全程被关闭
01:该 GPIO 模块在 CPU run mode 情况下是使能的;在 WAIT 或 STOP 模式下,关闭
10:保留
11:该 GPIO 模块全程使能
**GPIO2 时钟控制: **
** GPIO1、GPIO5 时钟控制:**
** GPIO3 时钟控制:**
**GPIO4 时钟控制: **
(2)IOMUXC:引脚的模式(Mode、功能)
对于某个/某组引脚,IOMUXC 中有 2 个寄存器用来设置它:
** 1).选择功能:**
a) IOMUXC_SW_MUX_CTL_PAD_ <PADNAME>:Mux pad xxx,选择某个 pad 的功能
b) IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>:Mux grp xxx,选择某组引脚的功能
某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT) MUX_MODE)
** 2)设置上下拉电阻等参数**
a) IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>:pad pad xxx,设置某个 pad 的参数
b) IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>:pad grp xxx,设置某组引脚的参数
3.GPIO 模块内部
我们暂时只需要关心 3 个寄存器:
(1)GPIOx_GDIR:
设置引脚方向,每位对应一个引脚,1-output,0-input
(2)GPIOx_DR:
设置输出引脚的电平,每位对应一个引脚,1-高电平,0-低电平
(3) GPIOx_PSR:
读取引脚的电平,每位对应一个引脚,1-高电平,0-低电平
4.读 GPIO
(1)设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,
(2)IOMUX 来选择引脚用于 GPIO
(3)设置 GPIOx_GDIR 中某位为 0,把该引脚设置为输入功能
(4)读 GPIOx_DR 或 GPIOx_PSR 得到某位的值(读 GPIOx_DR 返回的是 GPIOx_PSR 的值)
6.写 GPIO
(1)设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的
(2)设置 IOMUX 来选择引脚用于 GPIO
(3)设置 GPIOx_GDIR 中某位为 1,把该引脚设置为输出功能
(4)写 GPIOx_DR 某位的值
需要注意的是,你可以设置该引脚的 loopback 功能,这样就可以从 GPIOx_PSR 中读到引脚的有实电平;你从 GPIOx_DR 中读回的只是上次设置的 值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路 了,你通过设置 GPIOx_DR 让它输出高电平并不会起效果。
三、基于IMX6ULL的LED寄存器操作
1.先看原理图原理图
打开原理图,搜“LED”,如下图所示:
用到了GPIO5中的第3个引脚 ,要想点亮LED,我们需要将GPIO输出低电平
2.再看芯片手册:使能GPIO5
GPIO5_3属于GPIO5里的第3个引脚。
怎么使能GPIO5?对于IMX6ULL,GPIO5默认使能,无需设置。
CCM_CCGR1地址:**0x020C4000 + 0x6C**
3.再看芯片手册:设置GPIO5_3为GPIO
IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3地址:0x02290000 + 0x14
4.再看芯片手册:设置GPIO5_3为输出
GPIO5_GDIR地址:0x020AC004
四、框架图
大佬觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥任务在无形中完成,价值在无形中升华,让我们一起加油吧!🌙🌙🌙
版权归原作者 妄北y 所有, 如有侵权,请联系我们删除。