1. STM32简介与开发环境搭建

大家好,欢迎来到这门实战课。我是你们的讲师,一个在嵌入式圈子里摸爬滚打了十几年的老工程师。

第一节课,咱们不急着写代码。先把家伙事儿备齐,把路数摸清楚。你想想看,盖房子得先看图纸、备砖头,搞嵌入式也是一样的道理。

1.1 为什么是STM32?

市面上微控制器那么多,51、AVR、MSP430,为什么我偏偏推荐STM32?

说白了,就三个字:生态好。

STM32是意法半导体(ST)基于ARM Cortex-M内核推出的32位MCU系列。从低功耗的Cortex-M0+到高性能的Cortex-M7,覆盖了你能想到的绝大多数应用场景。

核心优势一览:

  • 性能强悍:主频从48MHz到480MHz不等,处理复杂算法不在话下
  • 外设丰富:USART、SPI、I2C、CAN、USB、以太网……应有尽有
  • 开发工具成熟:Keil MDK、STM32CubeIDE、IAR,随便挑
  • 社区庞大:遇到问题,网上搜一搜,八成有人踩过坑
  • 价格亲民:几块钱到几十块钱,性价比极高

我个人习惯把STM32按性能分成几个梯队,方便选型时快速定位:

系列 内核 主频 典型应用
STM32F0/F1 Cortex-M0/M3 48-72 MHz 工业控制、传感器节点
STM32F4 Cortex-M4F 168-180 MHz 电机控制、音频处理
STM32H7 Cortex-M7 400-480 MHz 人机界面、机器视觉
STM32L0/L4 Cortex-M0+/M4 32-80 MHz 电池供电、物联网终端

我在项目中遇到过不少选型翻车的案例。有人用F0跑复杂的图形界面,结果卡成PPT;也有人用H7做简单的LED控制,纯属大炮打蚊子。选型这事,够用就好,别盲目追高。

1.2 开发环境怎么选?

目前主流的STM32开发环境有两个:Keil MDK 和 STM32CubeIDE。

我个人的建议是:

  • 如果你做工业项目、商业产品,或者公司有现成的Keil授权,那就用Keil MDK。它编译效率高,调试稳定,老工程师用得最多。
  • 如果你是学生、个人开发者,或者想省点钱,那就用STM32CubeIDE。它是ST官方基于Eclipse打造的免费IDE,功能一点不差,还集成了CubeMX配置工具。

我的小建议: 初学者我推荐从STM32CubeIDE入手。免费、开箱即用、官方持续更新,省去破解的麻烦。等你真正上手了,再根据项目需求切换工具也不迟。

1.3 安装与配置:手把手来一遍

咱们以STM32CubeIDE为例,走一遍安装流程。别嫌啰嗦,这一步出问题,后面全白搭。

1.3.1 下载与安装

  1. 去ST官网搜索"STM32CubeIDE",下载最新版本(目前是1.15.x)。
  2. 双击安装包,一路Next。注意安装路径不要有中文和空格。
  3. 安装过程中会自动下载一些固件包,保持网络畅通就行。
  4. 安装完成后,启动IDE,它会自动检测你的开发板。

注意: 安装路径和工程路径都不要出现中文!我曾经有个学生,工程放在"桌面/新建文件夹"里,结果编译死活报错,折腾了两小时才发现是中文路径的问题。

1.3.2 创建第一个工程

打开STM32CubeIDE,我们来创建一个新工程:

  1. 点击 File → New → STM32 Project
  2. 在芯片选择界面,输入你的芯片型号。比如我手头的是STM32F103C8T6,直接搜"STM32F103C8"。
  3. 选中芯片,点击Next。给工程起个名字,比如"LED_Blink"。
  4. IDE会自动生成初始化代码,并打开CubeMX图形化配置界面。

1.4 点亮LED:嵌入式世界的"Hello World"

好了,环境搭好了,工程建好了。咱们来干点正事——点亮一个LED。

你想想看,嵌入式工程师的仪式感,就是从点亮一颗LED开始的。我第一次点亮LED的时候,那个小灯一亮,心里那个激动啊,比后来调通复杂的通信协议还开心。

1.4.1 硬件连接

先搞清楚你的LED接在哪个GPIO上。以最常见的STM32F103C8T6最小系统板为例:

  • 板载LED通常接在 PC13(对应GPIOC的第13脚)
  • LED另一端通过电阻接地,所以输出高电平点亮,低电平熄灭

如果你是自己外接LED,记得串一个220Ω-1kΩ的限流电阻,别直接把LED怼在GPIO上。我曾经见过有人不接电阻,结果LED烧了,GPIO也烧了,板子直接报废。

1.4.2 代码实现

在CubeMX中配置好PC13为推挽输出模式后,IDE会自动生成初始化代码。我们只需要在main函数里添加控制逻辑:

/* main.c - LED闪烁示例 */
#include "main.h"

int main(void)
{
    HAL_Init();                     // 初始化HAL库
    SystemClock_Config();           // 配置系统时钟
    MX_GPIO_Init();                 // 初始化GPIO

    while (1)
    {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);    // 点亮LED
        HAL_Delay(500);                                         // 延时500ms
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 熄灭LED
        HAL_Delay(500);                                         // 延时500ms
    }
}

代码很简单,对吧?HAL_GPIO_WritePin 控制引脚电平,HAL_Delay 做毫秒级延时。编译下载,你应该能看到LED以1秒的周期闪烁。

避坑指南: 如果你下载后LED没反应,先检查这几项:

  • 开发板供电是否正常?USB线是不是只能充电不能传数据?
  • 芯片型号选对了没有?F103C8和F103C6的Flash大小不同,选错可能无法下载。
  • GPIO引脚号对不对?PC13不是所有板子都一样的,有些板子用的是PA0或PB12。

1.5 知识体系总览

这一章的内容虽然基础,但它是整个课程的基石。我画了一张图,帮你理清脉络:

第1章:STM32简介与开发环境搭建 - 知识体系 STM32开发入门 芯片选型 F0/F1/F4/H7/L0/L4 性能/功耗/成本权衡 开发环境 Keil MDK vs STM32CubeIDE 安装配置 + 工程创建 外设基础 GPIO配置:推挽/开漏 HAL库API调用 动手实践 点亮LED:嵌入式Hello World 调试与验证 编译下载 + 常见问题排查

这张图把本章的核心内容串起来了。从芯片选型到环境搭建,从外设基础到动手实践,再到调试验证,每一步都环环相扣。后面的课程,我们会沿着这条主线,一步步深入下去。

1.6 写在最后

嗯,第一章的内容就到这里。内容不多,但都是实打实的干货。你可能会觉得点亮LED太简单了,但请相信我,这个简单的过程背后,藏着整个嵌入式开发的底层逻辑:配置外设 → 调用API → 控制硬件。后面的所有复杂功能,都是在这个基础上叠加的。

把开发环境搞定,把第一个LED点亮,你就已经迈出了坚实的第一步。剩下的,咱们慢慢来。