描述 #
该文件包含 CH32V00x 系列微控制器 GPIO 固件库的所有函数原型、常量定义、枚举类型和结构体定义。本库提供对 GPIO 引脚的初始化、读写、复用映射、外部中断配置等完整控制功能,支持推挽输出、开漏输出、上拉/下拉输入、模拟输入等多种工作模式,并兼容复用功能(AF)和引脚重映射(Remap)机制。所有引脚操作均基于位掩码设计,支持单引脚或组合引脚操作,适用于嵌入式系统中对 I/O 端口的高效、精确控制。
常量 #
GPIO_pins_define
#
GPIO 引脚选择掩码,每个引脚对应一个独立的位掩码,支持组合使用(如 GPIO_Pin_0 | GPIO_Pin_2)以同时配置多个引脚。GPIO_Pin_All 用于一次性配置所有可用引脚(0~7),适用于初始化或复位场景。该设计兼容标准 STM32 GPIO 模型,便于代码移植。
| 名称 | 值 | 简述 |
|---|---|---|
GPIO_Pin_0 |
0x0001 |
选择引脚 0 |
GPIO_Pin_1 |
0x0002 |
选择引脚 1 |
GPIO_Pin_2 |
0x0004 |
选择引脚 2 |
GPIO_Pin_3 |
0x0008 |
选择引脚 3 |
GPIO_Pin_4 |
0x0010 |
选择引脚 4 |
GPIO_Pin_5 |
0x0020 |
选择引脚 5 |
GPIO_Pin_6 |
0x0040 |
选择引脚 6 |
GPIO_Pin_7 |
0x0080 |
选择引脚 7 |
GPIO_Pin_All |
0xFFFF |
选择所有引脚(0~7) |
以上所有值都强制转换为
uint16_t
GPIO_Remap_define
#
引脚复用映射配置常量,用于重新映射外设信号到其他 GPIO 引脚,实现灵活的 PCB 布局。每个映射常量包含位置信息与映射类型,通过 GPIO_PinRemapConfig() 函数启用或禁用。部分映射(如 I2C1、USART1、TIM1/2)支持部分重映射(Partial)和完全重映射(Full),以适应不同封装引脚分布。GPIO_Remap_SDI_Disable 用于禁用 SDI 功能,避免与用户引脚冲突。
| 名称 | 值 | 简述 |
|---|---|---|
GPIO_Remap_SPI1 |
0x00000001 |
SPI1 重映射 |
GPIO_PartialRemap_I2C1 |
0x10000002 |
I2C1 部分重映射 |
GPIO_FullRemap_I2C1 |
0x10400002 |
I2C1 完全重映射 |
GPIO_PartialRemap1_USART1 |
0x80000004 |
USART1 部分重映射1 |
GPIO_PartialRemap2_USART1 |
0x80200000 |
USART1 部分重映射2 |
GPIO_FullRemap_USART1 |
0x80200004 |
USART1 完全重映射 |
GPIO_PartialRemap1_TIM1 |
0x00160040 |
TIM1 部分重映射1 |
GPIO_PartialRemap2_TIM1 |
0x00160080 |
TIM1 部分重映射2 |
GPIO_FullRemap_TIM1 |
0x001600C0 |
TIM1 完全重映射 |
GPIO_PartialRemap1_TIM2 |
0x00180100 |
TIM2 部分重映射1 |
GPIO_PartialRemap2_TIM2 |
0x00180200 |
TIM2 部分重映射2 |
GPIO_FullRemap_TIM2 |
0x00180300 |
TIM2 完全重映射 |
GPIO_Remap_PA1PA2 |
0x00008000 |
PA1 和 PA2 重映射 |
GPIO_Remap_ADC1_ETRGINJ |
0x00200002 |
ADC1 注入通道外部触发重映射 |
GPIO_Remap_ADC1_ETRGREG |
0x00200004 |
ADC1 常规通道外部触发重映射 |
GPIO_Remap_LSI_CAL |
0x00200080 |
LSI 校准信号重映射 |
GPIO_Remap_SDI_Disable |
0x00300400 |
禁用 SDI 功能 |
GPIO_Remap_PA1_2 |
GPIO_Remap_PA1PA2 |
GPIO_Remap_PA1PA2 的别名 |
以上所有值都强制转换为
uint32_t
GPIO_Port_Sources
#
外部中断(EXTI)或事件输出(Event Output)的端口源选择,用于指定哪个 GPIO 端口作为 EXTI 线的输入源。仅支持 A、C、D 三个端口,B 端口未被定义,可能因芯片引脚限制或功能保留。
| 名称 | 值 | 简述 |
|---|---|---|
GPIO_PortSourceGPIOA |
0x00 |
选择 GPIOA 作为端口源 |
GPIO_PortSourceGPIOC |
0x02 |
选择 GPIOC 作为端口源 |
GPIO_PortSourceGPIOD |
0x03 |
选择 GPIOD 作为端口源 |
以上所有值都强制转换为
uint8_t
GPIO_Pin_sources
#
外部中断(EXTI)的引脚源选择,与 GPIO_Port_Sources 配合使用,指定具体哪一位(07)连接到 EXTI 线。每个引脚源对应一个 EXTI 线(EXTI0EXTI7),实现独立中断触发。
| 名称 | 值 | 简述 |
|---|---|---|
GPIO_PinSource0 |
0x00 |
选择引脚 0 作为 EXTI 源 |
GPIO_PinSource1 |
0x01 |
选择引脚 1 作为 EXTI 源 |
GPIO_PinSource2 |
0x02 |
选择引脚 2 作为 EXTI 源 |
GPIO_PinSource3 |
0x03 |
选择引脚 3 作为 EXTI 源 |
GPIO_PinSource4 |
0x04 |
选择引脚 4 作为 EXTI 源 |
GPIO_PinSource5 |
0x05 |
选择引脚 5 作为 EXTI 源 |
GPIO_PinSource6 |
0x06 |
选择引脚 6 作为 EXTI 源 |
GPIO_PinSource7 |
0x07 |
选择引脚 7 作为 EXTI 源 |
以上所有值都强制转换为
uint8_t
枚举 #
GPIOSpeed_TypeDef
#
输出引脚的最大切换频率配置,直接影响驱动能力和功耗。频率越高,驱动能力越强,但电磁干扰(EMI)和功耗也越高。GPIO_Speed_50MHz 是对 GPIO_Speed_30MHz 的别名,用于兼容部分文档或代码习惯,实际硬件最大支持 30MHz。
| 名称 | 值 |
|---|---|
GPIO_Speed_10MHz |
1 |
GPIO_Speed_2MHz |
2 |
GPIO_Speed_30MHz |
3 |
GPIOMode_TypeDef
#
GPIO 引脚工作模式配置,决定引脚的电气行为。输入模式(AIN、IN_FLOATING、IPD、IPU)用于读取外部信号;输出模式(Out_OD、Out_PP)用于驱动负载;复用模式(AF_OD、AF_PP)用于连接内部外设(如 UART、SPI)。注意:GPIO_Mode_AIN 会禁用数字输入缓冲器,适用于模拟采集场景。
| 名称 | 值 |
|---|---|
GPIO_Mode_AIN |
0x0 |
GPIO_Mode_IN_FLOATING |
0x04 |
GPIO_Mode_IPD |
0x28 |
GPIO_Mode_IPU |
0x48 |
GPIO_Mode_Out_OD |
0x14 |
GPIO_Mode_Out_PP |
0x10 |
GPIO_Mode_AF_OD |
0x1C |
GPIO_Mode_AF_PP |
0x18 |
BitAction
#
位操作状态枚举,用于 GPIO_WriteBit() 等函数中指定写入值。Bit_SET 表示置高(输出 1),Bit_RESET 表示置低(输出 0),与标准库命名一致,提高代码可读性。
| 名称 | 值 |
|---|---|
Bit_RESET |
0 |
Bit_SET |
1 |
结构体 #
GPIO_InitTypeDef
#
GPIO 初始化结构体,用于批量配置一个或多个引脚的模式、速度和引脚选择。该结构体是 GPIO_Init() 函数的唯一输入参数,通过 GPIO_StructInit() 可初始化为默认值(浮空输入、2MHz 速度、所有引脚),便于快速配置。
| 名称 | 类型 | 简述 |
|---|---|---|
GPIO_Pin |
uint16_t |
指定要配置的 GPIO 引脚,可为 GPIO_Pin_0~GPIO_Pin_7 的组合或 GPIO_Pin_All |
GPIO_Speed |
GPIOSpeed_TypeDef |
指定引脚输出速度,影响驱动能力和功耗 |
GPIO_Mode |
GPIOMode_TypeDef |
指定引脚工作模式,决定电气行为(输入/输出/复用) |
函数 #
GPIO_DeInit
#
void GPIO_DeInit(GPIO_TypeDef *GPIOx)
将指定 GPIO 外设(A、C、D)的所有寄存器恢复为复位默认值。通过复位时钟实现,而非直接写寄存器,确保完全清除所有配置状态,避免残留设置干扰新配置。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要复位的 GPIO 外设,x 可为 A、C、D(B 未实现) |
返回值:
无
GPIO_AFIODeInit
#
void GPIO_AFIODeInit(void)
将复用功能(AFIO)寄存器(包括引脚重映射、EXTI 配置、事件输出)恢复为复位默认值。用于系统初始化阶段或切换功能前清除所有映射配置,防止冲突。
参数:
无
返回值:
无
GPIO_Init
#
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)
根据 GPIO_InitTypeDef 结构体配置指定 GPIO 外设的引脚模式、速度和引脚选择。支持同时配置多个引脚(通过位掩码),并自动处理上拉/下拉配置(IPU/IPD)。输出模式下,速度由 GPIO_Speed 字段决定;复用模式下,需确保 AFIO 已正确配置。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要配置的 GPIO 外设(A、C、D) |
GPIO_InitStruct |
GPIO_InitTypeDef * |
指向包含配置参数的结构体指针 |
返回值:
无
GPIO_StructInit
#
void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct)
将 GPIO_InitTypeDef 结构体的所有成员初始化为默认值:所有引脚(GPIO_Pin_All)、2MHz 速度、浮空输入模式。用于避免结构体中未初始化成员导致的不可预测行为。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIO_InitStruct |
GPIO_InitTypeDef * |
指向待初始化的结构体指针 |
返回值:
无
GPIO_ReadInputDataBit
#
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取指定 GPIO 引脚的当前输入电平。仅适用于输入模式(包括浮空、上拉、下拉、模拟),读取结果为 Bit_SET(高)或 Bit_RESET(低)。不适用于输出模式引脚。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要读取的 GPIO 外设(A、C、D) |
GPIO_Pin |
uint16_t |
指定要读取的引脚(0~7) |
返回值:
输入引脚的电平状态(Bit_SET 或 Bit_RESET)
GPIO_ReadInputData
#
uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx)
一次性读取指定 GPIO 外设所有引脚(0~7)的输入电平,返回 16 位值,低 8 位有效。适用于需要批量读取多个输入状态的场景,如按键矩阵扫描。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要读取的 GPIO 外设(A、C、D) |
返回值:
当前所有引脚的输入状态(低 8 位有效)
GPIO_ReadOutputDataBit
#
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取指定 GPIO 引脚的输出锁存器值,即最后一次写入的值,而非实际引脚电平。适用于调试或确认输出状态,但不能反映外部负载影响(如开漏输出被拉低时)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要读取的 GPIO 外设(A、C、D) |
GPIO_Pin |
uint16_t |
指定要读取的引脚(0~7) |
返回值:
输出锁存器的值(Bit_SET 或 Bit_RESET)
GPIO_ReadOutputData
#
uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx)
读取指定 GPIO 外设所有引脚的输出锁存器值,返回 16 位值,低 8 位有效。用于批量确认输出状态,常用于状态回读或调试。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要读取的 GPIO 外设(A、C、D) |
返回值:
所有引脚的输出锁存器值(低 8 位有效)
GPIO_SetBits
#
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
将指定引脚置高(输出 1),不影响其他引脚。内部使用 BSHR 寄存器实现,为原子操作,安全高效。支持多引脚同时置高。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要操作的 GPIO 外设(A、C、D) |
GPIO_Pin |
uint16_t |
指定要置高的引脚(可组合) |
返回值:
无
GPIO_ResetBits
#
void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
将指定引脚置低(输出 0),不影响其他引脚。内部使用 BCR 寄存器实现,为原子操作。支持多引脚同时置低。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要操作的 GPIO 外设(A、C、D) |
GPIO_Pin |
uint16_t |
指定要置低的引脚(可组合) |
返回值:
无
GPIO_WriteBit
#
void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
根据 BitVal 的值(Bit_SET 或 Bit_RESET)写入指定引脚。是 GPIO_SetBits() 和 GPIO_ResetBits() 的封装,适用于单引脚精确控制,代码语义清晰。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要操作的 GPIO 外设(A、C、D) |
GPIO_Pin |
uint16_t |
指定要写入的引脚(0~7) |
BitVal |
BitAction |
写入值:Bit_SET(高)或 Bit_RESET(低) |
返回值:
无
GPIO_Write
#
void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal)
一次性写入整个端口的输出值。PortVal 的低 8 位对应引脚 0~7,高 8 位被忽略。适用于需要快速更新多个输出引脚的场景(如 LED 显示、DAC 模拟输出)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要操作的 GPIO 外设(A、C、D) |
PortVal |
uint16_t |
要写入的端口值(低 8 位有效) |
返回值:
无
GPIO_PinLockConfig
#
void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
锁定指定引脚的配置寄存器,防止运行时被意外修改。一旦锁定,除非复位芯片,否则无法更改该引脚的模式或速度。常用于安全关键应用(如启动配置、调试接口保护)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIOx |
GPIO_TypeDef * |
选择要锁定的 GPIO 外设(A、C、D) |
GPIO_Pin |
uint16_t |
指定要锁定的引脚(可组合) |
返回值:
无
GPIO_PinRemapConfig
#
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
启用或禁用指定的引脚重映射功能。通过修改 AFIO 的 PCFR1 寄存器实现,支持 SPI1、I2C1、USART1、TIM1/2 等外设的引脚重定位。注意:重映射必须在 GPIO 初始化前完成,否则可能无效。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIO_Remap |
uint32_t |
选择要配置的重映射常量(如 GPIO_Remap_SPI1) |
NewState |
FunctionalState |
ENABLE(启用)或 DISABLE(禁用) |
返回值:
无
GPIO_EXTILineConfig
#
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
配置指定 GPIO 引脚作为外部中断(EXTI)线的输入源。必须与 EXTI 模块配合使用,用于触发中断。每个 EXTI 线(0~7)只能绑定一个端口,需在初始化前调用。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
GPIO_PortSource |
uint8_t |
选择端口源(GPIO_PortSourceGPIOA 等) |
GPIO_PinSource |
uint8_t |
选择引脚源(GPIO_PinSource0~GPIO_PinSource7) |
返回值:
无
GPIO_IPD_Unused
#
void GPIO_IPD_Unused(void)
为未使用的 GPIO 引脚配置为上拉输入,防止悬空引脚引入噪声或增加功耗。根据芯片型号(通过内部 ID 判断)自动配置不同端口的引脚,适用于量产固件,提升系统稳定性。
参数:
无
返回值:
无