目录
- [一、GPIO 概述](#一、GPIO 概述)
- 二、GPIO模块相关API
- 三、实例
- [四、GPIO HDF驱动开发](#四、GPIO HDF驱动开发)
- 坚持就有收获
轻量系统设备通常需要进行外设控制,例如温湿度数据的采集、灯开关的控制,因此在完成内核开发后,需要进行设备驱动的开发。
主要Hi3861芯片介绍如何运用 IoT 硬件子系统进行轻量系统设备的驱动开发。
在轻量系统的联接模组中,智能家居远程控制能力的实现,最终是通过 IoT 硬件子系统部件发送指令到特定的家居设备。
Hi3861芯片提供设备操作接口有:GPIO、PWM、UART、I2C、SPI、ADC、WATCHDOG、FLASH、LOWPOWER、RESET 等。
一、GPIO 概述
GPIO(General-purpose input/output)即通用型输入输出,用于控制芯片引脚的数字输入和数字输出。通常,GPIO 控制器通过分组的方式管理所有 GPIO 管脚,每组 GPIO 有一个或多个寄存器与之关联,通过读写寄存器完成对 GPIO 管脚的操作。
GPIO 是芯片上一根能完成多种功能的管脚,用户可以通过 GPIO 口和硬件进行数据交互(如UART),控制硬件工作(如 LED,蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。
例如 GPIO_00 引脚复用表如下:(剩余引脚复用信息,请查看厂商芯片手册)。
管脚 | 管脚名称 | 类型 | 驱动(mA) | 电压(V) | 描述 |
---|---|---|---|---|---|
复用信号0:GPIO_00 | |||||
复用信号1:UART1_TXD | |||||
复用信号2:SPI1_CLK | |||||
2 | GPIO_00 | I/O | 1 | 3.3/1.8 | 复用信号3:PWM3_OUT |
复用信号4:I2C_SDA | |||||
复用信号5:RTC_OSC_32K | |||||
复用信号6:RTC32K_XOUT | |||||
复用信号7:保留 | |||||
GPIO 接口定义了操作 GPIO 管脚的标准方法集合,包括:
- 设置管脚方向:方向可以是输入或者输出(暂不支持高阻态)
- 读写管脚电平值:电平值可以是低电平或高电平
- 设置管脚中断服务函数:设置一个管脚的中断响应函数,以及中断触发方式
- 使能和禁止管脚中断:禁止或使能管脚中断
GPIO 引脚复用流程如下:
二、GPIO模块相关API
头文件路径:base/iothardware/peripheral/interfaces/inner_api/iot_gpio.h
接口函数 | 描述 |
---|---|
unsigned int IoTGpioInit(unsigned int id) | 确定GPIO管脚号 |
unsigned int IoTGpioSetDir(unsigned int id, IotGpioDir dir) | 设置管脚方向 |
unsigned int IoTGpioSetOutputVal(unsigned int id, IotGpioValue val) | 设置管脚电平 |
unsigned int IoTGpioRegisterIsrFunc(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg) | 设置管脚中断 |
三、实例
c
//代码功能:定义 GPIO_00 号口为输出模式且输出高电平。
#include "iot_gpio.h"
IoTGpioInit(GPIO_00);
IoTGpioSetDir(GPIO_00 , IOT_GPIO_DIR_OUT);
IoTGpioSetOutputVal(GPIO_00 , IOT_GPIO_VALUE0);
while (1) {
IoTGpioSetOutputVal(LED_GPIO, IOT_GPIO_VALUE1);
sleep(1);
IoTGpioSetOutputVal(LED_GPIO, IOT_GPIO_VALUE0);
sleep(1);
}
四、GPIO HDF驱动开发
在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。GPIO模块采用统一服务模式(如图1所示)。
在统一模式下,所有的控制器都被核心层统一管理,并由核心层统一发布一个服务供接口层,因此这种模式下驱动无需再为每个控制器发布服务。
GPIO模块各分层作用:
接口层:提供操作GPIO管脚的标准方法。
核心层:提供GPIO管脚资源匹配,GPIO管脚控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互,供芯片厂家快速接入HDF框架。
适配层:由驱动适配者将钩子函数的功能实例化,实现与硬件相关的具体功能。