一、引言
在嵌入式开发领域,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
|