CH32F207固件库函数说明——GPIO
- 1. 相关结构体&宏定义
- 2. 枚举类型(enum)
- 3. 结构体(struct)
- 4. 宏定义(#define)
- 5. 函数说明
- 5.1 void GPIO_DeInit(GPIO_TypeDef *GPIOx)
- 5.2 void GPIO_AFIODeInit(void)
- 5.3 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
- 5.4 void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
- 5.5 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 5.6 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
- 5.7 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 5.8 uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
- 5.9 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 5.10 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 5.11 void GPIO_WriteBit( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal )
- 5.12 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
- 5.13 void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- 6. 待补充函数
- 6.1 void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
- 6.2 void GPIO_EventOutputCmd(FunctionalState NewState)
- 6.3 void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
- 6.4 void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
- 6.5 void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface)
1. 相关结构体&宏定义
1.1 GPIO_TypeDef *
typedef struct
{
__IO uint32_t CFGLR; //GPIO 配置寄存器低位
__IO uint32_t CFGHR; //GPIO 配置寄存器高位
__IO uint32_t INDR; //端口输入寄存器
__IO uint32_t OUTDR; //端口输出寄存器
__IO uint32_t BSHR; //端口复位/置位寄存器
__IO uint32_t BCR; //端口复位寄存器
__IO uint32_t LCKR; //配置锁定寄存器
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
GPIO_TypeDef 定义了GPIO的所有寄存器,并已经预定义GPIOx[A…G]端口,对于GPIO_TypeDef *的参数,直接使用GPIOx即可。如需访问寄存器可使用GPIOx->指向寄存器
1.2 GPIOx寄存器
不建议直接读写寄存器,最好使用GPIO相关库函数
1.2.1 CFGLR
GPIO 配置寄存器低位,配置0-7引脚的输入输出模式。寄存器共32位,每4位配置一个引脚,低两位控制输出速度或输入模式,高两位控制具体输入输出模式,以Pin_0为例:
CFGLR[3:2] | CFGLR[1:0] | ||
CNF0.1 | CNF0.0 | MODE0.1 | MODE0.0 |
MODE:默认值为00b
值 | 描述 |
---|---|
00 | 输入模式 |
01 | 输出模式,最大速度10MHz |
10 | 输出模式,最大速度2MHz |
11 | 输出模式,最大速度50MHz |
CNF:默认值为01b
MODE | 值 | 描述 |
00 | 00 | 模拟输入 |
01 | 浮空输入 | |
10 | 带有上下拉 | |
11 | 保留 | |
>00 | 00 | 通用推挽输出 |
01 | 通用开漏输出 | |
10 | 复用功能推挽输出 | |
11 | 复用功能开漏输出 |
示例程序:
//配置GPIOA.6为通用推挽输出,最大速度为50MHz
const uint32_t PP = 0b0011; //MODE=11(输出50MHz);CNF=00(输出模式下表示通用推挽输出)
//GPIOA->CFGLR |= (PP << (n * 4)); //n表示引脚位数(0...7)
GPIOA->CFGLR |= (PP << (6 * 4)); //n = 6,即GPIOA.6配置为通用推挽输出,最大速度为50MHz
//配置GPIOA.2为上下拉输入
const uint32_t IPUD = 0b1000; //MODE=00(输入模式);CNF=10(输入模式下表示带有上下拉)
//GPIOA->CFGLR |= (IPUD << (n * 4)); //n表示引脚位数(0...7)
GPIOA->CFGLR |= (IPUD << (2 * 4)); //n = 2,即GPIOA.2配置为上下拉输入
1.2.2 CFGHR
GPIO 配置寄存器高位,配置8-15引脚的输入输出模式。寄存器共32位,每4位配置一个引脚,低两位控制输出速度或输入模式,高两位控制具体输入输出模式,以Pin_8为例:
CFGHR[3:2] | CFGHR[1:0] | ||
CNF8.1 | CNF8.0 | MODE8.1 | MODE8.0 |
MODE:默认值为00b
值 | 描述 |
---|---|
00 | 输入模式 |
01 | 输出模式,最大速度10MHz |
10 | 输出模式,最大速度2MHz |
11 | 输出模式,最大速度50MHz |
CNF:默认值为01b
MODE | 值 | 描述 |
00 | 00 | 模拟输入 |
01 | 浮空输入 | |
10 | 带有上下拉 | |
11 | 保留 | |
>00 | 00 | 通用推挽输出 |
01 | 通用开漏输出 | |
10 | 复用功能推挽输出 | |
11 | 复用功能开漏输出 |
示例程序:
//配置GPIOA.10为复用推挽输出,最大速度为10MHz
const uint32_t AF_PP = 0b1001; //MODE=01(输出10MHz);CNF=10(输出模式下表示复用推挽输出)
//GPIOA->CFGHR |= (AF_PP << (n * 4)); //n+8表示引脚位数(0...7)
GPIOA->CFGHR |= (AF_PP << (2 * 4)); //n = 2, n + 8 = 10,即GPIOA.10配置为复用推挽输出,最大速度为10MHz
//配置GPIOA.13为模拟输入
const uint32_t AIN = 0b0000; //MODE=00(输入模式);CNF=00(输入模式下表示模拟输入)
//GPIOA->CFGHR |= (AIN << (n * 4)); //n+8表示引脚位数(0...7)
GPIOA->CFGHR |= (AIN << (5 * 4)); //n = 5,n + 8 = 15,即GPIOA.15配置为模拟输入
1.2.3 INDR
端口输入寄存器。高16位无效,低16位只读并只能以 16 位形式读出。读出的值就是对应位的高低状态。
示例程序:
//读取GPIOA的所有输入状态
uint16_t GPIOA_PortValue= GPIOA->INDR;
//读取GPIOA.8的输入状态
uint8_t GPIOA_8 = (GPIOA->INDR >> 8) & 0x1;
1.2.4 OUTDR
端口输出寄存器。高16位无效,低16位只能以16位的形式操作,IO口对外输出这些寄存器的值。
对于带有上下拉的输入模式:
0:下拉输入;
1:上拉输入。
示例程序:
//
1.2.5 BSHR
端口复位/置位寄存器。高16位控制端口的复位,低16位控制端口的置位。若同时置位和复位均为1,则置位有效,对应引脚置位。只能以32位的形式操作。
示例程序:
//
1.2.6 BCR
端口复位寄存器。高16位无效,低16位只能以16位的形式操作,对这些位置位会清除对应的OUTDR
位,写 0 不产生影响。
示例程序:
//通过端口复位寄存器复位GPIOA的所有引脚
GPIOA->BCR = 0xFFFF;
1.2.7 LCKR
配置锁定寄存器。
高15位无效。
LCKR.16位为锁定键,它可以通过特定的序列写入实现锁定,但它可以随时读出。它读出为 0 时表示未锁定生效,读出 1 时表示锁定生效,
低16位为1时表示锁定对应端口的配置。只能在 LCKK 未锁定前改变这些位。锁定的配置指的是配置寄存器 GPIOx_CFGLR 和GPIOx_CFGHR。
锁定键的写入顺序:写1-写0-写1-读0(-读1)最后一步非必要,但可以确认锁定键已激活。在写入序列时任何错误都不会使激活锁定,且在写入序列时,不能更改 LCK[15:0]的值。锁定生效后,只有在下次复位后才能更改端口的配置。
示例程序:
/*********************************************************************
* @fn GPIOA_Pin0_LockConfig
*
* @brief GPIOA.0引脚配置锁存寄存器.
*
* @return none
*/
void GPIOA_Pin0_LockConfig()
{
uint32_t tmp = 0x00010000;
tmp |= GPIO_Pin_0; //tmp = 0x00010001;tmp记录锁存的引脚为Pin_0
GPIOA->LCKR = tmp; //LCKR.16 = tmp.16 = 1; 锁存序列写1
GPIOA->LCKR = GPIO_Pin_0; //LCKE.16 = 0; 锁存系列写0
GPIOA->LCKR = tmp; //LCKR.16 = tmp.16 = 1; 锁存序列写1
tmp = GPIOA->LCKR; //tmp = 0x00000001; 锁存序列读0
tmp = GPIOA->LCKR; //tmp = 0x00010001; 锁存序列读1
//至此GPIOA.0状态锁存,如需更改GPIOA.0的状态应先解锁
//GPIOA->LCKR = 0;
}
2. 枚举类型(enum)
以下是CH32F207系列GPIO外设将使用到的枚举类型说明。
2.1 GPIOSpeed_TypeDef
GPIO引脚工作在输出模式(寄存器GPIOx_CFGLR,MODEx>00b)时的最大速度
参数 | 说明 |
---|---|
GPIO_Speed_10MHz | 10MHz |
GPIO_Speed_2MHz | 2MHz |
GPIO_Speed_50MHz | 50MHz |
2.2 GPIOMode_TypeDef
GPIO引脚工作模式
参数 | 说明 |
---|---|
GPIO_Mode_AIN | 模拟输入 |
GPIO_Mode_IN_FLOATING | 浮空输入 |
GPIO_Mode_IPD | 下拉输入 |
GPIO_Mode_IPU | 上拉输入 |
GPIO_Mode_Out_OD | 通用开漏输出 |
GPIO_Mode_Out_PP | 通用推挽输出 |
GPIO_Mode_AF_OD | 复用功能开漏输出 |
GPIO_Mode_AF_PP | 复用功能推挽输出 |
2.3 BitAction
位状态
参数 | 说明 |
---|---|
Bit_RESET | 复位 |
Bit_SET | 置位 |
3. 结构体(struct)
以下是CH32F207系列GPIO外设将使用到的结构体类型说明。
3.1 GPIO_InitTypeDef
用于初始化GPIO工作模式和输出速度
数据类型 | 数据名 | 说明 |
---|---|---|
uint16_t | GPIO_Pin | 指定要配置的 GPIO 引脚。此参数可以是GPIO_pins_define的任意值 |
GPIOSpeed_TypeDef | GPIO_Speed | 指定所选引脚的输出速度。此参数的值可以是GPIOSpeed_TypeDef的任意值 |
GPIOMode_TypeDef | GPIO_Mode | 指定所选引脚的工作模式。此参数的值可以是GPIOMode_TypeDef的任意值 |
4. 宏定义(#define)
以下是CH32F207系列GPIO外设将使用到的预定义说明。
4.1 GPIO_pins_define
常量名 | 说明 |
---|---|
GPIO_Pin_0 | GPIOx.0 |
GPIO_Pin_1 | GPIOx.1 |
GPIO_Pin_2 | GPIOx.2 |
GPIO_Pin_3 | GPIOx.3 |
GPIO_Pin_4 | GPIOx.4 |
GPIO_Pin_5 | GPIOx.5 |
GPIO_Pin_6 | GPIOx.6 |
GPIO_Pin_7 | GPIOx.7 |
GPIO_Pin_8 | GPIOx.8 |
GPIO_Pin_9 | GPIOx.9 |
GPIO_Pin_10 | GPIOx.10 |
GPIO_Pin_11 | GPIOx.11 |
GPIO_Pin_12 | GPIOx.12 |
GPIO_Pin_13 | GPIOx.13 |
GPIO_Pin_14 | GPIOx.14 |
GPIO_Pin_15 | GPIOx.15 |
GPIO_Pin_All | GPIOx_All_pin |
4.2 GPIO_Remap_define
重映射引脚定义
常量名 | 说明 | 重映射 | 默认映射 |
---|---|---|---|
GPIO_Remap_SPI1 | SPI1的重映射 | NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5 | NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7 |
GPIO_Remap_I2C1 | I2C1的重映射 | SCL/PB6,SDA/PB7 | SCL/PB8,SDA/PB9 |
GPIO_Remap_USART1 | USART1 映射配置低位(配合 GPIO_Remap_USART1_HighBit 使用) | 见下表 | 见下表 |
GPIO_Remap_USART2 | USART2 的重映射位 | CTS/PD3, RTS/PD4, TX/PD5 ,PX/PD6, CK/PD7 | CTS/PA0, RTS/PA1, TX/PA2 ,PX/PA3, CK/PA4 |
GPIO_PartialRemap_USART3 | USART3 的重映射位(部分映射) | TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14 | TX/PB10,RX/PB11,CK/PB12,CTS/PB13,RTS/PB14 |
GPIO_FullRemap_USART3 | USART3 的重映射位(完全映射) | TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12 | 同上 |
GPIO_PartialRemap_TIM1 | 定时器1的重映射 (部分映射) | ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1 | ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15 |
GPIO_FullRemap_TIM1 | 定时器1的重映射 (完全映射) | ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12 | 同上 |
GPIO_PartialRemap1_TIM2 | 定时器 2 的重映射(部分映射1) | ETR/PA15, CH1/PA15, CH2/PB3, CH3/PA2, CH4/PA3 | ETR/PA0, CH1/PA0, CH2/PA1, CH3/PA2, CH4/PA3 |
GPIO_PartialRemap2_TIM2 | 定时器 2 的重映射(部分映射2) | ETR/PA0, CH1/PA0, CH2/PA1, CH3/PB10, CH4/PB11 | 同上 |
GPIO_FullRemap_TIM2 | 定时器 2 的重映射(完全映射) | ETR/PA15, CH1/PA15, CH2/PB3, CH3/PB10, CH4/PB11 | 同上 |
GPIO_PartialRemap_TIM3 | 定时器 3的重映射(部分映射) | CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1 | CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1 |
GPIO_FullRemap_TIM3 | 定时器 3的重映射(完全映射) | CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9 | 同上 |
GPIO_Remap_TIM4 | 定时器 4的重映射 | CH1/PD12, CH2/PD13, CH3/PD14, CH4/PD15 | CH1/PB6, CH2/PB7, CH3/PB8, CH4/PB9 |
GPIO_Remap1_CAN1 | CAN1 复用功能重映射_1 | CAN1_RX/PB8, CAN1_TX/PB9 | CAN1_RX/PA11, CAN1_TX/PA12 |
GPIO_Remap2_CAN1 | CAN1 复用功能重映射_2 | CAN1_RX/PD0, CAN1_TX/PD1 | 同上 |
GPIO_Remap_PD01 | 引脚 PD0&PD1 重映射 | 引脚作为GPIO使用 | 引脚作为晶振引脚使用 |
GPIO_Remap_TIM5CH4_LSI | 定时器 5 通道的重映射 | 定时器 5 通道 4 映射至 LSI 内部时钟 | 定时器 5 通道 4 的重映射 |
GPIO_Remap_ADC1_ETRGINJ | ADC1 外部触发注入转换的重映射 | ADC1 外部触发注入转换与 TIM8_CH4 相连 | ADC1 外部触发注入转换与 EXTI15 相连 |
GPIO_Remap_ADC1_ETRGREG | ADC1 外部触发规则转换的重映射 | ADC1 外部触发规则转换与 TIM8_TRGO 相连 | ADC1 外部触发规则转换与 EXTI11 相连 |
GPIO_Remap_ADC2_ETRGINJ | ADC1 外部触发规则转换的重映射 | ADC2 外部触发注入转换与 TIM8_CH4 相连 | ADC2 外部触发注入转换与 EXTI15 相连 |
GPIO_Remap_ADC2_ETRGREG | ADC2 外部触发规则转换的重映射 | ADC2 外部触发规则转换与 TIM8_TRGO 相连 | ADC2 外部触发规则转换与 EXTI11 相连 |
GPIO_Remap_ETH | 以太网的重映射 | RX_DV-CRS_DV/PD8, RXD0/PD9, RXD1/PD10, RXD2/PD11, RXD3/PD12 | RX_DV-CRS_DV/PA7, RXD0/PC4, RXD1/PC5, RXD2/PB0, RXD3/PB1 |
GPIO_Remap_CAN2 | CAN2 重映射 | CAN2_RX/PB5, CAN2_TX/PB6 | CAN2_RX/PB12, CAN2_TX/PB13 |
GPIO_Remap_MII_RMII_SEL | MII 或 RMII 选择。配置内部的以太网 MAC 适用外部的 MII 接口还是 RMII 接口的收发器(PHY) | 配置以太网的 MAC 使用外部 RMII 接口的收发器(PHY) | 配置以太网的 MAC 使用外部 MII 接口的收发器(PHY) |
GPIO_Remap_SWJ_Disable | 这些位用以配置 SW 功能和跟踪功能的 IO 口。SWD(SDI)是访问内核的调试接口。系统复位后总是作为 SWD 端口。 | 关闭 SWD(SDI), 作为 GPIO 功能 | 启用 SWD(SDI) |
GPIO_Remap_SPI3 | SPI3 重映射 | NSS/PA4, SCK/PC10, MISO/PC11, MOSI/PC12 | NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5 |
GPIO_Remap_TIM2ITR1_PTP_SOF | TIM2 内部触发 1 重映射 | 在内部连接 TIM2_ITR1 至全速 USB OTG 的SOF 输出 | 在内部连接 TIM2_ITR1 至以太网的 PTP 输出 |
GPIO_Remap_PTP_PPS | 以太网的 PTP PPS 重映射 | PTP PPS 输出到 PB5 引脚 | PTP PPS 不输出到 PB5 引脚 |
GPIO_Remap_TIM8 | TIM8 的重映射 | ETR/PA0, CH1/PB6, CH2/PB7, CH3/PB8, CH4/PC13, BKIN/PB9, CH1N/PA13, CH2N/PA14, CH3N/PA15 | ETR/PA0, CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1 |
GPIO_PartialRemap_TIM9 | TIM9 的重映射(部分映射) | ETR/PA2, CH1/PA2, CH2/PA3, CH3/PA4, CH4/PC14, BKIN/PA1, CH1N/PB0, CH2N/PB1, CH3N/PB2 | ETR/PA2, CH1/PA2, CH2/PA3, CH3/PA4, CH4/PC4, BKIN/PC5, CH1N/PC0, CH2N/PC1, CH3N/PC2 |
GPIO_FullRemap_TIM9 | TIM9 的重映射(完全映射) | ETR/PD9, CH1/PD9, CH2/PD11, CH3/PD13, CH4/PD15, BKIN/PD14, CH1N/PD8, CH2N/PD10, CH3N/PD12 | 同上 |
GPIO_PartialRemap_TIM10 | TIM10 的重映射(部分映射) | ETR/PB11, CH1/PB3, CH2/PB4, CH3/PB5, CH4/PC15, BKIN/PB10, CH1N/PA5, CH2N/PA6, CH3N/PA7 | ETR/PC10, CH1/PB8, CH2/PB9, CH3/PC3, CH4/PC11, BKIN/PC12, CH1N/PA12, CH2N/PA13, CH3N/PA14 |
GPIO_FullRemap_TIM10 | TIM10 的重映射(完全映射) | ETR/PD0, CH1/PD1, CH2/PD3, CH3/PD5, CH4/PD7, BKIN/PE2, CH1N/PE3, CH2N/PE4, CH3N/PE5 | 同上 |
GPIO_Remap_FSMC_NADV | FSMC_NADV 重映射 | 禁止 FSMC NADV 输出 | FSMC NADV 映射到 PB7 |
GPIO_PartialRemap_USART4 | UART4 重映射(部分映射) | 未测试 | TX/PC10, RX/PC11 |
GPIO_FullRemap_USART4 | UART4 重映射(完全映射) | 未测试 | 同上 |
GPIO_PartialRemap_USART5 | UART5 重映射(部分映射) | TX/PB4, RX/PB5 | TX/PC12, RX/PD2 |
GPIO_FullRemap_USART5 | UART5 重映射(完全映射) | TX/PE8, RX/PE9 | 同上 |
GPIO_PartialRemap_USART6 | UART6 重映射(部分映射) | TX/PB8, RX/PB9 | TX/PC0, RX/PC1 |
GPIO_FullRemap_USART6 | UART6 重映射(完全映射) | TX/PE10, RX/PE11 | 同上 |
GPIO_PartialRemap_USART7 | UART7 重映射(部分映射) | TX/PA6, RX/PA7 | TX/PC2, RX/PC3 |
GPIO_FullRemap_USART7 | UART7 重映射(完全映射) | TX/PE12, RX/PE13 | 同上 |
GPIO_PartialRemap_USART8 | UART8 重映射(部分映射) | TX/PA14, RX/PA15 | TX/PC4, RX/PC5 |
GPIO_FullRemap_USART8 | UART8 重映射(完全映射) | TX/PE14, RX/PE15 | 同上 |
GPIO_Remap_USART1_HighBit | USART1 映射配置高位(配合 GPIO_Remap_USART1使用) | 见下表 | 见下表 |
[GPIO_Remap_USART1_HighBit : GPIO_Remap_USART1]具体映射规则如下
值 | 映射 |
---|---|
00b | 默认映射----CK/PA8, TX/PA9, RX/PA10, CTS/PA11, RTS/PA12 |
01b | CK/PA8, TX/PB6, RX/PB7, CTS/PA11, RTS/PA12 |
10b | CK/PA10, TX/PB15, RX/PA8, CTS/PA5, RTS/PA9 |
11b | CK/PA5, TX/PA6, RX/PA7, CTS/PC4, RTS/PC5 |
5. 函数说明
以下为CH32F207系列常用GPIO函数说明
5.1 void GPIO_DeInit(GPIO_TypeDef *GPIOx)
功能:将 GPIOx 外设寄存器初始化为其默认值
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef * | x可以是(A…G)中的任意值,用以选择初始化端口 |
返回值 | void | 无 |
示例程序:
//将GPIOA的所有外设寄存器初始化为默认值
GPIO_DeInit(GPIOA);
5.2 void GPIO_AFIODeInit(void)
功能:将复用引脚(重映射,事件控制和EXIT配置)初始化为其默认值
参数 | 数据类型 | 说明 |
---|---|---|
/ | void | 无 |
返回值 | void | 无 |
示例程序:
//重置所有复用引脚
GPIO_AFIODeInit();
5.3 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
功能:初始化指定GPIO配置信息
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef * | x可以是(A…G)中的任意值,用以选择初始化端口 |
GPIO_InitStruct | GPIO_InitTypeDef * | 指向一个包含指定GPIO配置信息的GPIO_InitTypeDef 结构体指针 |
返回值 | void | 无 |
示例程序:
/*********************************************************************
* @fn GPIO_Toggle_INIT
*
* @brief 将GPIOA.0配置为50MHz推挽输出
*
* @return none
*/
void GPIO_Toggle_INIT( void )
{
//新建GPIO_InitTypeDef 结构体实例
GPIO_InitTypeDef GPIO_InitStructure = {0};
//使能GPIOA的时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
//选择初始化引脚为Pin_0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//选择引脚模式为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//选择输出模式下最高速度为50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//配置GPIOA.0的初始化信息
GPIO_Init( GPIOA, &GPIO_InitStructure );
}
5.4 void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
功能:用GPIO_InitTypeDef结构体的默认值填充GPIO_InitStruct。
其默认值为:
GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; //端口所有引脚
GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; //输出模式下最高速度2MHz
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
参数 | 数据类型 | 说明 |
---|---|---|
GPIO_InitStruct | GPIO_InitTypeDef * | 指向一个包含GPIO配置信息的GPIO_InitTypeDef 结构体指针 ,该结构体将配置为默认值 |
返回值 | void | 无 |
示例程序:
/*********************************************************************
* @fn GPIO_Struct_INIT
*
* @brief 将GPIO_InitTypeDef结构体恢复默认值
*
* @return none
*/
//新建GPIO_InitTypeDef 结构体实例(全局变量)
GPIO_InitTypeDef GPIO_InitStructure = {0};
void GPIO_Struct_INIT( void )
{
//将GPIO_InitStructure恢复默认值
//GPIO_Pin = GPIO_Pin_All
//GPIO_Speed = GPIO_Speed_2MHz
//GPIO_Mode = GPIO_Mode_IN_FLOATING
GPIO_StructInit(&GPIO_InitStructure );
//配置GPIOA.All的初始化信息
GPIO_Init( GPIOA, &GPIO_InitStructure );
}
5.5 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功能:读取某一所选引脚的输入状态
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
GPIO_Pin | uint16_t | (0…15)中的任意值,用以指定读取的引脚(也可以使用GPIO_pin_define的宏定义,如GPIO_Pin_0) |
返回值 | uint8_t | 所选引脚的状态,1:有输入;0:无输入 |
备注 | GPIO_Pin不可以是GPIO_Pin_All,如需读取所有数据,应使用GPIO_ReadInputData函数 |
示例程序:
//根据GPIOA.0是否有输入做不同的事。Bit_SET = 1,Bit_RESET = 0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET)
{
//Do something;
}
else
{
//Do something else;
}
5.6 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
功能:读取所选端口的全部引脚输入状态
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
返回值 | uint16_t | 所选端口的所有状态,以16位无符号数输出,[bit15:bit0]~[pin15:pin0] |
示例程序:
//可用于矩阵键盘扫描
if(GPIO_ReadInputData(GPIOA) != 0xFFFF)
{
uint16_t temp = GPIO_ReadInputData(GPIOA);
switch(temp)
{
case 0xFFFE:/* Do something; */break;
/*case else*/
default:/* default action*/break;
}
}
5.7 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功能:读取某一所选引脚的输出状态
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
GPIO_Pin | uint16_t | (0…15)中的任意值,用以指定读取的引脚(也可以使用GPIO_pin_define的宏定义,如GPIO_Pin_0) |
返回值 | uint8_t | 所选引脚的状态,1:有输入;0:无输入 |
备注 | GPIO_Pin不可以是GPIO_Pin_All,如需读取所有数据,应使用GPIO_ReadOutputData函数 |
示例程序:
//根据GPIOA.0实际是否有输出做不同的事。Bit_SET = 1,Bit_RESET = 0;
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET)
{
//Do something;
}
else
{
//Do something else;
}
5.8 uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
功能:读取所选端口的全部引脚输出状态
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
返回值 | uint16_t | 所选端口的所有状态,以16位无符号数输出,[bit15:bit0]~[pin15:pin0] |
示例程序:
//可用于矩阵键盘扫描
if(GPIO_ReadOutputData(GPIOA) != 0xFFFF)
{
uint16_t temp = GPIO_ReadInputData(GPIOA);
switch(temp)
{
case 0xFFFE:/* Do something; */break;
/*case else*/
default:/* default action*/break;
}
}
5.9 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功能:置位某一选定引脚
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
GPIO_Pin | uint16_t | (0…15)中的任意值,用以指定读取的引脚(也可以使用GPIO_pin_define的宏定义,如GPIO_Pin_0) |
返回值 | uint8_t | 所选引脚的状态,1:有输入;0:无输入 |
备注 | GPIO_Pin不可以是GPIO_Pin_All,如需置位所有引脚,应使用GPIO_Write函数 |
示例程序:
//将GPIOA.0置位
GPIO_SetBits(GPIOA, GPIO_Pin_0);
5.10 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功能:复位某一选定引脚
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
GPIO_Pin | uint16_t | (0…15)中的任意值,用以指定读取的引脚(也可以使用GPIO_pin_define的宏定义,如GPIO_Pin_0) |
返回值 | uint8_t | 所选引脚的状态,1:有输入;0:无输入 |
备注 | GPIO_Pin不可以是GPIO_Pin_All,如需复位所有引脚,应使用GPIO_Write函数 |
示例程序:
//将GPIOA.0复位
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
5.11 void GPIO_WriteBit( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal )
功能:控制某一选定引脚的置位或复位
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
GPIO_Pin | uint16_t | (0…15)中的任意值,用以指定读取的引脚(也可以使用GPIO_pin_define的宏定义,如GPIO_Pin_0) |
BitVal | BitAction | Bit_SET:置位;Bit_RESET:复位 |
返回值 | void | 无 |
备注 | GPIO_Pin不可以是GPIO_Pin_All,如需配置所有引脚,应使用GPIO_Write函数 |
示例程序:
//将GPIOA.0置位
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
//将GPIOA.0复位
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
5.12 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
功能:根据参数控制所选端口的所有引脚状态
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
PortVal | uint16_t | 所选端口的所有状态按低位到高位组合成的16位无符号数,每一位0:复位;1:置位 |
返回值 | void | 无 |
示例程序:
//将[GPIOA.0-->GPIOA.7]置位[GPIOA.8-->GPIOA.15]复位
GPIO_Write(GPIOA, 0xFF00);
//将[GPIOA.0/2/4/6...]置位[GPIOA.1/3/5/7...]复位
GPIO_Write(GPIOA, 0x5555);
5.13 void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功能:锁存GPIO引脚状态
参数 | 数据类型 | 说明 |
---|---|---|
GPIOx | GPIO_TypeDef* | x可以是(A…G)中的任意值,用以选择读取引脚的端口 |
GPIO_Pin | uint16_t | (0…15)中的任意值,用以指定锁存的引脚(也可以使用GPIO_pin_define的宏定义,如GPIO_Pin_0) |
返回值 | void | 无 |
备注 | GPIO_Pin不可以是GPIO_Pin_All |
6. 待补充函数
6.1 void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
6.2 void GPIO_EventOutputCmd(FunctionalState NewState)
6.3 void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
6.4 void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)