# 嵌入式 代码

## 软件功能介绍

中心思想：

- 利用好RTOS和中断，释放CPU性能，保证实时性。
- 一个项目适配不同型号的机器人和不同的操作手。

减少维护的工作量，减少出错的可能性。

## 依赖&环境

- Windows平台下用CubeMX生成项目，然后用Keil uvesrion进行编辑、烧写和调试。

## 使用说明

- 环境安装
  - [MDK-ARM](https://www.keil.com/) （必备）
  - [STM32CubeMX](https://www.st.com/zh/development-tools/stm32cubemx.html) （可选）


- 针对不同板子需要到不同的CubeMX工程文件（DevA.ioc、DevC.ioc）。

- （可选）利用CubeMX生成对应的外设初始化代码和Keil工程文件。忽略CAN总线相关错误。

  - 每次生成代码后，请利用Git丢弃Middlewares文件夹中的所有改变。原因如下。

    1. 使用了AC6，与CubeMX默认不匹配，会影响到FreeRTOS的移植。
    2. 使用了比CubeMX更新的FreeRTOS版本，降版本会导致部分代码无法编译。

  - 因为已经生成过Keil工程文件，所以只会覆盖以前生成的代码，而不会影响手写的代码。

  - 每次生成代码后，请在HAL_InitTick函数中添加uwTickPrio = TickPriority;

- 打开MDK-ARM中的DevC.uvprojx即可进行编辑、烧写或调试。

- Keil工程中有两个Target，其中Debug用来调试，不包含编译器优化等；DevC/DevA用来编译输出最终固件。

## 文件目录结构&文件用途说明

| 文件夹 | 来源 | 内容 |
| ---- | ---- | ----  |
| Core | CubeMX | 包含核心代码，外设初始化，系统初始化等 |
| Doc | 开发者 | 文档 |
| Drivers | CubeMX | CMSIS相关库、STM32 HAL |
| Image | 开发者 | 图片 |
| MDK-ARM | CubeMX | Keil uversion 项目相关文件 |
| Middlewares | 开发者 / CubeMX | 中间件 |
| USB_DEVICE | CubeMX | USB相关文件 |
| User |  开发者 | 手动编写的代码 |
| Utils |  开发者 | 使用到的工具，如CubeMonitor, Matlab |

| User内 | 内容 |
| ---- | ----  |
| bsp | 文件夹内包含开发板信息，基于STM32 HAL对板载的外设进行控制|
| component | 包含各种组件，自成一体，相互依赖，但不依赖于其他文件夹|
| device | 独立于开发板的设备，依赖于HAL和bsp|
| module | 对机器人各模块的抽象，各模块一起组成机器人|
| task | 独立的任务，module的运行容器，也包含通信、姿态解算等 |

## 系统介绍

### 硬件系统框图

| ![步兵嵌入式硬件框图](./Image/步兵嵌入式硬件框图.png?raw=true "步兵嵌入式硬件框图") |
|:--:|
| *步兵嵌入式硬件框图* |

### 软件流程图

| ![步兵嵌入式硬件框图](./Image/嵌入式程序流程图.png?raw=true "步兵嵌入式硬件框图") |
|:--:|
| *步兵嵌入式硬件框图* |

| ![嵌入式程序结构图](./Image/嵌入式程序结构图.png?raw=true "嵌入式程序结构图") |
|:--:|
| *嵌入式程序结构图* |

## 原理介绍

### 云台控制原理

| ![云台控制原理（与PX类似）](./Image/云台控制原理.png?raw=true "嵌入式程序结构图") |
|:--:|
| *云台控制原理（与PX类似）* |

### 其他参考文献

- 软件架构参考[PX4 Architectural Overview](https://dev.px4.io/master/en/concept/architecture.html)

- 云台控制参考[PX4 Controller Diagrams](https://dev.px4.io/master/en/flight_stack/controller_diagrams.html)

- 底盘Mixer和CAN的Control Group参考[PX4 Mixing and Actuators](https://dev.px4.io/master/en/concept/mixing.html)

## TODO
- 给BSP USB print加保护，允许不同进程的使用。
  - 给所有BSP加保护
  - device.c里面加上一个Device_Init()，在里面初始化所有mutex
- CAN设备代码优化。消息解析发送方向。
  - CAN设备动态初始化，保存好几组配置。

## Roadmap

1. 在步兵上完成所有功能。
