从零搭建嵌入式开发环境,点亮第一块开发板

从零搭建嵌入式开发环境,点亮第一块开发板

很多人被嵌入式劝退,不是卡在算法,而是卡在第一步:环境装不起来、程序下不进去、板子上电一片安静。本文以最常见的 STM32F103C8T6(俗称“蓝板”)+ STM32CubeIDE + ST-Link V2 为例,用八个步骤把整条链路跑通:安装工具链、连接调试器、新建工程、配置时钟与 GPIO、写代码、编译下载,最后让板载 LED 闪烁并在串口打印日志。全程约一小时,文中做法对 2026 年的最新版本工具链同样适用。

一、准备工作

硬件清单:

软件清单:STM32CubeIDE(自带 GCC 编译器、GDB 与 ST-Link GDB Server)、ST-Link 驱动(Windows 需要)、任意串口助手(PuTTY、minicom 或 VS Code 串口插件均可)。

二、第 0 步:先理清整条链路

嵌入式开发只需要三件事同时成立:工具链能编译出可执行文件、调试器能连上芯片、芯片能从 Flash 启动。后面的每一步都在为这三件事服务。建议先只做“点灯”,不要一上来就加屏幕、加传感器,变量越少越容易定位问题。

三、第 1 步:安装 STM32CubeIDE

  1. 到 ST 官网下载对应系统的安装包,Windows 双击安装,路径不要含中文和空格,例如 C:\STM32\CubeIDE。
  2. Linux 用户解压后执行安装脚本;macOS 直接打开 dmg 拖入应用目录。
  3. 首次启动选择一个工作区目录,建议独立于系统盘,便于备份。
  4. 验证安装:Help → About,能看到版本号即成功。CubeIDE 已内置编译器,不需要再单独装 arm-none-eabi-gcc。

四、第 2 步:安装驱动并连接调试器

Windows 下插入 ST-Link,若设备管理器出现未知设备,安装 STSW-LINK009 驱动即可。Linux 下需要添加 udev 规则,否则普通用户没有权限访问调试器:

bash sudo tee /etc/udev/rules.d/49-stlinkv2.rules <<'EOF' SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666" EOF sudo udevadm control --reload-rules && sudo udevadm trigger lsusb # 应看到 STMicroelectronics ST-LINK/V2

接线只需四根:ST-Link 的 SWDIO → 板子 SWDIO,SWCLK → SWCLK,GND → GND,3.3V → 3V3。切勿把 5V 接到 3.3V 引脚上。

五、第 3 步:新建工程

  1. File → New → STM32 Project。
  2. 在 MCU/MPU Selector 中搜索 STM32F103C8,选中 STM32F103C8Tx,Next。
  3. 工程名填 blink,Project Type 保持 STM32Cube,Toolchain 选 STM32CubeIDE,Firmware Package 选择最新版本。
  4. Finish 后弹出“是否用 CubeMX 初始化外设”,选 Yes,进入图形化配置界面。

六、第 4 步:配置时钟树

  1. 在 Pinout 视图的 RCC 中,把 HSE 设为 Crystal/Ceramic Resonator,因为蓝板焊了 8MHz 晶振。
  2. 打开 Clock Configuration 页,PLL Source 选 HSE,PLL Mul 选 ×9,在 SYSCLK 输入框填 72 并按回车,让工具自动计算分频。
  3. 确认 HCLK = 72MHz、APB1 = 36MHz、APB2 = 72MHz。若出现红色提示,点 Resolve Clock Issues 自动修复。

时钟配错是最隐蔽的坑:波特率乱码、延时不准,十有八九是这里没配对。

七、第 5 步:配置 GPIO 与串口

  1. 板载 LED 接在 PC13,且为低电平点亮。在芯片图上点击 PC13,选择 GPIO_Output。
  2. 在 GPIO 面板中把 PC13 的初始电平设为 High(默认熄灭),Mode 为 Output Push Pull,无上下拉,速度 Low 即可。
  3. 串口用 USART1:点击 PA9(TX) 与 PA10(RX),选择 Asynchronous。
  4. 在 USART1 的 Parameter Settings 中设置 Baud Rate 115200、8 位数据、无校验、1 位停止位。
  5. Project Manager → Code Generator 中勾选“Generate peripheral initialization as a pair of .c/.h files”,代码结构更清晰。
  6. 保存 .ioc 文件,工具会自动生成初始化代码。

八、第 6 步:编写用户代码

打开 Core/Src/main.c。所有自定义代码必须写在 USER CODE 区间内,否则下次重新生成会被覆盖。先加 printf 重定向:

c /* USER CODE BEGIN Includes / #include <stdio.h> / USER CODE END Includes */

/* USER CODE BEGIN 0 */ int _write(int fd, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t )ptr, len, HAL_MAX_DELAY); return len; } / USER CODE END 0 */

再在 main() 的初始化之后和主循环里补上业务逻辑:

c /* USER CODE BEGIN 2 / printf("blink start, SYSCLK=%lu Hz\r\n", HAL_RCC_GetHCLKFreq()); / USER CODE END 2 */

while (1) { /* USER CODE BEGIN 3 / HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); printf("tick %lu\r\n", HAL_GetTick()); HAL_Delay(500); / USER CODE END 3 */ }

这段代码以 500ms 为周期翻转 PC13,同时每 500ms 通过串口打印一次毫秒计数。

九、第 7 步:编译与下载

  1. Project → Build All,控制台输出 0 errors 即编译成功,产物在 Debug/blink.elf。
  2. Run → Debug Configurations 中确认 Debugger 选 ST-Link (OpenOCD),Interface 为 SWD。
  3. 点击 Debug 进入调试会话,点击 Resume 运行;若只想烧录,直接用 Run 菜单的 Run。
  4. 下载完成后板子自动复位,PC13 的 LED 应以 2Hz 闪烁。

十、第 8 步:串口验证

用 USB-TTL 接线:模块 TX → PA10,模块 RX → PA9,两者 GND 共地。打开串口助手,选 115200 波特率,应看到启动信息与不断增长的 tick 计数。至此,编译、下载、运行、通信四条链路全部打通。

十一、常见问题排查

十二、下一步学习路线

点亮 LED 只是起点,建议按这个顺序推进:GPIO 输入与按键消抖 → EXTI 外部中断 → TIM 定时器中断与 PWM → 串口 DMA 加环形缓冲 → I2C 驱动 OLED → SPI 驱动外部 Flash → 移植 FreeRTOS 跑多任务 → 上 CAN 或以太网。每一步都复用今天这个工程框架,慢慢积累自己的驱动库。

十三、小结

环境搭建的本质就是三件事:工具链能编译、调试器能连上、芯片能启动。把它们拆成上面的八步,第一次遇到报错不要慌,先用最小点灯工程验证链路,再逐层叠加外设。搞定今天这块板,2026 年之后要玩的 RTOS、协议栈和低功耗设计,都会顺畅很多。