打印
[应用相关]

STM32 在 Linux 环境下的开发与调试

[复制链接]
47|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Zuocidian|  楼主 | 2025-2-9 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、引言
在嵌入式开发领域,STM32 微控制器凭借其高性能、低功耗等优点被广泛应用。Linux 作为开源、稳定且功能强大的操作系统,为 STM32 开发提供了良好的开发环境。本文将详细介绍在 Linux 环境下进行 STM32 开发与调试的步骤,并给出相关代码示例。

二、开发环境搭建
2.1 安装必要的工具链
在 Linux 系统中,我们需要安装 GCC 交叉编译工具链,用于编译针对 STM32 的代码。以 Ubuntu 系统为例,可以通过以下命令安装:

sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi


2.2 安装 OpenOCD
OpenOCD(Open On-Chip Debugger)是一个开源的片上调试工具,用于与 STM32 进行通信和调试。可以通过以下命令安装:

sudo apt-get install openocd


2.3 安装文本编辑器
推荐使用 Visual Studio Code 或 Vim 作为代码编辑器,方便编写和管理代码。

三、创建项目结构
在 Linux 系统中创建一个新的 STM32 项目,项目结构可以如下:

stm32_project/
├── src/           # 存放源代码文件
│   └── main.c
├── include/       # 存放头文件
│   └── stm32fxxx.h
├── build/         # 存放编译生成的文件
└── Makefile       # 编译脚本


四、编写代码
4.1 主程序代码(main.c)
以下是一个简单的 STM32 主程序示例,该程序使用 GPIO 控制一个 LED 灯闪烁:

#include "stm32fxxx.h"

#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA

void delay(uint32_t count) {
    for (uint32_t i = 0; i < count; i++);
}

int main(void) {
    // 使能 GPIOA 时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    // 配置 LED 引脚为推挽输出模式
    GPIOA->CRL &= ~(GPIO_CRL_MODE5 | GPIO_CRL_CNF5);
    GPIOA->CRL |= GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1;

    while (1) {
        // 点亮 LED
        GPIOA->BSRR = LED_PIN;
        delay(1000000);

        // 熄灭 LED
        GPIOA->BRR = LED_PIN;
        delay(1000000);
    }
}


4.2 Makefile 编写
Makefile 用于自动化编译过程,以下是一个简单的 Makefile 示例:

# 工具链定义
CC = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy

# 项目路径和文件定义
PROJECT_DIR = .
SRC_DIR = $(PROJECT_DIR)/src
BUILD_DIR = $(PROJECT_DIR)/build
INCLUDE_DIR = $(PROJECT_DIR)/include

# 源文件和目标文件定义
SRCS = $(wildcard $(SRC_DIR)/*.c)
OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))

# 编译选项
CFLAGS = -mcpu=cortex-m3 -mthumb -std=gnu11 -Os -Wall -I$(INCLUDE_DIR)
LDFLAGS = -Tstm32f103c8t6.ld -Wl,-Map=$(BUILD_DIR)/$(PROJECT_NAME).map

# 项目名称
PROJECT_NAME = stm32_project

all: $(BUILD_DIR)/$(PROJECT_NAME).bin

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
    $(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/$(PROJECT_NAME).elf: $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) -o $@

$(BUILD_DIR)/$(PROJECT_NAME).bin: $(BUILD_DIR)/$(PROJECT_NAME).elf
    $(OBJCOPY) -O binary $< $@

$(BUILD_DIR):
    mkdir -p $@

clean:
    rm -rf $(BUILD_DIR)



五、编译代码
在项目根目录下,执行以下命令进行编译:

make


编译成功后,会在 build 目录下生成 .bin 文件,该文件即为可烧录到 STM32 的固件。

六、烧录与调试
6.1 烧录固件
使用 OpenOCD 烧录固件到 STM32,首先需要启动 OpenOCD 服务:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg


然后在另一个终端窗口中,使用 telnet 连接到 OpenOCD 服务:

telnet localhost 4444


在 telnet 会话中,执行以下命令烧录固件:

reset halt
flash write_image erase build/stm32_project.bin 0x08000000
reset run


6.2 调试代码
可以使用 GDB(GNU Debugger)进行代码调试。在项目根目录下,执行以下命令启动 GDB:

arm-none-eabi-gdb build/stm32_project.elf


在 GDB 中,连接到 OpenOCD 服务:

target remote localhost:3333


然后可以使用 GDB 的各种命令进行调试,例如设置断点、单步执行等:

break main
continue
next


七、总结
通过以上步骤,我们可以在 Linux 环境下完成 STM32 的开发与调试工作。从环境搭建、代码编写、编译到烧录和调试,每个环节都有相应的工具和方法。使用 Linux 进行 STM32 开发,不仅可以充分利用开源工具的优势,还能提高开发效率和代码质量。同时,结合 GDB 和 OpenOCD 等工具,可以方便地进行代码调试,及时发现和解决问题。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/duierrorshuobu/article/details/145408364

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

37

帖子

0

粉丝