<!--
 * @Description: file content
 * @Author: CK.Zh
 * @Date: 2020-02-20 11:39:38
 * @LastEditors: CK.Zh
 * @LastEditTime: 2021-03-10 13:48:33
 -->
# NaviKit_stm32
 PM1导航套件中电源控制板源码，STM32F107VCT6，开发环境STM32CubeIDE
# 特性

## 1.电池管理统计功能（基于IIC协议的库仑计）
## 2.负载的启动顺序编辑和软件改变/查询负载状态
## 3.电源监控功能（多轨电源电压监控）

# 串口通信协议
* 在jetson nano系统中，找到串口ACM，发送数值（0-11），即可通过硬件重启12个usb口对应的设备

 `STM32作为CDC Device接入到USB2.0-HUB的Downsteam 7端口下`

 * 负载开关部分
|  位置  |  字节0  | 字节1  | 字节2  | 字节3  | 字节4  | 字节5  | 字节6  | 字节7  |
|  ----  |  ----  |  ----  |  ----  |  ----  |  ----  |  ----  | ----  |  ----  |
| 功能  | 帧头 | 读写 | 指令 | 
| 示例  | 0xA5 | 0x80 读 </br> 0x81 写 </br> 0x7f 返回 |

* 电池管理部分

# Note
* 官方的HAL中USB库已知问题
 在使用usb的时候，
 文件`stm32f1xx_hal_pcd.c`
 函数`void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)`
 代码段`HAL_PCD_SuspendCallback(hpcd); ` 务必屏蔽，否则导致枚举失败，提示获取设备描述符失败。

* FreeRTOS调试指南
    * 莫名进入`HardFault`错误
        * 一般是堆栈大小不足导致，可通过`Static Stack Analyzer`中的`Call graph`来分析每个任务所占用的栈大小(并且以大纲视图看出任务中占用栈较大的函数)，从而修改每个任务的`stack_size`为合适大小
        * 如`elog_output()`该函数占用栈大小为400字节，如果有任务调用了该日志输出接口，那么freertos的默认`128*4=512`字节显然非常容易溢出

# 维护指南
* 为提高可移植性、可维护性、可阅读性，开发（应用层）时尽量使用`CMSIS_OS2`的抽象接口，特殊情况时再考虑使用RTOS的原生接口
*  `freertos.c`中的任务实体只保留默认任务, 其他线程任务实例、属性、句柄的声明及定义，独立存放在`App`文件夹 
* 线程、定时器、事件标志、互斥锁、信号量、消息队列等功能的初始化统一在`freertos.c`文件中进行初始化（内核启动前的预装载）

# 日志接口

* 串口输出(日志)波特率为 ~~56000bps~~ `115200bps`
* 日志输出支持`CSI`颜色模式
* 由于`elog`中使用了操作系统的信号量对临界资源(日志缓冲区)进行读写保护，所以只能在任务中调用日志接口，请勿在中断中调用日志接口。
* 日志含义：
    * DEBUG: `等级`/`标签` [`时间戳`] (`优先级`) `线程` (`文件路径` `方法`: `行数`) `消息内容`
    * RELEASE:  `等级`/ [`时间戳`]  `消息内容`

# 勘误
 硬件的v1.0以前版本中，SYS_RESET脚和MOD_SLEEP到单片机的实际连接与网络标号是相反的（问题发生在TXB0108PWR芯片附近），故代码中在GPIO处进行了相反的设置。