描述
很多开发者第一次接触 STM32,总会被“交叉编译”、“烧录程序”等概念绕晕。其实方法很简单:在 Linux 下配置交叉编译环境,编写简单程序,然后烧录到 STM32,就可以看到成果了。本文带你从零开始跑起来你的第一个 STM32 程序。
一、准备工作
在开始之前,需要准备:
1、Linux 开发环境
Ubuntu、Debian 或其他主流发行版都可以。
2、ARM GCC 交叉编译工具链
- sudo apt update
- sudo apt install gcc-arm-none-eabi gdb-arm-none-eabi
2.1 STM32 开发板
例如 STM32F103C8T6(“蓝板”)或 Nucleo 系列。
2.2 调试工具
ST-LINK、JTAG/SWD 调试器。
2.3 串口线或 USB 连接线
用于打印输出或烧录程序。
小贴士:如果你的开发板自带 ST-LINK,可以省去额外购买调试器的麻烦。
二、创建工程
- 新建工程目录:
- mkdir stm32_demo
- cd stm32_demo
- 创建最简单的 main.c 文件:
- #include"stm32f1xx.h"
-
- int main(void){
- // 1. 初始化 LED GPIO
- RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;// 使能 GPIOC 时钟
- GPIOC->CRH &=~GPIO_CRH_MODE13;
- GPIOC->CRH |= GPIO_CRH_MODE13_0;// 输出模式
- GPIOC->CRH &=~GPIO_CRH_CNF13;// 通用推挽
-
- while(1){
- GPIOC->ODR ^= GPIO_ODR_ODR13;// 翻转 LED
- for(int i=0;i<500000;i++);// 简单延时
- }
- }
小贴士:STM32F103C8T6 板载 LED 在 PC13 引脚,通过翻转寄存器可以直接点亮/熄灭。
三、编写 Makefile
Makefile 可以简化编译流程:
- CC=arm-none-eabi-gcc
- CFLAGS=-mcpu=cortex-m3 -mthumb -O2 -Wall
- LDFLAGS=-T stm32f103c8t6.ld -nostartfiles
-
- all: main.elf
-
- main.elf: main.c
- $(CC) $(CFLAGS) $^-o $@ $(LDFLAGS)
-
- clean:
- rm -f *.elf *.bin
-
- flash: main.elf
- st-flash write main.bin 0x8000000
-
- main.bin: main.elf
- arm-none-eabi-objcopy -O binary main.elf main.bin
小贴士:Makefile 的 flash 目标可以直接把程序烧录到 STM32,无需手动输入命令。
四、交叉编译
在工程目录执行:
- make
如果没有报错,会生成 main.elf 和 main.bin。
小贴士:
- .elf 文件是可调试的二进制文件,可以在调试器中使用。
- .bin 是裸机烧录文件,用于 ST-LINK 或其他烧录工具。
五、烧录程序
使用 ST-LINK 烧录:
- make flash
或者直接使用 st-flash 工具:
- st-flash write main.bin 0x8000000
程序烧录完成后,板载 LED 将开始闪烁。
小贴士:
- 确认开发板供电和连接正确,否则烧录失败。
- 对于 Nucleo 板,板载 ST-LINK 也能直接通过 USB 下载。
六、串口调试(可选)
如果希望观察程序运行状态,可以在 main.c 中加入 UART 打印:
- #include"stm32f1xx_hal.h"
- #include
-
- UART_HandleTypeDef huart1;
-
- int fputc(int ch,FILE*f){
- HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY);
- return ch;
- }
-
- int main(void){
- HAL_Init();
- MX_USART1_UART_Init();
-
- printf("STM32 is running...\r\n");
-
- while(1){
- printf("Looping...\r\n");
- HAL_Delay(1000);
- }
- }
在 Linux 终端查看:
- screen /dev/ttyUSB0 115200
小贴士:
- 打印日志会占用 CPU,注意不要打印过多影响实时性。
- 可用串口观察 LED 翻转计数或程序状态,方便调试。
七、总结
通过以上步骤,你已经完成了:
- Linux 下安装 ARM 交叉编译工具链
- 编写第一个 STM32 程序
- 使用 Makefile 编译并生成 .elf 和 .bin
- 烧录程序到 STM32 开发板
- (可选)通过串口调试程序状态
这套流程是 STM32 项目开发的基础,熟练掌握后,可以快速开发更复杂功能,如 RTOS、多外设驱动、传感器数据采集等。
打开APP阅读更多精彩内容