【嵌入式开发学习】第5天:STM32 入门 + GPIO 驱动(从软件到硬件实操)

核心目标:从纯软件语法过渡到实际硬件开发,学会搭建 STM32 开发环境,理解 GPIO(通用输入输出口)原理,用 HAL 库实现 “LED 点亮 / 闪烁” 和 “按键控制 LED”—— 这是嵌入式开发 “从代码到实物” 的关键一步,让你真正看到代码控制硬件的效果。

一、STM32 与开发环境搭建(40 分钟,动手实操)

1. 为什么选 STM32?

STM32 是意法半导体(ST)的 32 位单片机(MCU),性价比高、资料丰富(官方例程 + 社区支持),是嵌入式入门的首选(我们以最经典的 STM32F103C8T6 “蓝桥板” 为例,成本低、易上手)。

2. 开发环境:STM32CubeIDE(新手友好,集成 HAL 库)
  • 下载安装:官网搜索 “STM32CubeIDE”(免费),按提示安装(注意勾选 “ST-Link 驱动”,用于下载程序到开发板)。
  • 核心优势:可视化配置硬件(不用手动写寄存器)、自动生成初始化代码、集成编译和下载功能,新手只需专注业务逻辑。
3. 硬件准备:
  • STM32F103C8T6 开发板(蓝桥板)、Micro-USB 线(供电 + 下载)、LED(板载已有,无需额外准备)、按键(板载已有)。

二、GPIO 原理:嵌入式 “控制硬件的接口”(30 分钟)

GPIO(General Purpose Input Output,通用输入输出口)是 MCU 与外部硬件(LED、按键、传感器)连接的 “桥梁”,通过配置 GPIO 的工作模式,可实现 “输出高低电平”(控制 LED)或 “读取外部电平”(检测按键)。

1. GPIO 的核心特性:
  • 引脚:STM32 有多个 GPIO 端口(A、B、C...),每个端口有 16 个引脚(如 PA0、PA1、PC13 等),板载 LED 通常接在 PC13(低电平点亮),按键接在 PA0(按下时为低电平)。
  • 工作模式(常用 2 种):
    • 输出模式:GPIO 可输出高电平(3.3V)或低电平(0V),用于控制 LED、继电器等。
    • 输入模式:GPIO 可检测外部输入的电平(高 / 低),用于读取按键、传感器状态等。
  • 控制方式:
    • 寄存器:直接操作硬件寄存器(如 GPIOx_ODR 输出数据寄存器),效率高但复杂(新手先不用)。
    • HAL 库函数:ST 提供的封装好的函数(如HAL_GPIO_WritePin输出电平),简单易用,适合入门。

三、实操 1:用 HAL 库点亮并闪烁 LED(50 分钟,核心!)

目标:通过代码控制板载 LED(PC13)周期性亮灭(闪烁),体验 “代码控制硬件” 的完整流程。

步骤 1:创建 STM32CubeIDE 工程
  1. 打开 CubeIDE,点击「File→New→STM32 Project」;
  2. 在 “Part Number” 中搜索 “STM32F103C8T6”,选中后点击「Next」;
  3. 工程名填 “LED_Blink”,路径选英文目录(避免中文乱码),点击「Finish」→ 弹出的对话框选「Yes」(生成初始化代码)。
步骤 2:配置 GPIO 引脚(可视化配置)
  1. 进入 “Pinout & Configuration” 界面(左侧标签);
  2. 找到 PC13 引脚(在右侧芯片图上,或搜索框输入 “PC13”);
  3. 点击 PC13,选择 “GPIO_Output”(配置为输出模式);
  4. 点击左侧 “System Core→GPIO→PC13”,配置参数(默认即可):
    • GPIO output level:默认低电平(初始状态 LED 亮);
    • GPIO mode:Output Push Pull(推挽输出,可输出高低电平);
    • GPIO Pull-up/Pull-down:No pull-up and no pull-down(无需上下拉);
    • Maximum output speed:Low(低速即可,LED 不需要高速)。
步骤 3:生成初始化代码

点击顶部「Project→Generate Code」,CubeIDE 会自动生成 GPIO 初始化代码(在main.cgpio.c中)。

步骤 4:编写 LED 闪烁逻辑(修改 main 函数)

打开main.c,在while(1)循环中添加代码(让 LED 每隔 500ms 翻转一次):

c

/* USER CODE BEGIN WHILE */
while (1)
{
  /* 翻转PC13引脚电平:亮→灭→亮... */
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  
  /* 延时500ms:HAL库提供的毫秒级延时函数 */
  HAL_Delay(500);
  
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
步骤 5:下载程序到开发板
  1. 用 Micro-USB 线连接开发板和电脑,确保 ST-Link 驱动已安装(设备管理器中无黄色感叹号);
  2. 点击顶部「Run→Run」(或绿色三角按钮),CubeIDE 会自动编译并下载程序到开发板。
现象:板载 LED 开始周期性闪烁(500ms 亮,500ms 灭),成功!

四、实操 2:按键控制 LED(结合中断,30 分钟)

目标:用板载按键(PA0)控制 LED:按下按键时 LED 点亮,松开时熄灭(用中断方式检测按键,复习第四天的中断知识)。

步骤 1:重新配置 GPIO(按键用输入中断模式)
  1. 新建工程 “Key_Control_LED”,配置 PC13 为 “GPIO_Output”(LED 不变);
  2. 配置 PA0 为 “GPIO_EXTI0”(外部中断 0,对应 PA0 引脚);
  3. 配置中断参数:
    • 左侧 “System Core→GPIO→PA0”:
      • GPIO mode:Input mode(输入模式);
      • GPIO Pull-up/Pull-down:Pull-up(上拉,未按下时为高电平);
    • 左侧 “System Core→NVIC”(中断控制器):
      • 勾选 “EXTI line0 interrupt”(使能 EXTI0 中断),优先级默认即可。
步骤 2:生成代码后,编写中断服务函数
  1. main.c中,先初始化 LED 为熄灭状态(在MX_GPIO_Init();后添加):

    c

    /* 初始化LED为熄灭:PC13输出高电平(板载LED低电平点亮) */
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    
  2. 找到中断回调函数(CubeIDE 自动生成框架,在stm32f1xx_hal_gpio.c中,或在main.c中重写):在main.c的 “USER CODE BEGIN 4” 区域添加:

    c

    /* 外部中断回调函数:按键按下时触发(PA0电平变化) */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
      if (GPIO_Pin == GPIO_PIN_0)  // 确认是PA0触发的中断
      {
        /* 延时消抖(简单处理:按键机械抖动导致的多次触发) */
        HAL_Delay(10);
        
        /* 读取PA0电平:按下时为低电平(GPIO_PIN_RESET) */
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
        {
          /* 按键按下:点亮LED(PC13输出低电平) */
          HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
        }
        else
        {
          /* 按键松开:熄灭LED(PC13输出高电平) */
          HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
        }
        
        /* 清除中断标志位(避免重复触发) */
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
      }
    }
    
步骤 3:下载程序,测试效果

按下按键(PA0),LED 点亮;松开按键,LED 熄灭 —— 中断响应成功!

五、第五天必掌握的 3 个关键知识点(10 分钟自测)

  1. GPIO 是 MCU 控制外部硬件的接口,核心模式:输出(控制 LED)、输入(检测按键)。
  2. STM32CubeIDE 的使用流程:创建工程→配置引脚→生成代码→编写逻辑→下载运行。
  3. HAL 库核心函数:
    • HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, level):设置引脚电平(GPIO_PIN_SET高,GPIO_PIN_RESET低);
    • HAL_GPIO_TogglePin(GPIOx, GPIO_PIN_x):翻转引脚电平;
    • HAL_GPIO_ReadPin(GPIOx, GPIO_PIN_x):读取引脚电平;
    • HAL_Delay(ms):毫秒级延时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值