GPIO概述与配置原创
基于STM32F429II的GPIO配置与使用的代码示例,包括输入模式、输出模式和外部中断模式的实现。代码基于HAL库开发。
# GPIO输出模式
以下代码将GPIOA的第0引脚配置为推挽输出模式,并控制其输出高电平和低电平。
#include "stm32f4xx_hal.h"
void SystemClock_Config(void);
void GPIO_Init(void);
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
GPIO_Init(); // 初始化GPIO
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 设置GPIOA的第0引脚为高电平
HAL_Delay(1000); // 延时1秒
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 设置GPIOA的第0引脚为低电平
HAL_Delay(1000); // 延时1秒
}
}
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置GPIOA的第0引脚为推挽输出模式,无上拉下拉,速度为高速
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# GPIO输入模式
以下代码将GPIOB的第0引脚配置为输入模式,并读取其电平状态。
#include "stm32f4xx_hal.h"
void SystemClock_Config(void);
void GPIO_Init(void);
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
GPIO_Init(); // 初始化GPIO
while (1)
{
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET)
{
// 如果GPIOB的第0引脚为高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 点亮GPIOA的第0引脚
}
else
{
// 如果GPIOB的第0引脚为低电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 熄灭GPIOA的第0引脚
}
HAL_Delay(100); // 延时100ms
}
}
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOA和GPIOB时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// 配置GPIOA的第0引脚为推挽输出模式
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置GPIOB的第0引脚为输入模式,上拉
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# GPIO外部中断模式
以下代码将GPIOC的第13引脚配置为外部中断模式,当检测到下降沿时触发中断。
#include "stm32f4xx_hal.h"
void SystemClock_Config(void);
void GPIO_Init(void);
void EXTI15_10_IRQHandler(void);
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
GPIO_Init(); // 初始化GPIO
while (1)
{
// 主循环
}
}
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOC时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置GPIOC的第13引脚为输入模式,上拉
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 配置为下降沿中断
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 配置中断优先级
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
// 使能中断
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
void EXTI15_10_IRQHandler(void)
{
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESET) // 检查是否为GPIOC的第13引脚触发的中断
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13); // 清除中断标志位
// 中断处理代码
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); // 切换GPIOA的第0引脚电平
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 常见的GPIO输出模式
STM32的GPIO输出模式主要有以下几种,这些模式通过GPIO_InitTypeDef
结构体中的Mode
字段进行配置。以下是常见的输出模式及其特点:
# 1. 普通推挽输出(GPIO_MODE_OUTPUT_PP
)
- 特点:
- 推挽输出模式下,GPIO引脚可以输出高电平或低电平。
- 驱动能力较强,适合驱动LED、继电器等负载。
- 适用场景:
- 需要驱动外部设备(如LED灯、继电器等)。
- 需要快速切换电平的场合。
# 2. 普通开漏输出(GPIO_MODE_OUTPUT_OD
)
- 特点:
- 开漏模式下,GPIO引脚只能输出低电平或高阻态(浮空)。
- 需要通过外部上拉电阻将引脚拉高到高电平。
- 适合用于I²C通信、多设备共享总线等场景。
- 适用场景:
- I²C通信(SCL和SDA线)。
- 多设备共享总线,避免电平冲突。
- 需要通过外部上拉电阻控制电平的场合。
# 3. 复用推挽输出(GPIO_MODE_AF_PP
)
- 特点:
- 复用推挽模式下,GPIO引脚被配置为复用功能(如SPI、USART、PWM等),并以推挽方式输出。
- 驱动能力较强,适合高速信号传输。
- 适用场景:
- 配置为SPI的MOSI、USART的TX、PWM输出等复用功能时。
- 需要高速信号输出的场合。
# 4. 复用开漏输出(GPIO_MODE_AF_OD
)
- 特点:
- 复用开漏模式下,GPIO引脚被配置为复用功能(如I²C、CAN等),并以开漏方式输出。
- 需要通过外部上拉电阻将引脚拉高到高电平。
- 适用场景:
- I²C通信(SCL和SDA线)。
- 配置为CAN通信时。
- 其他需要开漏输出的复用功能。
# 5. 模拟模式(GPIO_MODE_ANALOG
)
- 特点:
- 模拟模式下,GPIO引脚被配置为模拟输入/输出功能。
- 通常用于ADC(模数转换)或DAC(数模转换)功能。
- 适用场景:
- 配置为ADC输入引脚时。
- 配置为DAC输出引脚时。
# 6. 备用功能(GPIO_MODE_IT_*
)
- 特点:
- GPIO引脚被配置为中断或事件检测功能(如上升沿、下降沿、双边沿中断)。
- 不是传统意义上的“输出模式”,但可以用于中断触发。
- 适用场景:
- 需要检测外部信号变化(如按键按下、信号跳变)时。
# 总结
STM32的GPIO输出模式主要包括普通推挽输出、普通开漏输出、复用推挽输出和复用开漏输出。选择哪种模式取决于你的具体需求:
- 推挽输出:适合驱动负载或需要快速切换电平的场合。
- 开漏输出:适合多设备共享总线或需要外部上拉电阻的场合。
- 复用功能:用于SPI、USART、I²C、PWM等外设功能。
- 模拟模式:用于ADC或DAC功能。
在实际开发中,需要根据具体的应用场景选择合适的GPIO模式。
# 注意事项
- 时钟配置:
SystemClock_Config()
函数需要根据你的硬件配置系统时钟,确保GPIO时钟正常工作。 - 中断优先级:在使用外部中断时,需合理配置中断优先级,避免影响系统稳定性。
- 延时函数:
HAL_Delay()
函数依赖于系统滴答定时器(SysTick),需要确保其已正确配置。
以上代码基于HAL库开发,适用于STM32F429II芯片。
上次更新: 2025/02/18 14:46:10
- 01
- 模板生成工具 原创02-18
- 02
- RTC实时时钟 原创02-12
- 03
- keil调试 原创01-21
- 04
- element-plus多文件手动上传 原创11-03
- 05
- TrueLicense 创建及安装证书 原创10-25