【鸿蒙开发】Hi3861学习笔记- GPIO
00. 目录
文章目录
- 00. 目录
- 01. GPIO概述
- 02. GPIO运行机制
- 03. GPIO相关类型
- 3.1 hi_io_name
- 3.2 hi_io_func_gpio
- 3.3 hi_io_pull
- 3.4 hi_gpio_value
- 3.5 hi_gpio_dir
- 3.6 hi_gpio_int_type
- 3.7 hi_gpio_int_polarity
- 04. GPIO相关函数
- 4.1 hi_gpio_init
- 4.2 hi_io_set_func
- 4.3 hi_io_set_pull
- 4.4 hi_gpio_set_dir
- 4.5 hi_gpio_set_ouput_val
- 4.6 hi_gpio_get_input_val
- 05. 延时函数
- 06. 附录
01. GPIO概述
功能简介
GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。
基本概念
GPIO又俗称为I/O口,I指的是输入(in),O指的是输出(out)。可以通过软件来控制其输入和输出,即I/O控制。
-
GPIO输入
输入是检测各个引脚上的电平状态,高电平或者低电平状态。常见的输入模式有:模拟输入、浮空输入、上拉输入、下拉输入。
-
GPIO输出
输出是当需要控制引脚电平的高低时需要用到输出功能。常见的输出模式有:开漏输出、推挽输出、复用开漏输出、复用推挽输出。
02. GPIO运行机制
在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。GPIO模块采用统一服务模式(如图1所示)。
在统一模式下,所有的控制器都被核心层统一管理,并由核心层统一发布一个服务供接口层,因此这种模式下驱动无需再为每个控制器发布服务。
GPIO模块各分层作用:
- 接口层:提供操作GPIO管脚的标准方法。
- 核心层:提供GPIO管脚资源匹配,GPIO管脚控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互,供芯片厂家快速接入HDF框架。
- 适配层:由驱动适配者将钩子函数的功能实例化,实现与硬件相关的具体功能。
图 GPIO统一服务模式结构图
03. GPIO相关类型
相关类型在hi_io.h
或者hi_gpio.h
文件中
3.1 hi_io_name
/**
* @ingroup iot_io
*
* GPIO pin ID. CNcomment:IO硬件管脚编号。CNend
*/
typedef enum {
HI_IO_NAME_GPIO_0, /**< GPIO0 */
HI_IO_NAME_GPIO_1, /**< GPIO1 */
HI_IO_NAME_GPIO_2, /**< GPIO2 */
HI_IO_NAME_GPIO_3, /**< GPIO3 */
HI_IO_NAME_GPIO_4, /**< GPIO4 */
HI_IO_NAME_GPIO_5, /**< GPIO5 */
HI_IO_NAME_GPIO_6, /**< GPIO6 */
HI_IO_NAME_GPIO_7, /**< GPIO7 */
HI_IO_NAME_GPIO_8, /**< GPIO8 */
HI_IO_NAME_GPIO_9, /**< GPIO9 */
HI_IO_NAME_GPIO_10, /**< GPIO10 */
HI_IO_NAME_GPIO_11, /**< GPIO11 */
HI_IO_NAME_GPIO_12, /**< GPIO12 */
HI_IO_NAME_GPIO_13, /**< GPIO13 */
HI_IO_NAME_GPIO_14, /**< GPIO14 */
HI_IO_NAME_SFC_CSN, /**< SFC_CSN */
HI_IO_NAME_SFC_IO1, /**< SFC_IO1 */
HI_IO_NAME_SFC_IO2, /**< SFC_IO2 */
HI_IO_NAME_SFC_IO0, /**< SFC_IO0 */
HI_IO_NAME_SFC_CLK, /**< SFC_CLK */
HI_IO_NAME_SFC_IO3, /**< SFC_IO3 */
HI_IO_NAME_MAX,
} hi_io_name;
3.2 hi_io_func_gpio
/**
* @ingroup iot_io
*
* GPIO_0 pin function.CNcomment:GPIO_0管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_0_GPIO,
HI_IO_FUNC_GPIO_0_UART1_TXD = 2,
HI_IO_FUNC_GPIO_0_SPI1_CK,
HI_IO_FUNC_GPIO_0_JTAG_TDO,
HI_IO_FUNC_GPIO_0_PWM3_OUT,
HI_IO_FUNC_GPIO_0_I2C1_SDA,
} hi_io_func_gpio_0;
/**
* @ingroup iot_io
*
* GPIO_1 pin function.CNcomment:GPIO_1管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_1_GPIO,
HI_IO_FUNC_GPIO_1_UART1_RXD = 2,
HI_IO_FUNC_GPIO_1_SPI1_RXD,
HI_IO_FUNC_GPIO_1_JTAG_TCK,
HI_IO_FUNC_GPIO_1_PWM4_OUT,
HI_IO_FUNC_GPIO_1_I2C1_SCL,
HI_IO_FUNC_GPIO_1_BT_FREQ,
} hi_io_func_gpio_1;
/**
* @ingroup iot_io
*
* GPIO_2 pin function.CNcomment:GPIO_2管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_2_GPIO,
HI_IO_FUNC_GPIO_2_UART1_RTS_N = 2,
HI_IO_FUNC_GPIO_2_SPI1_TXD,
HI_IO_FUNC_GPIO_2_JTAG_TRSTN,
HI_IO_FUNC_GPIO_2_PWM2_OUT,
HI_IO_FUNC_GPIO_2_SSI_CLK = 7,
} hi_io_func_gpio_2;
/**
* @ingroup iot_io
*
* GPIO_3 pin function.CNcomment:GPIO_3管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_3_GPIO,
HI_IO_FUNC_GPIO_3_UART0_TXD,
HI_IO_FUNC_GPIO_3_UART1_CTS_N,
HI_IO_FUNC_GPIO_3_SPI1_CSN,
HI_IO_FUNC_GPIO_3_JTAG_TDI,
HI_IO_FUNC_GPIO_3_PWM5_OUT,
HI_IO_FUNC_GPIO_3_I2C1_SDA,
HI_IO_FUNC_GPIO_3_SSI_DATA,
} hi_io_func_gpio_3;
/**
* @ingroup iot_io
*
* GPIO_4 pin function.CNcomment:GPIO_4管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_4_GPIO,
HI_IO_FUNC_GPIO_4_UART0_RXD = 2,
HI_IO_FUNC_GPIO_4_JTAG_TMS = 4,
HI_IO_FUNC_GPIO_4_PWM1_OUT,
HI_IO_FUNC_GPIO_4_I2C1_SCL,
} hi_io_func_gpio_4;
/**
* @ingroup iot_io
*
* GPIO_5 pin function.CNcomment:GPIO_5管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_5_GPIO,
HI_IO_FUNC_GPIO_5_UART1_RXD = 2,
HI_IO_FUNC_GPIO_5_SPI0_CSN,
HI_IO_FUNC_GPIO_5_PWM2_OUT = 5,
HI_IO_FUNC_GPIO_5_I2S0_MCLK,
HI_IO_FUNC_GPIO_5_BT_STATUS,
} hi_io_func_gpio_5;
/**
* @ingroup iot_io
*
* GPIO_6 pin function.CNcomment:GPIO_6管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_6_GPIO,
HI_IO_FUNC_GPIO_6_UART1_TXD = 2,
HI_IO_FUNC_GPIO_6_SPI0_CK,
HI_IO_FUNC_GPIO_6_PWM3_OUT = 5,
HI_IO_FUNC_GPIO_6_I2S0_TX,
HI_IO_FUNC_GPIO_6_COEX_SWITCH,
} hi_io_func_gpio_6;
/**
* @ingroup iot_io
*
* GPIO_7 pin function.CNcomment:GPIO_7管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_7_GPIO,
HI_IO_FUNC_GPIO_7_UART1_CTS_N = 2,
HI_IO_FUNC_GPIO_7_SPI0_RXD,
HI_IO_FUNC_GPIO_7_PWM0_OUT = 5,
HI_IO_FUNC_GPIO_7_I2S0_BCLK,
HI_IO_FUNC_GPIO_7_BT_ACTIVE,
} hi_io_func_gpio_7;
/**
* @ingroup iot_io
*
* GPIO_8 pin function.CNcomment:GPIO_8管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_8_GPIO,
HI_IO_FUNC_GPIO_8_UART1_RTS_N = 2,
HI_IO_FUNC_GPIO_8_SPI0_TXD,
HI_IO_FUNC_GPIO_8_PWM1_OUT = 5,
HI_IO_FUNC_GPIO_8_I2S0_WS,
HI_IO_FUNC_GPIO_8_WLAN_ACTIVE,
} hi_io_func_gpio_8;
/**
* @ingroup iot_io
*
* GPIO_9 pin function.CNcomment:GPIO_9管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_9_GPIO,
HI_IO_FUNC_GPIO_9_I2C0_SCL,
HI_IO_FUNC_GPIO_9_UART2_RTS_N,
HI_IO_FUNC_GPIO_9_SDIO_D2,
HI_IO_FUNC_GPIO_9_SPI0_TXD,
HI_IO_FUNC_GPIO_9_PWM0_OUT,
HI_IO_FUNC_GPIO_9_I2S0_MCLK = 7,
} hi_io_func_gpio_9;
/**
* @ingroup iot_io
*
* GPIO_10 pin function.CNcomment:GPIO_10管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_10_GPIO,
HI_IO_FUNC_GPIO_10_I2C0_SDA,
HI_IO_FUNC_GPIO_10_UART2_CTS_N,
HI_IO_FUNC_GPIO_10_SDIO_D3,
HI_IO_FUNC_GPIO_10_SPI0_CK,
HI_IO_FUNC_GPIO_10_PWM1_OUT,
HI_IO_FUNC_GPIO_10_I2S0_TX = 7,
} hi_io_func_gpio_10;
/**
* @ingroup iot_io
*
* GPIO_11 pin function.CNcomment:GPIO_11管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_11_GPIO,
HI_IO_FUNC_GPIO_11_UART2_TXD = 2,
HI_IO_FUNC_GPIO_11_SDIO_CMD,
HI_IO_FUNC_GPIO_11_SPI0_RXD,
HI_IO_FUNC_GPIO_11_PWM2_OUT,
HI_IO_FUNC_GPIO_11_RF_TX_EN_EXT,
HI_IO_FUNC_GPIO_11_I2S0_RX,
} hi_io_func_gpio_11;
/**
* @ingroup iot_io
*
* GPIO_12 pin function.CNcomment:GPIO_12管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_12_GPIO,
HI_IO_FUNC_GPIO_12_UART2_RXD = 2,
HI_IO_FUNC_GPIO_12_SDIO_CLK,
HI_IO_FUNC_GPIO_12_SPI0_CSN,
HI_IO_FUNC_GPIO_12_PWM3_OUT,
HI_IO_FUNC_GPIO_12_RF_RX_EN_EXT,
HI_IO_FUNC_GPIO_12_I2S0_BCLK,
} hi_io_func_gpio_12;
/**
* @ingroup iot_io
*
* GPIO_13 pin function.CNcomment:GPIO_13管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_13_SSI_DATA,
HI_IO_FUNC_GPIO_13_UART0_TXD,
HI_IO_FUNC_GPIO_13_UART2_RTS_N,
HI_IO_FUNC_GPIO_13_SDIO_D0,
HI_IO_FUNC_GPIO_13_GPIO,
HI_IO_FUNC_GPIO_13_PWM4_OUT,
HI_IO_FUNC_GPIO_13_I2C0_SDA,
HI_IO_FUNC_GPIO_13_I2S0_WS,
} hi_io_func_gpio_13;
/**
* @ingroup iot_io
*
* GPIO_14 pin function.CNcomment:GPIO_14管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_14_SSI_CLK,
HI_IO_FUNC_GPIO_14_UART0_RXD,
HI_IO_FUNC_GPIO_14_UART2_CTS_N,
HI_IO_FUNC_GPIO_14_SDIO_D1,
HI_IO_FUNC_GPIO_14_GPIO,
HI_IO_FUNC_GPIO_14_PWM5_OUT,
HI_IO_FUNC_GPIO_14_I2C0_SCL,
} hi_io_func_gpio_14;
3.3 hi_io_pull
/**
* @ingroup iot_io
*
* GPIO pull-up configuration.CNcomment:IO上下拉功能CNend
*/
typedef enum {
HI_IO_PULL_NONE, /**< Disabled.CNcomment:无拉CNend */
HI_IO_PULL_UP, /**< Pull-up enabled.CNcomment:上拉CNend */
HI_IO_PULL_DOWN, /**< Pull-down enabled.CNcomment:下拉CNend */
HI_IO_PULL_MAX, /**< Invalid.CNcomment:无效值CNend */
} hi_io_pull;
3.4 hi_gpio_value
/**
* @ingroup iot_gpio
*
* I/O level. CNcomment:GPIO电平状态。CNend
*/
typedef enum {
HI_GPIO_VALUE0 = 0, /**< Low level.CNcomment:低电平CNend*/
HI_GPIO_VALUE1 /**< High level.CNcomment:高电平CNend*/
} hi_gpio_value;
3.5 hi_gpio_dir
/**
* @ingroup iot_gpio
*
* I/O direction. CNcomment:GPIO方向。CNend
*/
typedef enum {
HI_GPIO_DIR_IN = 0, /**< Input.CNcomment:输入方向CNend*/
HI_GPIO_DIR_OUT /**< Output.CNcomment:输出方向CNend*/
} hi_gpio_dir;
3.6 hi_gpio_int_type
/**
* @ingroup iot_gpio
*
* I/O interrupt trigger mode. This bit is used with HI_GPIO_INT_POLARITY.
CNcomment:GPIO中断触发方式,与hi_gpio_int_polarity配合使用。CNend
*/
typedef enum {
HI_INT_TYPE_LEVEL = 0, /**< The interrupt is triggered in level-sensitive mode. CNcomment:电平触发中断CNend */
HI_INT_TYPE_EDGE /**< Interrupt triggered at the rising edge or falling edge.CNcomment:边沿触发中断CNend */
} hi_gpio_int_type;
3.7 hi_gpio_int_polarity
/**
* @ingroup iot_gpio
*
* I/O interrupt polarity. This pin is used with HI_GPIO_INT.
CNcomment:IO中断极性,与hi_gpio_int_type配合使用。CNend
*/
typedef enum {
HI_GPIO_EDGE_FALL_LEVEL_LOW = 0, /**< Interrupt triggered at low level or falling edge.
CNcomment:低电平或下降沿触发中断CNend */
HI_GPIO_EDGE_RISE_LEVEL_HIGH /**< Interrupt triggered at high level or rising edge.
CNcomment:高电平或上升沿触发中断CNend */
} hi_gpio_int_polarity;
04. GPIO相关函数
GPIO 相关 API 函数文件在 D:\hi3861_hdu_iot_application\src\device\hisilicon\hispark_pegasus\sdk_liteos\include\hi_gpio.h
中,如下:
4.1 hi_gpio_init
/**
* @ingroup iot_gpio
* @brief Initializes GPIO module.CNcomment:GPIO模块初始化。CNend
*
* @par 描述:
* Initializes GPIO module.CNcomment:GPIO模块初始化。CNend
*
* @attention
* @li This API needs to be invoked during initialization to enable the GPIO interrupt so that the I/O interrupt
* can be responded.CNcomment:需要在初始化阶段调用该接口使能GPIO中断,使得IO中断可以得到响应。CNend
* @li This interface cannot be invoked repeatedly. It can be invoked only once in the initialization phase.
CNcomment:该接口不支持重复调用,只能在初始化阶段调用一次。CNend
*
* @param None
*
* @retval #0 Success.
* @retval #Other Failure. For details, see hi_errno.h.
* @par 依赖:
* @li hi_gpio.h:Describes GPIO APIs.CNcomment:文件用于描述GPIO相关接口。CNend
* @see None
*/
hi_u32 hi_gpio_init(hi_void);
4.2 hi_io_set_func
/**
* @ingroup iot_io
* @brief Sets the I/O multiplexing.CNcomment:配置某个IO的复用功能。CNend
*
* @par 描述:
* Sets the I/O multiplexing.CNcomment:配置某个IO的复用功能。CNend
*
* @attention None
* @param id [IN] type #hi_io_name,I/O index.CNcomment:硬件管脚。CNend
* @param val [IN] type #hi_u8,I/O multiplexing.See the functions below: CNcomment:IO复用功能。
根据待设置的硬件管脚,从如下枚举中选择相应功能。CNend
hi_io_func_gpio_0,
hi_io_func_gpio_1,
hi_io_func_gpio_2,
hi_io_func_gpio_3,
hi_io_func_gpio_4,
hi_io_func_gpio_5,
hi_io_func_gpio_6,
hi_io_func_gpio_7,
hi_io_func_gpio_8,
hi_io_func_gpio_9,
hi_io_func_gpio_10,
hi_io_func_gpio_11,
hi_io_func_gpio_12,
hi_io_func_gpio_13,
hi_io_func_gpio_14,
hi_io_func_sfc_csn,
hi_io_func_sfc_io_1,
hi_io_func_sfc_io_2,
hi_io_func_sfc_io_0,
hi_io_func_sfc_clk,
hi_io_func_sfc_io_3
*
* @retval 0 Success
* @retval #HI_ERR_GPIO_INVALID_PARAMETER Failure. Input invalid.
* @par 依赖:
* @li hi_io.h:Describes I/O APIs.CNcomment:文件用于描述IO相关接口。CNend
* @see hi_io_get_func。
*/
hi_u32 hi_io_set_func(hi_io_name id, hi_u8 val);
功能:
主要功能是设置指定 GPIO 引脚的功能
参数:
id:指定的 IO 号
val:配置的复用功能
返回值:
0 成功,1 失败
4.3 hi_io_set_pull
/**
* @ingroup iot_io
* @brief Enables the I/O pull-up.CNcomment:设置某个IO上下拉功能。CNend
*
* @par 描述:
* Enables the I/O pull-up.CNcomment:设置某个IO上下拉功能。CNend
*
* @attention None
* @param id [IN] type #hi_io_name,I/O index.CNcomment:硬件管脚。CNend
* @param val [IN] type #hi_io_pull,I/O pull-up enable.CNcomment:待设置的上下拉状态。CNend
*
* @retval 0 Success
* @retval #HI_ERR_GPIO_INVALID_PARAMETER Failure. Input invalid.
* @par 依赖:
* @li hi_io.h:Describes I/O APIs.CNcomment:文件用于描述IO相关接口。CNend
* @see hi_io_get_pull。
*/
hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val);
功能:
设置指定 IO 的管脚上下拉
参数:
id:指定的 IO 号
dir:GPIO 管脚上下拉
返回值:
0 成功,1 失败
4.4 hi_gpio_set_dir
/**
* @ingroup iot_gpio
* @brief Sets the direction of a single I/O pin.CNcomment:设置某个GPIO管脚方向。CNend
*
* @par 描述:
* Sets the direction of a single I/O pin.CNcomment:设置某个GPIO管脚方向。CNend
*
* @attention None
* @param id [IN] type #hi_gpio_idx,I/O index.CNcomment:GPIO索引。CNend
* @param dir [IN] type #hi_gpio_dir,I/O direction.CNcomment:GPIO方向。CNend
*
* @retval #0 Success.
* @retval #Other Failure. For details, see hi_errno.h.
* @par 依赖:
* @li hi_gpio.h:Describes GPIO APIs.CNcomment:文件用于描述GPIO相关接口。CNend
* @see hi_gpio_get_dir
*/
hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpio_dir dir);
功能:
设置指定 IO 的管脚方向
参数:
id:指定的 IO 号
dir:GPIO 管脚方向
返回值:
0 成功,1 失败
4.5 hi_gpio_set_ouput_val
/**
* @ingroup iot_gpio
* @brief Sets the output level of a single I/O pin.CNcomment:设置单个GPIO管脚输出电平状态。CNend
*
* @par 描述:
* Sets the output level of a single I/O pin.CNcomment:设置单个GPIO管脚输出电平状态。CNend
*
* @attention None
*
* @param id [IN] type #hi_gpio_idx,I/O index.CNcomment:GPIO索引。CNend
* @param val [IN] type #hi_gpio_value,output value. CNcomment:输出值。CNend
* @li 0:low level.CNcomment:低电平。CNend
* @li 1:high level.CNcomment:高电平。CNend
*
* @retval #0 Success.
* @retval #Other Failure. For details, see hi_errno.h.
* @par 依赖:
* @li hi_gpio.h:Describes GPIO APIs.CNcomment:文件用于描述GPIO相关接口。CNend
* @see hi_gpio_get_input_val。
*/
hi_u32 hi_gpio_set_ouput_val(hi_gpio_idx id, hi_gpio_value val);
功能:
设置指定 IO 的输出电平
参数:
id:指定的 IO 号
val:GPIO 管脚输出电平,0 为低电平,1 为高电平
返回值:
0 成功,1 失败
4.6 hi_gpio_get_input_val
/**
* @ingroup iot_gpio
* @brief Obtains the input level of a single I/O pin.CNcomment:获取某个IO管脚输入电平状态。CNend
*
* @par 描述:
* Obtains the input level of a single I/O pin.CNcomment:获取某个IO管脚输入电平状态。CNend
*
* @attention None
* @param id [IN] type #hi_gpio_idx,I/O index.CNcomment:GPIO索引。CNend
* @param val [OUT] type #hi_gpio_value*,Output value.CNcomment:输出值。CNend
* @li 0:low level.CNcomment:低电平。CNend
* @li 1:high level.CNcomment:高电平。CNend
*
* @retval #0 Success.
* @retval #Other Failure. For details, see hi_errno.h.
* @par 依赖:
* @li hi_gpio.h:Describes GPIO APIs.CNcomment:文件用于描述GPIO相关接口。CNend
* @see None
*/
hi_u32 hi_gpio_get_input_val(hi_gpio_idx id, hi_gpio_value *val);
功能:
读取指定 GPIO 管脚的高低电平
参数:
id:指定的 IO 号
val:返回读取的 GPIO 管脚电平值的指针,可定义一个变量接收。
返回值:
0 成功,1 失败
05. 延时函数
usleep 函数用于实现微秒级的延时,sleep 函数用于实现秒级的延时。它是 POSIX 标准的一部分,常用于 Unix、Linux 等操作系统,但在嵌入式系统中也可能通过兼容层或底层实现来提供。使用时需要添加<unistd.h>头文件。
函数原型:void usleep(unsigned long usec);
参数:usec 表示需要延时的微秒数。
函数原型:void sleep(unsigned long sec);
参数:sec 表示需要延时的毫秒数。