嵌入式Linux驱动—— 1 GPIO设置

打印 上一主题 下一主题

主题 1781|帖子 1781|积分 5343

目录
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 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表