0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

信盈达 2025-11-24 19:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

很多开发者第一次接触 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. intmain(void){
  3. // 1. 初始化 LED GPIO
  4. RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;// 使能 GPIOC 时钟
  5. GPIOC->CRH&=~GPIO_CRH_MODE13;
  6. GPIOC->CRH|=GPIO_CRH_MODE13_0;// 输出模式
  7. GPIOC->CRH&=~GPIO_CRH_CNF13;// 通用推挽
  8. while(1){
  9. GPIOC->ODR^=GPIO_ODR_ODR13;// 翻转 LED
  10. for(inti=0;i<500000;i++);// 简单延时
  11. }
  12. }

小贴士: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. all:main.elf
  5. main.elf:main.c
  6. $(CC)$(CFLAGS)$^-o $@ $(LDFLAGS)
  7. clean:
  8. rm-f*.elf*.bin
  9. flash:main.elf
  10. st-flash write main.bin0x8000000
  11. main.bin:main.elf
  12. arm-none-eabi-objcopy-O binary main.elf main.bin

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

四、交叉编译

在工程目录执行:

  1. make

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

小贴士:

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

五、烧录程序

使用 ST-LINK 烧录:

  1. make flash

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

  1. st-flash write main.bin0x8000000

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

小贴士:

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

六、串口调试(可选)

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

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

在 Linux 终端查看:

  1. screen/dev/ttyUSB0115200

小贴士:

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

七、总结

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

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

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

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

    关注

    88

    文章

    11627

    浏览量

    217888
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371045
  • 编译
    +关注

    关注

    0

    文章

    687

    浏览量

    34935
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智能车浅谈——手把手让车跑起来(电磁篇)

    前言电磁寻迹小车之前智能车系列已经做了比较详细的解析,但是美中不足是知识点被拆的太零散,可能对于新手来说不太友好,所以借着有空就再写点能让车跑起来的方案。当然,也就仅仅限于可以
    的头像 发表于 05-22 19:32 2500次阅读
    智能车浅谈——手把手让车<b class='flag-5'>跑起来</b>(电磁篇)

    STM32芯片用KEIL4程序后要按复位键才能跑起来

    STM32芯片用KEIL4程序后要按复位键才能跑起来?大神可否详细截图解说下怎么设置一下
    发表于 12-14 08:45

    如何让的ESP32跑起来

    ESP32是了国内乐鑫科技推出的Wifi&蓝牙物联网MCU,而最近项目正好在用ESP32,所以我们今天就来分享,如何让的ESP32跑起来,并应用于更多实际项目。1ESP32简...
    发表于 07-16 06:57

    怎样让自己编译的uboot跑起来

    小目标:让自己编译的uboot跑起来参考:wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO首先熟悉一下板子和开发流程。维基主要参考《使用全志原厂BSP
    发表于 11-08 06:37

    程序跑起来就是很好的c代码吗

    程序跑起来并不见得的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来添加链接描述看:海风教育投诉1,代码稳定,没有隐患。2,执行效率高。3,可读性高。4,便于移植。
    发表于 11-23 08:00

    STM32如何区分程序跑起来用的是HSE还是HSI呢?

    本人用过f103和f030,为了取功耗低的方案,内部外部晶振都试过。但是有很多情况,配置错了,程序貌似会自己跑内部晶振去了;般单片机如果外部晶振跑起来应该在晶振那两
    发表于 05-05 10:47

    让NPU跑起来迅为RK3588开发板设置交叉编译

    让NPU跑起来迅为RK3588开发板设置交叉编译编译器下载地址是网盘资料“iTOP-3588 开发板\\\\02_【iTOP-RK3588 开发板】开发资料 \\\\12_NPU 使
    发表于 09-14 09:42

    Zynq 7015 linux跑起来之导入之BOOT.bin生成详解

    本文主要介绍Zynq 7015 linux跑起来之导入之BOOT.bin生成,具体的跟随小编一起来了解一下
    的头像 发表于 06-27 10:01 8357次阅读

    如何在鸿蒙OS上跑起来第一个hello world

    咱们一起来跟着位网友学习一下如何跑起来第一个hello world,原文如下: 前序 1.1 官网: https://www.harmon
    的头像 发表于 09-28 10:55 2314次阅读
    如何在鸿蒙OS上<b class='flag-5'>跑起来</b><b class='flag-5'>第一个</b>hello world

    windows安装ubuntu并让pioneer1应用程序跑起来的过程

    本文介绍在windows安装ubuntu并且让pioneer1的应用程序跑起来的全过程。虽然安装ubuntu不是本文重点,但是还是啰嗦地写遍吧。
    的头像 发表于 10-23 10:41 2942次阅读
    windows安装ubuntu并让pioneer1应用<b class='flag-5'>程序</b><b class='flag-5'>跑起来</b>的过程

    TI CC3200 WIFI实训开发套件(OURS-SDK-WFB)IAR for ARM7.8调试2————对IAR for ARM的熟悉,并在开发板上跑起来第一个

    TI CC3200 WIFI实训开发套件(OURS-SDK-WFB)IAR for ARM7.8调试2————对IAR for ARM的熟悉,并在开发板上跑起来第一个程序
    发表于 12-08 12:06 8次下载
    TI CC3200 WIFI实训开发套件(OURS-SDK-WFB)IAR for ARM7.8调试2————对IAR for ARM的熟悉,并在开发板上<b class='flag-5'>跑起来</b><b class='flag-5'>第一个</b>

    写的代码是如何跑起来的?

    今天我们来思考简单的问题,程序是如何在 Linux 上执行
    的头像 发表于 12-08 15:50 1343次阅读

    知道写的代码是怎样跑起来的吗(上)

    今天我们来思考简单的问题,程序是如何在 Linux 上执行
    的头像 发表于 05-05 14:36 865次阅读
    <b class='flag-5'>你</b>知道<b class='flag-5'>你</b>写的代码是怎样<b class='flag-5'>跑起来</b>的吗(上)

    知道写的代码是怎样跑起来的吗(

    今天我们来思考简单的问题,程序是如何在 Linux 上执行
    的头像 发表于 05-05 14:36 853次阅读
    <b class='flag-5'>你</b>知道<b class='flag-5'>你</b>写的代码是怎样<b class='flag-5'>跑起来</b>的吗(<b class='flag-5'>下</b>)

    Linux内核的编译和运行

    想让Linux内核代码跑起来,得先搭建编译和运行代码的环境。
    发表于 06-23 11:56 2194次阅读
    <b class='flag-5'>Linux</b>内核的<b class='flag-5'>编译</b>和运行