GPIO全称通用输入输出接口,无论是低端单片机还是高端单片机,GPIO都是一个最基础的模块,如果没有GPIO,那么单片机就是一块废铁,GPIO是单片机跟外界通信的最重要的模块。GPIO一个最基础的功能是输出高低电平和接收外界的输入信号,也可以复用成其他功能,比如ADC、PWM、SPI功能等。
下面来了解一些STM32F4 GPIO的一些寄存器配置
GPIO的端口模式寄存器主要配置GPIO的模式,STM32F4X的GPIO模式有4种
输入模式 | 输出模式 | 复用模式 | 模拟模式 |
---|---|---|---|
读取GPIO的电平状态 | 将GPIO输出高低电平 | 将GPIO配置成其他功能,比如ADC、PWM、SPI功能 | 将GPIO设置成ADC模式 |
优点:
1.输出高低电平与电源电压基本没有压差;
2.高低电平驱动能力较强,一般数字芯片推挽
3.输出IO口驱动电流最大可到20mA;
4.电平切换速度快。
缺点:
不支持线与
优点:
1.可实现电平转换,输出电平取决于上拉电阻电源;
2.可以实现IO的线与;
缺点:
1.高电平驱动能力差,取决于外部上拉电阻;
2.电平切换速率取决于外部上拉电阻
GPIO 端口输出速度寄存器是设置GPIO的输出速度,可以设置4种输出速度,分别是2MHZ、25MHZ、50MHZ和100MHZ。
GPIO 端口置位/复位寄存器是设置GPIO的高低电平状态,当需要设置GPIO为高电平时,需要把该寄存器的低15位的某个bit设置为1,当需要设置GPIO为低电平时,需要把该寄存器的高15位的某个bit设置为1。
GPIO 端口输入数据寄存器是读取GPIO的电平状态,该寄存器是只读寄存器,只能读不能写。
1、第一步要先把GPIO的时钟打开
2、将GPIO引脚设置成输出模式
3、将GPIO引脚设置成高低电平
void bsp_led_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(LED_RED_GPIO_CLK,ENABLE); // 打开GPIOF时钟
GPIO_InitStruct.GPIO_Pin = LED_RED_GPIO_PIN; // GPIO引脚编号
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // GPIO模式配置成输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; // GPIO输出速度 2MHZ
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // GPIO设置成推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // GPIO不带上下拉
GPIO_Init(LED_RED_GPIO,&GPIO_InitStruct); // 初始化GPIO
}
void led_set_level(u8 level)
{
switch (level)
{
case LED_ON:
GPIO_SetBits(LED_RED_GPIO,LED_RED_GPIO_PIN); // 设置GPIO为高电平
break;
case LED_OFF:
GPIO_ResetBits(LED_RED_GPIO,LED_RED_GPIO_PIN); // 设置GPIO为低电平
break;
default:
break;
}
}
int main(void)
{
system_tick_init();
bsp_led_init();
while(1){
led_set_level(LED_ON);
delay_ms(1000);
led_set_level(LED_OFF);
delay_ms(1000);
}
}
STM32的厂家为了让用户更快地进行产品的开发,开放了一套叫库函数的开发模式,库函数就是屏蔽了寄存器操作,提高产品的开发速度。
/**
函数作用:初始化一个GPIO
GPIOx:GPIO引脚所在的GPIO组
GPIO_InitStruct:GPIO对象的结构体
**/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
/**
函数作用:设置GPIO电平为高
GPIOx:GPIO引脚所在的GPIO组
GPIO_Pin:GPIO引脚
**/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/**
函数作用:设置GPIO电平为低
GPIOx:GPIO引脚所在的GPIO组
GPIO_Pin:GPIO引脚
**/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
typedef struct
{
uint32_t GPIO_Pin; // GPIO引脚
GPIOMode_TypeDef GPIO_Mode; // GPIO 模式
GPIOSpeed_TypeDef GPIO_Speed; // GPIO输出速率
GPIOOType_TypeDef GPIO_OType; // GPIO输出类型
GPIOPuPd_TypeDef GPIO_PuPd; // GPIO上下拉模式
}GPIO_InitTypeDef;