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

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.kler.cn/a/372637.html

相关文章:

  • Oracle数据泵(expdp)导入导出数据
  • 算法复杂度分析:深入剖析最好、最坏、平均、均摊时间复杂度
  • Spring Boot 创建项目详细介绍
  • 【热门主题】000013 C++游戏开发全攻略
  • 模型性能评估指标
  • 【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!
  • 详解:单例模式中的饿汉式和懒汉式
  • lego-loam mapOptmization 源码注释(一)
  • Lua语法基础全面剖析(中篇)
  • uni-app应用级生命周期和页面级生命周期
  • huggingface之tokenization基础结构Trie-代码解读
  • 【缓存与加速技术实践】Redis 主从复制
  • 银河麒麟v10安装Anaconda(python大蟒蛇)+pycharm安装
  • AJAX和JSON
  • K8S 容器可视化管理工具-kuboard 监控管理工具搭建
  • 操作数据表
  • 【蓝桥杯选拔赛真题81】python矩形数量 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • C++ 中回调函数的实现方式-函数指针
  • ICT网络赛道安全考点知识总结1
  • 笔记整理—linux驱动开发部分(2)模块信息与编译
  • 记录一次查询优化
  • 关于Mac打包ipa的配置小结
  • Hyperledger Fabric有那些核心技术,和其他区块链对比Hyperledger Fabric有那些优势
  • Spring Boot 实现文件分片上传和下载
  • 运维端口号详解(Detailed Explanation of Operation and Maintenance Port Numbers)
  • 高效MySQL缓存策略