代码解读之GPIO_Adapter

读fsl_adapter_gpio.c 和 .h 代码

1. fsl_adapter_gpio.c

这个代码是一个包含头文件并定义与MCU中的GPIO(通用输入/输出)功能相关的一些宏的 C 源文件。它是为 NXP 公司制造的特定MCU编写的。

该文件包含以下头文件:

  • fsl_device_registers.h:包含设备特定的寄存器定义。
  • fsl_gpio.h:提供用于GPIO操作的API函数。
  • fsl_port.h:提供用于PORT(端口控制和中断)操作的API函数。
  • fsl_adapter_gpio.h:提供用于GPIO操作的适配器功能。 该文件还定义了一个组件ID,tools使用它。

该代码定义了两个宏:

  • HAL_GPIO_CLZ(x):计算32位数字x中前导零的数量,该数量用于确定GPIO引脚的bit位置。此宏的实现取决于用于编译代码的工具链。
  • HAL_GPIO_BSR(x):根据GPIO引脚掩码的值计算GPIO引脚的bit位置。此宏使用 HAL_GPIO_CLZ(x) 宏计算掩码中前导零的数量,然后从31中减去结果(因为GPIO引脚编号是从LSB到MSB进行计数)。

1.1 结构体hal_gpio_pin_thal_gpio_state_t

这些结构体定义了单片机中GPIO引脚的引脚配置和状态。

hal_gpio_pin_t结构体用于配置GPIO引脚的属性,具有以下字段:

  • port:一个整数值(0-7),指定引脚的PORT编号。
  • reserved:值为0的位域,用于填充。
  • pin:一个整数值(0-31),指定指定PORT内的引脚编号。
  • direction:一个整数值(0或1),指定引脚的方向(输入或输出)
  • trigger:一个整数值(0-7),指定在引脚上启用中断时的触发条件
  • reserved2:值为0的位域,用于填充。

hal_gpio_state_t结构体用于存储GPIO引脚的状态,具有以下字段:

  • next:指向链表中下一个元素的指针。
  • callback:指向回调函数的函数指针,当引脚上的中断被触发时将执行该函数
  • callbackParam:指向将传递给回调函数的数据的指针
  • direction:一个整数值(0或1),指定引脚的方向(输入或输出)。
  • level:一个整数值(0或1),指定引脚的当前逻辑电平。
  • port:一个整数值(0-7),指定引脚的PORT编号。
  • pin:一个整数值(0-31),指定指定PORT内的引脚编号。
  • trigger:一个整数值(0-7),指定在引脚上启用中断时的触发条件。

1.2 静态变量 static GPIO_Type *const s_GpioPort[] 和 static hal_gpio_state_t *s_GpioHead;

这个部分定义了函数的原型,这些函数将在源文件中使用,但在这种情况下没有原型。

该部分还定义了一些静态变量:

  • s_GpioPort:指向GPIO_Type结构体指针的数组。每个指针对应微控制器中的一个GPIO端口

  • s_GpioHead:指向hal_gpio_state_t结构体链表的头部的指针。此链表用于跟踪MCU中所有GPIO引脚的状态

1.3 函数 static void HAL_GpioInterruptHandle(uint8_t port)

这段代码片段是一个GPIO(通用输入/输出)驱动程序的C实现。代码定义了两个数据结构,hal_gpio_pin_thal_gpio_state_t,它们分别包含有关引脚配置和状态的信息。代码还定义了几个函数来处理中断和添加/删除GPIO状态节点的链接列表

  • HAL_GpioInterruptHandle函数:==通过迭代GPIO状态节点的链表并检查指定port上的任何pin是否触发了中断来处理GPIO中断。如果引脚发生中断,则该函数执行与该引脚相关联的回调函数==。

  • HAL_GpioConflictSearch函数:搜索GPIO状态节点的链表,**以检查引脚是否与已注册的引脚冲突**。仅当定义了HAL_GPIO_CONFLICT_CHECK_ENABLE宏并将其设置为大于零的值时,才使用此函数。

  • HAL_GpioAddItem函数:将新的GPIO状态节点添加到链接列表中。该函数首先检查新节点是否与已注册的引脚发生冲突,然后再将其添加到列表中。

  • HAL_GpioRemoveItem函数:从链接列表中删除GPIO状态节点。该函数通过遍历列表以查找指定的节点并将其删除。

总的来说,这段代码片段提供了GPIO驱动程序的基本实现,可用于配置和控制微控制器上的GPIO引脚。

这是HAL_GpioInterruptHandle函数的函数实现,该函数==负责处理GPIO中断==。

  1. 该函数接受一个参数port,该参数是发生中断的端口号。该函数首先遍历GPIO引脚状态结构的链表,以找到与端口号相对应的结构。如果找不到一个合适的结构,则函数将简单地返回。

  2. 接下来,该函数使用GPIO_GpioGetInterruptFlagsGPIO_PortGetInterruptFlags函数**检索在指定端口上发生的引脚中断的集合,具体取决于芯片是否具有每个引脚的个别GPIO中断标志。然后,该函数清除引发中断的引脚的中断标志**。

  3. 然后,该函数再次遍历GPIO引脚状态结构的链表,这次检查每个结构以查看它是否对应于触发中断的引脚之一。如果找到匹配项,则函数调用与引脚关联的回调函数来处理中断。

  4. 最后,该函数通过清除刚刚处理的引脚的中断标志来更新触发中断的引脚中断集。如果没有更多的中断需要处理,该函数将返回。

1.4 函数 static hal_gpio_status_t HAL_GpioConflictSearch(hal_gpio_state_t *head, uint8_t port, uint8_t pin)

这段代码定义了一个函数HAL_GpioConflictSearch,它通过遍历hal_gpio_state_t结构体的链表来**查找指定的端口和引脚与链表中现有的端口和引脚是否有冲突**。

  1. 该函数需要链表的头部(head)、端口号(port)和引脚号(pin)作为输入。

  2. 然后,它使用while循环遍历链表,检查是否有hal_gpio_state_t结构体的端口和引脚与输入的相同。

  3. 如果找到匹配的hal_gpio_state_t结构体,则该函数返回kStatus_HAL_GpioPinConflict,表示存在冲突。如果没有找到匹配的结构体,则函数返回kStatus_HAL_GpioSuccess,表示不存在冲突。

当预处理宏HAL_GPIO_CONFLICT_CHECK_ENABLE被定义且其值大于零时,才会编译此函数。

预处理指令,用于检查宏HAL_GPIO_CONFLICT_CHECK_ENABLE是否被定义,并且其值大于0。

如果该宏被定义并且其值大于0,那么#if#endif语句中的代码将会被编译,否则将被跳过。

1.5 函数 static hal_gpio_status_t HAL_GpioAddItem(hal_gpio_state_t **head, hal_gpio_state_t *node)

这个函数**将一个新的 GPIO 引脚添加到 GPIO 引脚的链表中**。它把链表头的指针和要添加的新 GPIO 引脚的指针作为输入参数。

该函数首先禁用全局中断,然后检查链表是否为空

  1. 如果它是空的,新的 GPIO 引脚将添加为链表的第一个元素。
  2. 否则,函数通过搜索链表来检查新的 GPIO 引脚是否与任何现有 GPIO 引脚冲突。
  3. 如果找到冲突,函数会重新启用全局中断并返回指示 GPIO 引脚冲突的错误状态。
  4. 如果没有发现冲突,则在链接列表的末尾添加新的 GPIO 引脚,并返回成功状态。
  5. 最后,在返回之前,该函数启用全局中断。

1.6 函数 static hal_gpio_status_t HAL_GpioRemoveItem(hal_gpio_state_t **head, hal_gpio_state_t *node)

此函数从 GPIO 引脚的链表中移除一个节点。它以列表的头**head和要移除的节点 *node作为输入,二者都是指向 hal_gpio_state_t 结构的指针。

该函数通过使用 DisableGlobalIRQ() 函数禁用中断并将 PRIMASK 寄存器的值存储在 regPrimask 中来启动。然后它使用 while 循环遍历列表,查找要删除的节点。一旦找到,它会更新指针以从列表中删除节点。如果要移除的节点是列表的头,则会更新 *head。

最后,该函数使用 EnableGlobalIRQ(regPrimask) 启用中断,并返回 kStatus_HAL_GpioSuccess

1.7 GPIOX_INT1_IRQHandler() 和 GPIOX_INT0_IRQHandler()

这些是设备上每个GPIO端口的中断处理程序函数。

它们是为了没有专门为每个GPIO端口提供中断处理程序的平台而实现的,这由 FSL_FEATURE_PORT_HAS_NO_INTERRUPT 宏指示。

对于每个GPIO端口,定义了两个中断处理程序,GPIOX_INT0_IRQHandler()GPIOX_INT1_IRQHandler()

  • GPIOX_INT0_IRQHandler()函数是端口的实际中断处理程序,并调用HAL_GpioInterruptHandle()函数来处理中断。
  • GPIOX_INT1_IRQHandler()函数是中断优先级配置的占位符,它只调用GPIOX_INT0_IRQHandler()函数。

SDK_ISR_EXIT_BARRIER宏用于在退出中断处理程序之前添加障碍,以确保在从中断返回之前完成所有存储器访问

1.8 PORTX_IRQHandler()

这是一系列针对 GPIO 端口的中断处理函数。

根据所使用的特定微控制器,这些功能将以前缀 GPIO 或 PORT 命名。 如果微控制器具有 GPIO 的“无中断”FSL_FEATURE_PORT_HAS_NO_INTERRUPT功能,则中断处理程序将使用 GPIO 前缀并具有类似 GPIOA_INT0_IRQHandler() 的名称。否则,中断处理程序将使用 PORT 前缀并具有类似于 PORTA_IRQHandler() 的名称。

每个中断处理函数负责处理特定 GPIO 端口的中断。例如,GPIOA_INT0_IRQHandler() 处理端口 A、引脚 0 的中断。 在每个中断处理函数中,HAL_GpioInterruptHandle() 以端口号作为参数被调用。此函数负责查找触发中断的引脚并调用任何已注册的回调。 **==SDK_ISR_EXIT_BARRIER 宏用于标记中断处理函数的结束。这是一种防止编译器在从中断返回后生成代码的方法,这可能会导致系统堆栈或中断处理出现问题==**。

1.9 函数 void HAL_GpioPreInit(void)

函数 HAL_GpioPreInit() 将全局指针 s_GpioHead 初始化为 NULL,用作包含每个已配置 GPIO 引脚的 GPIO 状态信息的链表的头部。

此函数通常在 GPIO 驱动程序初始化期间调用,**在添加或配置任何 GPIO 引脚之前**。

1.10 函数 hal_gpio_status_t HAL_GpioInit(hal_gpio_handle_t gpioHandle, hal_gpio_pin_config_t *pinConfig)

**这是用提供的配置,初始化GPIO引脚的功能实现**。

该函数使用gpioHandle参数表示GPIO引脚的句柄和使用pinConfig参数表示引脚的配置的指针。

该函数首先断言gpioHandlepinConfig参数不为null,并且gpioHandle参数的大小至少与hal_gpio_state_t结构的大小一样。然后将gpioHandle参数转换为指向hal_gpio_state_t结构的指针gpioState,该结构包含有关GPIO引脚状态的信息。

  1. 如果启用冲突检查HAL_GPIO_CONFLICT_CHECK_ENABLE,则该函数搜索GPIO引脚的链表,以确保指定端口和引脚没有冲突。如果发现冲突,则该函数返回kStatus_HAL_GpioPinConflict

  2. 然后,该函数使用HAL_GpioAddItem函数将GPIO引脚添加到GPIO引脚的链表中,并使用GPIO_PinInit函数设置GPIO方向和其他配置选项

  3. 最后,如果初始化成功,该函数返回kStatus_HAL_GpioSuccess

1.11 函数 hal_gpio_status_t HAL_GpioDeinit(hal_gpio_handle_t gpioHandle)

此函数负责**==取消初始化 GPIO 引脚==**。

它接收 GPIO 引脚的句柄,该句柄是在使用 HAL_GpioInit 函数初始化引脚时获得的。

  1. 首先,该函数使用断言检查输入 gpioHandle 是否不为 NULL
  2. 接下来,它使用 gpioHandle 获取指向 GPIO 状态结构的指针。
  3. 然后,如果 GPIO 引脚配置为输入引脚,则该函数通过使用 kHAL_GpioInterruptDisable 参数调用 HAL_GpioSetTriggerMode 来**==禁用其中断触发模式==**。
  4. 最后,函数使用HAL_GpioRemoveItem函数从链表s_GpioHead中移除GPIO管脚状态,返回kStatus_HAL_GpioSuccess表示操作成功。

1.12 函数 hal_gpio_status_t HAL_GpioGetInput(hal_gpio_handle_t gpioHandle, uint8_t *pinState)

**==此函数获取配置为输入的 GPIO 引脚的当前状态==**。

它需要一个 GPIO 引脚的句柄(表示为 hal_gpio_handle_t 类型)和一个指向变量的指针来存储引脚状态

在函数内部,它首先断言 gpioHandle 和 pinState 参数不为 NULL。**==然后它将 gpioHandle 转换为 hal_gpio_state_t 类型并使用 GPIO_PinRead 函数读取引脚状态。 GPIO_PinRead函数返回一个uint32_t类型,转换为uint8_t类型存储在pinState变量中。==**最后函数返回kStatus_HAL_GpioSuccess表示操作成功。

1.13 函数 hal_gpio_status_t HAL_GpioSetOutput(hal_gpio_handle_t gpioHandle, uint8_t pinState)

**此函数设置 GPIO 引脚的输出状态**。

它将要配置的 GPIO 引脚的句柄和指定要设置的输出状态(高电平或低电平)的值作为输入

该函数首先检查 GPIO 句柄是否为 NULL。然后它将句柄转换为 hal_gpio_state_t 指针并使用它来获取 GPIO 端口和引脚号。

最后,它使用 GPIO_PinWrite 函数设置 GPIO 引脚的输出状态,**该函数将 GPIO 端口、引脚号和输出值作为输入**。 该函数返回一个状态代码以指示操作是否成功。

1.14 函数 hal_gpio_status_t HAL_GpioInstallCallback(hal_gpio_handle_t gpioHandle, hal_gpio_callback_t callback, void *callbackParam)

**==此函数将回调函数及其关联参数安装到给定句柄指定的 GPIO 引脚==**。

该函数接受三个参数:

  • gpioHandle将要安装其回调函数的 GPIO 引脚的句柄。
  • callback:指向将要安装的回调函数的函数指针
  • callbackParam:指向将要传递给回调函数的参数的空指针。

该函数首先断言 gpioHandle 不为 NULL。然后它将句柄转换为 hal_gpio_state_t 指针,**并将 hal_gpio_state_t 结构的 callbackParamcallback 字段分别设置为 callbackParam 和 callback 的值。**

最后,该函数返回 kStatus_HAL_GpioSuccess。

安装回调函数后,当在 GPIO 引脚上触发中断时,GPIO 驱动程序可以调用它

GPIO 驱动在回调函数被调用时会将 callbackParam 参数传给回调函数。

应用程序可以使用此参数将上下文信息传递给回调函数

1.15 函数 hal_gpio_status_t HAL_GpioGetTriggerMode(hal_gpio_handle_t gpioHandle, hal_gpio_interrupt_trigger_t *gpioTrigger)

**==该函数用于获取某个GPIO引脚的中断触发方式==**。

该函数有两个参数:gpioHandle 和 gpioTrigger。

  • gpioHandle是GPIO引脚的句柄,用于标识GPIO引脚。
  • gpioTrigger 是一个指向 hal_gpio_interrupt_trigger_t 类型变量的指针,将用于返回 GPIO 引脚的中断触发模式

该函数首先检查 gpioHandle 参数是否有效。然后它将 gpioHandle 参数转换为指向 hal_gpio_state_t 结构的指针,该结构是 GPIO 驱动程序的内部状态结构。

**==然后该函数检查 GPIO 引脚是否配置为输入引脚,如果不是,则返回错误==**。

最后,**==该函数从 hal_gpio_state_t 结构中获取 GPIO 引脚的中断触发模式,并将其存储在 gpioTrigger 参数中==**。

如果函数成功完成,它会返回 kStatus_HAL_GpioSuccess。

1.16 函数 hal_gpio_status_t HAL_GpioSetTriggerMode(hal_gpio_handle_t gpioHandle, hal_gpio_interrupt_trigger_t gpioTrigger)

此函数设置 GPIO 引脚的中断触发模式。

它接受 GPIO 引脚的句柄,以及所需的中断触发模式。

  1. 该函数首先检查引脚的方向是否未设置为输出,**因为中断触发只能用于输入引脚**。
  2. 然后它将给定的触发模式映射到硬件平台的相应中断配置值。**它设置 GPIO 引脚的触发模式,并在 NVIC(嵌套向量中断控制器)中启用相应的中断**,优先级为 HAL_GPIO_ISR_PRIORITY(可能在代码库的其他地方定义)。
  3. 最后,它返回一个状态代码,指示操作是成功还是遇到错误。

1.17 函数 hal_gpio_status_t HAL_GpioWakeUpSetting(hal_gpio_handle_t gpioHandle, uint8_t enable)

==该函数是 GPIO 驱动程序的一部分,用于启用/禁用 GPIO 引脚的唤醒功能。==

当设备处于低功耗模式时,如果特定 GPIO 引脚上的唤醒功能已启用,则它可以被该引脚上的信号唤醒。

该函数有两个参数,一个 GPIO 句柄和一个启用标志。

GPIO 句柄用于标识要配置的特定 GPIO 引脚,而启用标志用于指定是启用还是禁用唤醒功能。

  1. 该函数首先断言 GPIO 句柄不为 NULL。
  2. **然后检查GPIO引脚方向是否输出。如果输出方向,则返回错误**。
  3. 然后它检查启用标志是否为 0,这意味着禁用唤醒功能。如果启用标志为 0,则返回错误。否则,它返回成功。

总的来说,该函数用于配置GPIO引脚的唤醒功能,确保输入参数有效。

1.18 函数 hal_gpio_status_t HAL_GpioEnterLowpower(hal_gpio_handle_t gpioHandle)

HAL_GpioEnterLowpower 的实现似乎是一个placeholder占位符函数,它返回kStatus_HAL_GpioSuccess而不执行任何实际操作。

==此函数很可能旨在由 HAL 库的用户实现,以提供特定于其应用程序的低功耗功能。==

1.19 函数 hal_gpio_status_t HAL_GpioExitLowpower(hal_gpio_handle_t gpioHandle)

**==此函数负责在退出低功耗模式后将 GPIO 引脚恢复为之前的配置==**。

它以一个 GPIO 句柄作为输入并返回一个状态代码,指示操作是否成功。

  • 该函数首先断言 GPIO 句柄有效。
  • 然后它从句柄中检索 GPIO 状态,并使用引脚方向(输入或输出)和默认值 0 初始化一个新的 GPIO 引脚配置对象。
    • 如果之前将引脚配置为输出,则新配置对象中的引脚方向将设置为输出。
  • 然后,该函数使用 GPIO_PinInit 函数使用新配置初始化 GPIO 引脚。
    • 如果该引脚之前被配置为输入,则该函数调用 HAL_GpioSetTriggerMode 函数来**恢复进入低功耗模式之前设置的中断触发模式**。
  • 最后,函数返回一个状态码,表示操作成功。

2. fsl_adapter_gpio.h

2.1. 引言

这是用于 GPIO(通用输入/输出)接口的 HAL(硬件抽象层)头文件的开头。它从许可证和标题保护开始。

  • header包括 fsl_common.h,它是在不同 SDK(软件开发工具包)组件之间共享的通用实用函数、结构和宏的集合。
  • 此外,如果定义了 SDK_OS_FREE_RTOS,它会包含 FreeRTOS.h,这是 FreeRTOS 操作系统的头文件。
  • header guard 定义为 HAL_GPIO_H 以防止多次包含同一头文件。

头文件为 GPIO 适配器提供定义和结构,它是位于供应商 (NXP) 提供的低级 GPIO 驱动程序之上的抽象层。 该文件提供了以下定义:

  • GPIO适配器版本
  • GPIO 冲突检查使能
  • GPIO适配器句柄大小
  • GPIO句柄定义宏
  • GPIO 适配器 ISR 优先级
  • GPIO 句柄类型 (hal_gpio_handle_t)
  • GPIO回调函数类型(hal_gpio_callback_t)
  • GPIO 中断触发类型 (hal_gpio_interrupt_trigger_t)
  • GPIO 状态代码 (hal_gpio_status_t)
  • GPIO 方向类型 (hal_gpio_direction_t)
  • GPIO 引脚配置结构 (hal_gpio_pin_config_t)

这个头文件定义了 GPIO 适配器,它是一个抽象 GPIO 接口的硬件特定细节的驱动程序。驱动程序提供 API 来配置和控制设备的 GPIO 引脚,例如**设置引脚的方向、读取或写入其值以及在引脚上启用中断**。 该文件以一些标准 C 语言定义开头,包括 GPIO 适配器句柄、回调函数、中断触发器、状态和方向的类型定义。这些类型在整个 GPIO 适配器驱动程序 API 中使用,以提供清晰一致的接口。

该文件还定义了一些宏,包括 GPIO 适配器驱动程序的版本号、GPIO 适配器句柄的大小以及启用或禁用 GPIO 冲突检查的标志。 最后,该文件包括 fsl_common.h 头文件,它提供了在 Freescale/NXP SDK 软件中使用的通用宏和定义,以及 FreeRTOS.h 头文件,它为正在使用的 FreeRTOS 操作系统提供 API。

这是 GPIO(通用输入/输出)适配器的头文件,用于配置和控制MCU上的 GPIO 引脚。 该文件定义了几种类型,包括 hal_gpio_handle_thal_gpio_callback_thal_gpio_interrupt_trigger_thal_gpio_status_thal_gpio_direction_t hal_gpio_pin_config_t

  • hal_gpio_handle_t是指向GPIO适配器句柄的指针,
  • hal_gpio_callback_t是用于回调的函数指针,
  • hal_gpio_interrupt_trigger_t定义了中断触发器,
  • hal_gpio_status_t定义了GPIO适配器的状态,
  • hal_gpio_direction_t定义了GPIO引脚的方向,
  • hal_gpio_pin_config_t是一个保存配置的结构GPIO 引脚的设置。

头文件还包含宏,例如

  • FSL_GPIO_ADAPTER_VERSION 指示驱动程序的版本,HAL_GPIO_CONFLICT_CHECK_ENABLE 启用/禁用 GPIO 冲突检查,以及
  • HAL_GPIO_HANDLE_SIZE 定义 GPIO 适配器句柄的大小。
  • 此外,头文件定义了一个宏 GPIO_HANDLE_DEFINE 来定义一个 4 字节对齐的 GPIO 句柄
  • 和一个宏 HAL_GPIO_ISR_PRIORITY 来定义 GPIO ISR(中断服务程序)的优先级。

2.2 预先初始化引脚 void HAL_GpioPreInit(void)

此函数初始化位于内存的 .bss 部分中的静态变量。这通常由 IDE 自动完成,但如果在自动清理 .bss 部分之前使用 GPIO 适配器,则可以使用此功能。 用户通常不需要调用此 API。代码注释中提供了一个示例来演示如何使用它。

  • 首先,调用 HAL_GpioPreInit() 函数,
  • 然后使用 GPIO_HANDLE_DEFINE 宏定义 GPIO 句柄。
  • 然后,使用所需的 GPIO 引脚配置定义并初始化 hal_gpio_pin_config_t 结构。
  • 最后,调用 HAL_GpioInit() 函数以使用先前定义的 GPIO 句柄以指定配置初始化 GPIO 引脚。
1
2
3
4
5
6
7
8
HAL_GpioPreInit();
GPIO_HANDLE_DEFINE(g_GpioHandle);
hal_gpio_pin_config_t config;
config.direction = kHAL_GpioDirectionOut;
config.port = 0;
config.pin = 0;
config.level = 0;
HAL_GpioInit((hal_gpio_handle_t)g_GpioHandle, &config);

2.3 初始化 hal_gpio_status_t HAL_GpioInit(hal_gpio_handle_t gpioHandle, hal_gpio_pin_config_t *pinConfig);

这是 GPIO(通用输入/输出)模块中的一个函数,它使用**==用户定义的设置初始化 GPIO 实例==**。该函数有两个参数:

  • gpioHandle:指向调用者分配的大小为HAL_GPIO_HANDLE_SIZE的内存空间的指针。句柄应该是 4 字节对齐的。用户可以通过两种方式定义句柄:
    • 使用 GPIO_HANDLE_DEFINE(gpioHandle)
    • uint32_t gpioHandle[((HAL_GPIO_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
  • pinConfig:指向 hal_gpio_pin_config_t 类型的用户定义配置结构的指针,**该结构保存 GPIO 的配置。该结构有四个字段**:
    • direction:GPIO的方向,输出可以设置为kHAL_GpioDirectionOut,输入可以设置为kHAL_GpioDirectionIn
    • port:GPIO 端口号。
    • pin:GPIO 引脚号。
    • level:**GPIO的初始值,可设置为0或1**。
  • 该函数返回以下状态代码之一:
    • kStatus_HAL_GpioError:初始化 GPIO 时发生错误。
    • kStatus_HAL_GpioPinConflict:pinConfig 传递的pin 和port 对已经初始化,所以conflict。
    • kStatus_HAL_GpioSuccess:GPIO 初始化成功。
1
2
3
4
5
6
7
GPIO_HANDLE_DEFINE(g_GpioHandle);
hal_gpio_pin_config_t config;
config.direction = kHAL_GpioDirectionOut;
config.port = 0;
config.pin = 0;
config.level = 0;
HAL_GpioInit((hal_gpio_handle_t)g_GpioHandle, &config);

2.4 取消初始化 HAL_GpioDeinit(hal_gpio_handle_t gpioHandle)

HAL_GpioDeinit 函数用于取消初始化 GPIO 实例。**==它禁用触发模式==**。

1
hal_gpio_status_t HAL_GpioDeinit(hal_gpio_handle_t gpioHandle);
  • gpioHandle:GPIO句柄指针。句柄应该是 4 字节对齐的,因为某些设备不支持未对齐的访问。

如果 GPIO 去初始化成功,该函数返回 kStatus_HAL_GpioSuccess。

2.5 获取输入引脚状态 HAL_GpioGetInput()

此函数用于获取输入 GPIO 引脚的当前状态。通过 pinState 指针参数读取并返回引脚状态。 这是一个示例用法:

1
2
3
4
GPIO_HANDLE_DEFINE(g_GpioHandle);
uint8_t pinState;
HAL_GpioInit((hal_gpio_handle_t)g_GpioHandle, &config);
HAL_GpioGetInput((hal_gpio_handle_t)g_GpioHandle, &pinState);

==在此示例中,已使用 HAL_GpioInit() 初始化 GPIO 引脚,然后使用 HAL_GpioGetInput() 读取引脚的当前状态。引脚的当前状态通过 pinState 指针参数返回。==

2.6 设置输出电平HAL_GpioSetOutput

这是 HAL_GpioSetOutput 函数的函数定义。此函数**==将 GPIO 引脚的电压电平设置为指定值==**。下面简单解释一下参数和返回值:

  • gpioHandle:这是一个指向GPIO句柄对象的指针,表示设备上的一个特定的GPIO引脚。句柄应该是 4 字节对齐的,以确保正确的内存访问。
  • pinState:这是一个 8 位无符号整数,表示 GPIO 引脚的所需电压电平。值为 0 表示低电压电平,而值为 1 表示高电压电平。
  • 返回值:该函数返回一个hal_gpio_status_t类型的值,代表操作成功或失败。如果操作成功,函数返回 kStatus_HAL_GpioSuccess。

2.7 获取Pin中断触发模式 HAL_GpioGetTriggerMode

函数 HAL_GpioGetTriggerMode **==获取引脚中断触发模式==**。

触发模式由枚举类型hal_gpio_interrupt_trigger_t表示,可以是以下值之一:

  • kHAL_GpioInterruptTriggerLowLevel:低电平触发中断
  • kHAL_GpioInterruptTriggerHighLevel:高电平触发中断
  • kHAL_GpioInterruptTriggerRisingEdge:上升沿触发中断
  • kHAL_GpioInterruptTriggerFallingEdge:下降沿触发中断
  • kHAL_GpioInterruptTriggerEitherEdge:在任一边沿触发中断

**==如果引脚配置为输出,函数返回 kStatus_HAL_GpioError==**。

该函数有两个参数:

  • gpioHandle:GPIO句柄指针。
  • gpioTrigger:保存管脚触发模式值的指针。

该函数返回以下状态代码之一:

  • kStatus_HAL_GpioSuccess:引脚触发模式已成功检索。
  • kStatus_HAL_GpioError:引脚配置为输出。

2.8 设置触发模式 HAL_GpioSetTriggerMode

HAL_Gpio* 函数是硬件抽象层 (HAL) 库的一部分,用于与微控制器上的 GPIO(通用输入/输出)引脚进行交互。 GPIO 引脚可用于多种用途,例如控制 LED 或读取按钮按下情况。

  • HAL_GpioPreInit() 函数用于初始化位于 .bss 部分的静态变量。该变量将用于存储 GPIO 引脚的配置信息。通常不需要此功能,仅在某些情况下使用,例如在 .bss 部分被 IDE 自动清理之前使用 GPIO 适配器时。
  • HAL_GpioInit() 函数使用 GPIO 句柄和用户配置结构初始化 GPIO 实例。用户可以配置配置结构来设置引脚方向(输入或输出)、端口号、引脚号和初始引脚电平。 gpioHandle参数是一个指向调用者分配的内存空间的指针,用于存储GPIO实例的信息。
  • HAL_GpioDeinit() 函数通过禁用触发模式来取消初始化 GPIO 实例。当不再需要 GPIO 引脚时,应调用此函数。
  • HAL_GpioGetInput() 函数获取输入 GPIO 引脚的电压电平。电压电平在 pinState 参数中返回。
  • HAL_GpioSetOutput() 函数设置输出 GPIO 引脚的电压电平。所需的电压电平在 pinState 参数中传递。
  • HAL_GpioGetTriggerMode() 函数获取 GPIO 引脚的中断触发模式。触发模式决定了是什么导致在引脚上产生中断,例如上升沿或下降沿。触发模式在 gpioTrigger 参数中返回。
  • HAL_GpioSetTriggerMode() 函数设置 GPIO 引脚的中断触发模式。所需的触发模式在 gpioTrigger 参数中传递。

2.9 HAL_GpioInstallCallback()

该函数用于**为GPIO模块安装一个回调函数及其对应的参数**。

当引脚状态中断发生时,驱动会通过调用已安装的回调函数通知上层。 GPIO管脚状态可以通过回调函数内部调用函数HAL_GpioGetInput()获取。 该函数采用三个参数:

  • gpioHandle:GPIO句柄指针。
  • callback:要安装的回调函数。
  • callbackParam:回调函数的参数。

该函数返回一个状态代码,指示回调是否已成功安装。如果成功,返回值为 kStatus_HAL_GpioSuccess。

2.10 HAL_GpioWakeUpSetting()

HAL_GpioWakeUpSetting 函数**==启用或禁用 GPIO 唤醒功能==**。

此功能允许系统**通过 GPIO 引脚状态的变化从低功耗模式唤醒**。

该函数采用 gpioHandle 参数,该参数是指向 GPIO 句柄的指针。句柄应该是 4 字节对齐的,因为某些设备不支持未对齐的访问。

enable 参数是一个布尔值,指示是启用还是禁用唤醒功能。值 1 启用该功能,而值 0 禁用它。

该函数返回一个 hal_gpio_status_t 状态码,其中 kStatus_HAL_GpioSuccess 表示成功,kStatus_HAL_GpioError 表示发生错误。

2.11 HAL_GpioEnterLowpower()

根据提供的函数定义,函数 HAL_GpioEnterLowpower() 用于准备进入低功耗。但是,函数定义中并未指定为低功耗准备所采取的确切步骤。该**==函数很可能会执行必要的步骤将 GPIO 模块置于低功耗状态==**,例如禁用未使用的引脚或将时钟频率设置为较低的值。

在定义此函数的 HAL 库的文档或源代码中可能会提供更多信息。

2.12 HAL_GpioExitLowpower()

这两个函数 HAL_GpioEnterLowpower 和 HAL_GpioExitLowpower 似乎是用于管理低功耗的更大系统的一部分。 GPIO 模块用于控制系统的唤醒行为,这些函数可能分别用于准备 GPIO 模块进入低功耗模式和从低功耗模式恢复。

HAL_GpioEnterLowpower 可以执行诸如禁用 GPIO 中断、将 GPIO 引脚设置为低功耗状态或降低 GPIO 模块的时钟频率以节省电量等操作。

HAL_GpioExitLowpower 可能会执行 HAL_GpioEnterLowpower 的反向操作,例如恢复 GPIO 中断,将 GPIO 引脚恢复到之前的状态,或者提高 GPIO 模块的时钟频率以恢复正常操作。

总体而言,这些功能似乎是用于管理功耗和唤醒行为的更大系统的一部分,而不是独立的 GPIO 功能。

作者

Gavin

发布于

2023-03-20

更新于

2023-03-20

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×