加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

一篇带给你GPIO 软件框架

发布时间:2021-10-29 19:24:22 所属栏目:系统 来源:互联网
导读:GPIO 八种工作模式详解接着上一篇的讲,我们上一篇研究了 GPIO 的硬件结构,其来源于 STM32 官方手册,研究了 GPIO 的八种工作模式和推挽输出及开漏输出原理,接下来我们研究 GPIO 的软件部分,分别从单片机平台和 Linux 平台来研究。1、单片机平台单片机平
GPIO 八种工作模式详解   接着上一篇的讲,我们上一篇研究了 GPIO 的硬件结构,其来源于 STM32 官方手册,研究了 GPIO 的八种工作模式和推挽输出及开漏输出原理,接下来我们研究 GPIO 的软件部分,分别从单片机平台和 Linux 平台来研究。   1、单片机平台 单片机平台编写 GPIO 口程序,以 STM32F103 为例,有三种模式:库函数、HAL库、寄存器。   使用库函数的方式操控 GPIO 方式如下:   void LED_Init(void)  {      GPIO_InitTypeDef GPIO_InitStructure;        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能 PB 端口时钟        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;      //PB5 端口配置      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度      GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化 GPIOB.5      GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高  }  上述代码就是使用库函数来初始化 STM32 的一个 IO 为输出功能,可以看出上述初始化代码中重点要做的事情有一下几个:   ①、使能指定 GPIO 的时钟。   ②、初始化 GPIO,比如输出功能、上拉、速度等等。   ③、STM32 有的 IO 可以作为其它外设引脚,也就是 IO 复用,如果要将 IO 作为其它外设引脚使用的话就需要设置 IO 的复用功能。   ④、最后设置 GPIO 输出高电平或者低电平。   STM32 的 GPIO 初始化就是以上四步,使用库函数操作 GPIO 还是很简单的。但是我们知道 STM32F1 系列是有库函数的,但是 STM32F7 系列就没有库函数了,ST 公司没有出,STM32F7 只有 HAL 库和寄存器两种操作方式。   2、嵌入式 Linux 平台 先总结一句:不管是单片机还是高端 ARM 平台,最底层都是寄存器,硬件之上就是寄存器,任何封装形式到最底层就是操作寄存器。   对于上了 Linux 系统的平台,我们有其他方法,让它可以像单片机一样简单的操作 IO 口,这得益于各路 Linux 大神对系统底层的封装。   在 Linux 中有 pinctrl 和 gpio 子系统,它们提供了 API 接口给你使用,让你方便的操控 GPIO 口。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对 GPIO 的配置推出了 gpio 子系统。   上面这句话很重要,我详细解释一下:这里是将 pin 脚和控制 IO 口输入输出分离。   pinctrl 子系统管理 200 个 IO 口的上拉下拉电阻,电流驱动能力,是硬件底层的存在。如果 pinctrl 将某个 pin 脚初始化成了普通 GPIO 而不是 IIC 或者 SPI,那么接下来我们就可以使用 gpio 子系统的 API 去操作 IO 口输出高低电平。   传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置 方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:   ①、获取设备树中 pin 信息。   ②、根据获取到的 pin 信息来设置 pin 的复用功能   ③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。   对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成,pinctrl 子系统源码目录为 drivers/pinctrl。   注意,pinctrl 子系统也是一个标准的 platform 驱动,当设备和驱动匹配的时候,probe 函数会执行,只是 pinctrl 子系统采用的 arch_initcall 去声明,而不是 module_init(device_initcall),所以在系统起来的时候它会先加载。(具体原因看下面这篇文章)   Linux 驱动挂载顺序分析       pinctrl 和 gpio 子系统软件框架如下:   pinctrl     gpio     可以看出其实两者软件框架一样的,主要是 HW Abstract layer 具体实现不一样。   你以为两者是分离的,实际上不是的,gpio 子系统是基于 pinctrl 子系统的,gpio 的 API 接口的实现很多都是基于 pinctrl 子系统的函数。

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读