编程随笔 编程随笔
  • 前端
  • 后端
  • 嵌入式
  • 星球项目
  • 开源项目
  • 海康AGV
  • 四向车
  • 工具类
  • 项目仓库

    • 部署仓库 (opens new window)
    • 代码仓库 (opens new window)
  • vuepress插件

    • 自动生成导航栏与侧边栏 (opens new window)
    • 评论系统 (opens new window)
    • 全文搜索 (opens new window)
    • 选项卡 (opens new window)
    • 自动生成sitemap (opens new window)
  • 自主开发插件

    • 批量操作frontmatter (opens new window)
    • 链接美化 (opens new window)
    • 折叠代码块 (opens new window)
    • 复制代码块 (opens new window)

liyao52033

走运时,要想到倒霉,不要得意得过了头;倒霉时,要想到走运,不必垂头丧气。心态始终保持平衡,情绪始终保持稳定,此亦长寿之道
  • 前端
  • 后端
  • 嵌入式
  • 星球项目
  • 开源项目
  • 海康AGV
  • 四向车
  • 工具类
  • 项目仓库

    • 部署仓库 (opens new window)
    • 代码仓库 (opens new window)
  • vuepress插件

    • 自动生成导航栏与侧边栏 (opens new window)
    • 评论系统 (opens new window)
    • 全文搜索 (opens new window)
    • 选项卡 (opens new window)
    • 自动生成sitemap (opens new window)
  • 自主开发插件

    • 批量操作frontmatter (opens new window)
    • 链接美化 (opens new window)
    • 折叠代码块 (opens new window)
    • 复制代码块 (opens new window)
  • 基础知识

    • GPIO概述与配置
      • GPIO输出模式
      • GPIO输入模式
      • GPIO外部中断模式
      • 常见的GPIO输出模式
      • 注意事项
    • keil调试
    • RTC实时时钟
  • 嵌入式
  • 基础知识
华总
2025-01-20
0
0
目录

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

# 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

# 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

# 常见的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模式。

# 注意事项

  1. 时钟配置:SystemClock_Config()函数需要根据你的硬件配置系统时钟,确保GPIO时钟正常工作。
  2. 中断优先级:在使用外部中断时,需合理配置中断优先级,避免影响系统稳定性。
  3. 延时函数:HAL_Delay()函数依赖于系统滴答定时器(SysTick),需要确保其已正确配置。

以上代码基于HAL库开发,适用于STM32F429II芯片。

#stm32
上次更新: 2025/02/18 14:46:10
keil调试

keil调试→

最近更新
01
jFlash使用 原创
03-24
02
中央仓库上传指南 原创
03-23
03
模板生成工具 原创
02-18
04
RTC实时时钟 原创
02-12
05
keil调试 原创
01-21
更多文章>
Copyright © 2023-2025 liyao52033  All Rights Reserved
备案号:鄂ICP备2023023964号-1    
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式