Files
motor-controller/docs/develop_guide.md

5.0 KiB
Raw Blame History

📘 嵌入式项目开发规范STM32 + 分层架构)

Embedded Project Development Guide

1. 设计目标

本项目遵循以下核心原则:

  • 分层设计Layered Architecture
  • 解耦Decoupling
  • 可移植性Portability
  • 可维护性Maintainability

2. 工程目录规范


project/
├── app/            # 应用层(业务逻辑)
├── modules/        # 功能模块(设备 / 算法)
├── interfaces/     # 硬件抽象接口(关键)
├── bsp/            # 板级支持包(硬件实现)
├── 3rdparty/       # 第三方库(不修改源码)
├── os/             # 操作系统FreeRTOS等
├── utils/          # 通用工具
├── Core/           # STM32CubeMX生成禁止污染
├── Drivers/        # HAL/CMSIS厂商提供


3. 分层说明(必须遵守)

3.1 层级关系(单向依赖)


app
↓
modules
↓
interfaces
↓
bsp
↓
HAL / Hardware

严禁反向依赖:

  • modules 依赖 HAL
  • app 直接调用 bsp
  • modules include Core 代码

4. 各层职责

4.1 app应用层

  • 负责系统流程控制
  • 状态机 / 控制逻辑
  • 不允许访问硬件细节
void app_loop(void) {
    imu_read(...);
    pid_update(...);
    motor_set_speed(...);
}

4.2 modules模块层

分类:

modules/
├── device/     # 电机等执行器
├── sensor/     # IMU/传感器
├── control/    # PID / Kalman
├── protocol/   # 通信协议

规则:

  • 只依赖 interfaces
  • 不允许使用 HAL
// ❌ 禁止
#include "i2c.h"

// ✅ 正确
#include "i2c_if.h"

4.3 interfaces接口层

定义硬件抽象接口:

typedef struct {
    int (*read)(uint8_t addr, uint8_t reg, uint8_t *buf, int len);
} i2c_if_t;

作用:

  • 解耦 modules 和 bsp
  • 支持多平台替换

4.4 bsp板级支持包

结构:

bsp/stm32f4/
├── i2c/
├── can/
├── spi/
├── gpio/
└── board.c

职责:

  • 封装 HAL
  • 提供接口实现
int stm32_i2c_read(...) {
    return HAL_I2C_Mem_Read(...);
}

4.5 3rdparty第三方库

放置:

  • cJSON
  • lwIP
  • FreeRTOS如果不是Cube管理

规则:

  • 不修改源码
  • 不直接暴露给 app

示例(推荐封装)

modules/json/
    json_wrapper.c

4.6 utils工具层

  • ringbuffer
  • flash
  • log
  • 数学工具

特点:

  • 无业务依赖
  • 可复用

5. CoreCubeMX生成代码规范

允许:

  • 初始化
  • 外设配置
MX_I2C1_Init();
MX_CAN1_Init();

禁止:

  • 写业务逻辑
  • 写控制算法
  • 写模块代码

推荐 main.c 结构:

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_CAN1_Init();

    bsp_init();
    app_init();

    while (1)
    {
        app_loop();
    }
}

6. 第三方库使用规范

分类原则:

类型 放置位置
不修改 3rdparty
需要修改 modules

示例:

3rdparty/
    cjson/

modules/control/
    pid.c

7. 编码规范

7.1 命名

类型 规范
文件 小写 + 下划线
结构体 xxx_t
函数 模块名_功能

示例:

motor_set_speed()
imu_read_accel()
pid_update()

7.2 模块结构

每个模块:

xxx.c
xxx.h

7.3 禁止全局变量污染

// ❌
extern int state;

// ✅
通过结构体传递

8. 解耦设计规范(核心)

必须满足:

  • 模块不依赖具体硬件
  • 硬件可替换
  • 支持模拟测试

示例:

motor->can->send(...)
imu->i2c->read(...)

9. RTOS 使用规范(如使用)

推荐结构:

imu_task
control_task
motor_task

通信方式:

  • Queue
  • Event

10. 常见错误(必须避免)

直接调用 HAL

HAL_I2C_Mem_Read(...)

模块 include Core

#include "i2c.h"

ISR 写业务逻辑

void IRQ() {
    pid_update();  // ❌
}

11. 开发流程建议

阶段:

  1. 外设跑通HAL
  2. 模块拆分
  3. 接口抽象
  4. BSP封装
  5. RTOS化可选

12. 目标

最终实现:

  • 硬件可替换
  • 模块可复用
  • 架构清晰
  • 易于扩展

13. 一句话总结

接口解耦 + BSP隔离 + 分层设计 = 工程级嵌入式架构


---

# 最后说一句(很关键)

你现在做这件事(写规范)说明你已经在从:

👉 “会写代码” → “会做工程”

转变了。

---

如果你愿意,我可以下一步帮你:

✅ :contentReference[oaicite:0]{index=0}  
或者  
✅ :contentReference[oaicite:1]{index=1}

这会让你的工程直接变成“公司级别”的质量。