Linux 下交叉编译实战:跑起来你的第一个 STM32 程序

描述

很多开发者第一次接触 STM32,总会被“交叉编译”、“烧录程序”等概念绕晕。其实方法很简单:在 Linux 下配置交叉编译环境,编写简单程序,然后烧录到 STM32,就可以看到成果了。本文带你从零开始跑起来你的第一个 STM32 程序。

一、准备工作

在开始之前,需要准备:

1、Linux 开发环境

    Ubuntu、Debian 或其他主流发行版都可以。

2、ARM GCC 交叉编译工具链

  1. sudo apt update
  2. 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,可以省去额外购买调试器的麻烦。

二、创建工程

  1. 新建工程目录:
  1. mkdir stm32_demo
  2. cd stm32_demo
  1. 创建最简单的 main.c 文件:
  1. #include"stm32f1xx.h"
  2.  
  3. int main(void){
  4. // 1. 初始化 LED GPIO
  5.     RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;// 使能 GPIOC 时钟
  6.     GPIOC->CRH &=~GPIO_CRH_MODE13;
  7.     GPIOC->CRH |= GPIO_CRH_MODE13_0;// 输出模式
  8.     GPIOC->CRH &=~GPIO_CRH_CNF13;// 通用推挽
  9.  
  10. while(1){
  11.         GPIOC->ODR ^= GPIO_ODR_ODR13;// 翻转 LED
  12. for(int i=0;i<500000;i++);// 简单延时
  13. }
  14. }

 小贴士:STM32F103C8T6 板载 LED 在 PC13 引脚,通过翻转寄存器可以直接点亮/熄灭。

三、编写 Makefile

Makefile 可以简化编译流程:

  1. CC=arm-none-eabi-gcc
  2. CFLAGS=-mcpu=cortex-m3 -mthumb -O2 -Wall
  3. LDFLAGS=-T stm32f103c8t6.ld -nostartfiles
  4.  
  5. all: main.elf
  6.  
  7. main.elf: main.c
  8.     $(CC) $(CFLAGS) $^-o $@ $(LDFLAGS)
  9.  
  10. clean:
  11.     rm -f *.elf *.bin
  12.  
  13. flash: main.elf
  14.     st-flash write main.bin 0x8000000
  15.  
  16. main.bin: main.elf
  17.     arm-none-eabi-objcopy -O binary main.elf main.bin

 小贴士:Makefile 的 flash 目标可以直接把程序烧录到 STM32,无需手动输入命令。

四、交叉编译

在工程目录执行:

  1. make

如果没有报错,会生成 main.elf 和 main.bin

 小贴士:

  • .elf 文件是可调试的二进制文件,可以在调试器中使用。
  • .bin 是裸机烧录文件,用于 ST-LINK 或其他烧录工具。

五、烧录程序

使用 ST-LINK 烧录:

  1. make flash

或者直接使用 st-flash 工具:

  1. st-flash write main.bin 0x8000000

程序烧录完成后,板载 LED 将开始闪烁。

 小贴士:

  • 确认开发板供电和连接正确,否则烧录失败。
  • 对于 Nucleo 板,板载 ST-LINK 也能直接通过 USB 下载。
     

六、串口调试(可选)

如果希望观察程序运行状态,可以在 main.c 中加入 UART 打印:

  1. #include"stm32f1xx_hal.h"
  2. #include
  3.  
  4. UART_HandleTypeDef huart1;
  5.  
  6. int fputc(int ch,FILE*f){
  7.     HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY);
  8. return ch;
  9. }
  10.  
  11. int main(void){
  12.     HAL_Init();
  13.     MX_USART1_UART_Init();
  14.  
  15.     printf("STM32 is running...\r\n");
  16.  
  17. while(1){
  18.         printf("Looping...\r\n");
  19.         HAL_Delay(1000);
  20. }
  21. }

在 Linux 终端查看:

  1. screen /dev/ttyUSB0 115200

 小贴士:

  • 打印日志会占用 CPU,注意不要打印过多影响实时性。
  • 可用串口观察 LED 翻转计数或程序状态,方便调试。

七、总结

通过以上步骤,你已经完成了:

  1. Linux 下安装 ARM 交叉编译工具链
  2. 编写第一个 STM32 程序
  3. 使用 Makefile 编译并生成 .elf 和 .bin
  4. 烧录程序到 STM32 开发板
  5. (可选)通过串口调试程序状态

这套流程是 STM32 项目开发的基础,熟练掌握后,可以快速开发更复杂功能,如 RTOS、多外设驱动、传感器数据采集等。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分