当前位置: 首页 > news >正文

gpio子系统-通过io来控制gpio

        先要通过io控制gpio,这种方法是直接控制寄存器的,先学习一些命令。


io命令

作用:在内核阶段读写寄存器
用法:
io -v -1|2 |4 -r|w [-| <len>] [-f <file>] <addr> [<value>]
        V                Verbose, asks for confirmation

         -1]214        Sets memory access size in bytes (default byte)
        -| <len>        Length in bytes of area to access(defaults to one access, or whole file length)
        -r | w           从内存读或写(默认读)(重点看这个)

        -f <file>        File to write on memory read, or to read on memary write
        <addr>        The memory address to access
        <val>            The value to write (implies -w)


例子:
ie 0x1000                        读0x1000位置的值
io 0x1000 0x12               将0x12写入位置0x1000
io -2 -18 0x1000             Reads 8 words from 0x1000                                                                      io -r -f dmp -l 100 200          从地址200读取100字节到文件
io -w -fimg 0x10000        将整个文件写入内存


        上面的就是io命令相关的命令,-r | w 重点关注这个   它的作用就是从内存读或写(默认读)(重点看这个)。我们以控制gpio的LED灯亮灭。下面,这是我的gpio引脚的位置原理图。

 用io命令控制gpio的灯亮灭,有三个步骤,第一个设置gpio引脚的复用、设置gpio的输入输出方向、最后输入高低电平。

        我们这种方法是直接控制寄存器,所以就要先找到寄存器的地址,地址一般都是基地址+偏移量,才能对它控制。打开我们的芯片手册,

         第一步:把引脚的复用设置成gpio功能。 只要看到IOMUX都是和寄存器复用有关系的。

        因为gpio有很多组gpio,我需要确定是那一组的gpio,从上什么原理图我们可以知道,我的是0的,PMU_GRF就是基地址的位置0xFDC20000,可以知道我们的gpio是第0组

        根据原理图我们已确认在0C的上,但是这里面有两组,分为高位和地位,怎么选,我们要看它的显示说明了

         

        这是低位的,看他的说明,16:31位是使能位,就是你要操作gpio,就先把gpio对应的位使能了,先使能了在能用,0:15就对应着c1, c2, c3, c4。

         这是高位的,看他的说明,16:31位是使能位,就是你要操作gpio,就先把gpio对应的位使能了,先使能了在能用,0:15就对应着c5, c6, c7, c8。

         

        因为有原理图可以知道,我的是gpio0_c7,所以选择高位的,对应的位是8:10,0就对应是gpio功能。前面说了,寄存器的位置是等于基地址+偏移量,所以这个寄存器地址是 0xFDC20000 + 0x0014 = 0xFDC20014。

        所以,现在就可以命令去读取一下这个寄存器的值,看看现在是什么功能描述 

        读取出来值可以通过计算机换算一下,我们只需要关注12:14,这里是设置我们的引脚位置,,可以看到默认就是gpio功能描述

        

         复用设置完了,接下来就是设置gpio的输入输出方向了。打开芯片手册,找到gpio的章节可以看到这两个位置有两个寄存器方向数据,还是老样子那个才是我们需要的,偏移地址是0x0008和0x00C,偏移量还需要确认偏移量,我们是使用gpio0的,所以知道gpio0的寄存器基地址

         在手册的第一章,有一张表,描述各个功能的基地址的

        在这里就可以找到GPIO0的基地址,0xFDD60000,  

 

        我们可以看到两个寄存器,都是只有底16位才是控制引脚的,高16位都是控制使能位的,

我们gpio一共有四组A,B,C,D,每组控制8个应引脚,所以两组加起来刚刚好是16个引脚,所以低位的是控制A和B组,高位控制是C和D组,我的是C7选高位的,高位的偏移量是0x000C,所以寄存器地址等于偏移量 + 偏移量  =  0xFDD60000 + 0x000C = FDD6000C。

         所以,现在就可以命令去读取一下这个寄存器的值,看看现在是是输出还是输入 

         

        用计算机换算 ,只需要关注23脚,因为我的是gpio0_c7,计算规则看以前的博客,我这里23脚是,但是我们这里只有0:16,怎么办,前面说了,高位管C,D组,意思也是从0开始

可以看到每一组只有8个脚,所以我的是c7,意思就是第七位,这里看到第七位是0,0是输入,所以不对,要改,我们还要改使能位。

        把对应的位值置1, 就变成806080,我们要把这个值写回去

 

        最后面是输出输入高电平,看到数据寄存器有两个,选择方法一样看说说明,所以我们操作高位的,高位的偏移量是0x0004,基地址是0xFDD60000 = 寄存器地址 = 0xFDD60004

         

        读取出来看看,再用计算机换算

         引脚的位置和之前的计算一样。

但是有点注意,我的是低电平触发亮灯,是什么电平触发根据情况而定 

 亮灯

 


http://www.mrgr.cn/news/62014.html

相关文章:

  • 十六:Python学习笔记-- 爬虫(2)requests 模块详解
  • 数据分析与效果评估的有效方法与实践探讨
  • G2 基于生成对抗网络(GAN)人脸图像生成
  • [MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where
  • 技术成神之路:设计模式(二十三)解释器模式
  • 鸿蒙的底部菜单导航实现
  • 刚刚买的域名被DNS劫持了怎么处理
  • Spring 设计模式之装饰器模式
  • Unreal5从入门到精通之如何解决在VR项目在头显中卡顿的问题
  • 基于vue框架的的家政预定服务系统4k26i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 万圣节活动如何实现在线预约报名?
  • uniapp iOS打包证书过期——重新下载证书及更新文件
  • 设计模式 - 工厂方法模式
  • Shell变量与子串
  • Mac程序坞窗口预览的方法来了
  • Rust 力扣 - 59. 螺旋矩阵 II
  • 为什么美业必须要有一套专业的美业门店管理系统?美业SaaS系统收银系统拓客系统Java源码
  • Django框架实现用户认证
  • 【力扣专题栏】两两交换链表中的节点,如何实现链表中两两相邻节点的交换?
  • 在JavaScript中怎样实现闭包?
  • 5、片元着色器之基础光照模型:Phong模型和Blinn-Phong模型
  • 【Linux】进程间通信
  • iOS18 取消/适配TabbarController缩放动画
  • Vue CLI: 安装、项目创建及基本概念指南,vue生命周期
  • C++:输入和输出
  • 《Linux系统编程篇》exec族函数——基础篇