I/O Level 标 FT 的就是 5V 电平兼容的 ;
功能 | 配置模式 | CNF1 | CNF0 | PxODR寄存器 |
---|---|---|---|---|
通用输出 | 推挽式(Push-Pull) | 0 | 0 | 0或1 |
通用输出 | 开漏(Open-Drain) | 0 | 1 | 0或1 |
复用功能输出 | 推挽式(Push-Pull) | 1 | 0 | 不使用 |
复用功能输出 | 开漏(Open-Drain) | 1 | 1 | 不使用 |
输入 | 模拟输入 | 0 | 0 | 不使用 |
输入 | 浮空输入 | 0 | 1 | 不使用 |
输入 | 下拉输入 | 1 | 0 | 0 |
输入 | 上拉输入 | 1 | 0 | 1 |
MODE1 | MODE0 | 意义 | 模式 |
---|---|---|---|
0 | 0 | 保留 | 输入 |
0 | 1 | 最大输出速度为10MHz | 输出 |
1 | 0 | 最大输出速度为20MHz | 输出 |
1 | 1 | 最大输出速度为50MHz | 输出 |
CRL/CRH寄存器值 | 功能 | 使用 |
---|---|---|
0X0 | 模拟输入模式 | ADC |
0X3 | 推挽输出模式 | 输出口,50M 速率 |
0X8 | 上/下拉输入模式 | 输入口 |
0XB | 复用输出 | 使用 IO 口的第二功能, 50M 速 |
CRH控制高8位I/O口,CRL控制低8位I/O口。
GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
上述函数有两个参数:
GPIO_InitTpyeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定的参数配置 GPIO
typedef enum
{
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 //复用推挽输出
}GPIOMode_TypeDef;
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
位 | 功能 |
---|---|
31:16 | 保留,始终为0 |
15:0 | IDR y y y[15:0]:端口输入数据 ( y = 0....15 y=0....15 y=0....15) |
要想知道某个 IO 口的电平状态,只要读这个寄存器,再看某个位的状态就可以。
这些位只能以字(16位)的形式读出。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint6_t GPIO_Pin)
例如要读GPIOA.5的电平状态:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
GPIOA->BSRR=1<<1;
GPIOA->BSRR=1<<(16+1)
通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数GPIO_SetBits()和函数 GPIO_ResetBits()来完成的 。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例如:要设置GPIOB.5 输出1:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
例如:要设置GPIOB.5 输出1:
GPIO_Resetits(GPIOB, GPIO_Pin_5);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 GPIOB,GPIOE 端口时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
LED0=1; //通过位带操作控制 LED0 的引脚 PB5 输出高电平
LED0=0; //通过位带操作控制 LED0 的引脚 PB5 输出低电平
GPIO_SetBits(GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 1,等同 LED0=1;
GPIO_ResetBits (GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 0,等同 LED0=0;
GPIOB->BRR=GPIO_Pin_5; //设置 GPIOB.5 输出 1,等同 LED0=1;
GPIOB->BSRR=GPIO_Pin_5; //设置 GPIOB.5 输出 0,等同 LED0=0;