1、驱动层完成,意味着PH7控制板上的各硬件设备原始数据可用,同时 PH7 架构支持不同的MCU、不同的传感器、存储设备等等的移植和互换。
2、框架层完成,PH7整个软件体系的数据总线、运行控制、上、下行通讯及控制、机载参数、航点设置、飞行数据记录、调试控制台等主要功能已经完备。
/*
/
1. 代码层次
由底层向上,依次分为4个层 BSP, Frame, Algorithms, Application. 每个层由一个引用或对象进行代表,通过该引用或对象
即可使用该层提供的各种功能.
BSP : 为 PH7 驱动层,负责 MCU 及各种外设的驱动实现,负责 PH7 框架与 Stm32CubeMx 生成框架之间的对接。
Frame : 为 PH7 框架层,为 PH7 系统提供运行框架。提供诸如数据总线、调试控制台及调试函数、运行时间控制、消
息响应机制实现、遥测通讯协议实现、线程间通讯等等功能性框架。
Algorithms : 为 PH7 算法层,提供基础数学库、姿态测量、姿态控制、导航控制等各种相关算法实现。
Application : 为 PH7 应用层,在上述三层的基础上实现 AHRS/飞控/云台/地面站等等各种应用在逻辑层面的实现及控制.
/
2. 重要的全局性对象/引用/指针
在整个PH7代码框架中具有重要地位、使用较为频繁的全局性对象/引用/指针共有如下:
drv : 驱动层全局引用,负责整个 PH7 硬件设备的驱动实现
frm : 框架层全局引用,提供 PH7 软件框架的各种功能
algo : 算法层全局引用
app : 应用层全局引用
bus : 数据总线全局应用, 通过该引用使用数据总线的各种功能
msg : 消息循环全局应用
用户如需要在自己的代码中使用上述全局性对象/引用/指针,那么只需要在 c++ 代码文件文件的开头处加入如下文件
包含代码(需要根据实际情况更改包换路径): #include "../Frame/UseGlobalObject.h"
.....................................................................................................
drv: 全局引用,通过其可访问 PH7 硬件控制板的各设备及对应的功能,目前已有的设备对象为:
drv._pAccel : 加速度计
drv._pAdcImu : 获取 IMU 姿态数据的 AD 转换器
drv._pAdcTemp : 获取 IMU 温度数据的 AD 转换器
drv._pAnalogInput : 计算 IMU 温度数据
drv._pBaro : 气压计
drv._pFlash : 板载 flash
drv._pGyro : 陀螺仪
drv._pI2C_1 : MCU I2C 1 接口
drv._pLed : 板载 RGB LED
drv._pMag : 磁强计
drv._pPwm : PWM 输入输出
drv._pSpiAdcImu : IMU 姿态测量 AD 转换器的 spi 数据输出 spi
drv._pSpiAdcTemp : IMU 温度测量 AD 转换器的 spi 数据输出 spi
drv._pSpiFlash : Flash 的 spi 数据及控制接口
drv._pSysTimer : 系统定时器
drv._pUartBoardCtrl : 板载控制接口
drv._pUsartGps : gps 接口
drv._pUsartTele : 遥测数据接口
.....................................................................................................
frm: 全局引用, 通过该引用的各个次级对象可使用 PH7 框架功下提供的各种功能实现,具体如下:
frm.mavlink : 提供mavlink协议下的数据通讯功能, 具体功能函数定义位于类 CMavlinkWrap 中,二次开发用户通常
使用的功能函数如下(下同):
>> uint16_t AddMsg_XXXX(mavlink_xxxx_t *pPacket) : 将当前需要对 GCS(或其他节点)发送的 mavlink msg
加入到 usart dma 发送缓冲区中在每一个msg发送周期,
ph7 框架通过 CFrame.MsgSend2GCS_25h()函数 会将
当前缓冲区中的已有数据通过dma方式进行发送(写入usart)
frm.para : 提供机载控制参数的各种操作功能, 在 CParameter 类实现中, 涉及 flash 的读写操作具有以下
特性:1. 读写操作具有阻塞性. 2. 读写操作之前均进行 busy 判断, 若为 busy 状态则会在预设
timeout 时间内继续等待及再次进行 busy 判断. 以下均同.
>> void InitFlashParaDat_FstRun() : 在固件首次烧写后的运行时, 初始化 para 的名称,默认值,变量属性.
本函数在固件有效期间只需运行一次
>> bool ReadPara(uint16_t uParaInx, AIRPLANEPARA *pPara) : 根据参数 id(定义见 ParaDefine.h 中 PARAID 枚举),
从板载 flash 中读取参数数据
>> bool WritePara(uint16_t uParaInx, AIRPLANEPARA *pPara) : 根据参数 id 向板载 flash 中读取参数数据
>> bool Set(PARAID eParaId, float fValue, bool blForceSave) : 根据参数 eParaId 设置内存中的参数数值, 若 blForceSave == true
则同时更新 flash 中的数值
>> float Get(PARAID eParaId) : 从内存数组中获取 eParaId 的数值
>> uint16_t CParameter::GetParaIdByName(char szParaName[LEN_PARANAME])
>> const char *GetParaName(PARAID eParaID)
>> uint16_t GetParaCount()
>> uint16_t GetParaType(PARAID eParaID)
>> uint16_t GetParaProperty(PARAID eParaID)
frm.wp : 提供航线航点的各种操作功能
>> bool WriteHeadInfo(HEADINF_WAYPOINT *pWpHeadInfo) : 写入航点数据的头信息(HEADINF_WAYPOINT),
头信息可用于描述航点序列的特性信息
>> bool ReadHeadInfo(HEADINF_WAYPOINT *pWpHeadInfo)
>> bool ReadWP(uint16_t uWpInx, WAYPOINT *pWaypoint) : 读取航点数据
>> bool WriteWP(uint16_t uWpInx, WAYPOINT *pWaypoint) : 写入航点数据
>> void SetWpCounts(uint16_t uCounts)
>> uint16_t GetWpCounts()
frm.log : 提供飞行数据记录的的各种操作功能
>> void InitHeadInf_FstRun() : 在固件首次烧写后的运行时初始化 log 记录所需的各必要数据
>> bool ReadHeadInfo(LOG_HEAD *pHeadInfo) : 读取 log 相关头信息, 包含每次 log 记录的时间, 记录的开始/结束序号
>> bool StartWrite(TYPE_WRITELOG eWriteType) : 开始 log 数据记录, eWriteType 为 FLIGHT_NEW_STRAT 表示开始一次新的 log 记录. FLIGHT_RESUME 表示
恢复之前被暂停的 log 记录. 区别在于, 该段 log 记录数据时间,开始/结束记录索引是否沿用
>> bool StopWrite() : 在需要结束或者暂停 log 记录过程时,必须调用该函数停止记录, 否则有可能会造成 buff 当中的数据内容丢失.
该函数将 buff 内容写入 flash, 同时强制更新文件头数据
>> CLogFile.SetTime()
上述各次级对象下的成员函数使用可参见具体代码实现
.....................................................................................................
bus: 整个 PH7 软件框架的数据总线系统,具有以下主要功能函数
>> void Init(uint16_t uThreadProp, T InitValue) : 初始化数据总线模板类对象数据的线程属性及初始数据
>> void Set(T Value) : 设置数据总线模板类对象数据
>> T Get() : 获取数据总线模板类对象数据
>> void RefSet(const T &ValueRef) : 以引用方式 设置 数据总线模板类对象数据, 适用于较大的模板类对象
>> void RefGet(T &Ret) : 以引用方式 获取 数据总线模板类对象数据, 适用于较大的模板类对象
>> bool SetTS(uint16_t uThread, T Value): 针对跨线程的数据总线项设置总线数值
>> float GetTimeTag() : 获取总线数据项在上一次设置时的时间戳(ms, 精确到小数点后3位)
>> float GetPrevDt() : 获取当前总线数据项距离上一次设置时刻的的时间间隔(ms, 精确到小数点后3位)
数据总线当中有一个模板数组 arSystemInfo[] 用于存储系统运行过程中的系统数据,具体内容见 "重要的全局功能函数/宏/类"
.....................................................................................................
algo:
.....................................................................................................
msg:
.....................................................................................................
app:
/
3. PH7 为用户开发提供的框架性函数
框架性函数为二次开发用户提供了 PH7 的结构框架, 用户可以在这些框架中进行自由的定制开发.
>> CFastThread / CNormalThread / CSlowThread Init() :
各线程的初始化函数, 此类函数在各个线程创建及运行之前被调用, 故在该类函数中不能使用 cmsis 提供的线程调度、线程时间控制
一类的线程操作函数, 因为此时线程尚未创建。
>> CAirPlane.InitAfterThreadStart()
在各个线程创建且开始运行后的初始化函数.
>> CFastThread / CNormalThread / CSlowThread Loop() :
各线程的线程功能实现函数, 用户可在上述函数中实现自己的各种功能开发与实现
///
4. 重要的全局功能函数/宏/类
提供给用户使用的全局性功能函数位于 GlobalFun.cpp 中,具体如下:
>> uint32_t gGetMicros(): 获取以 us 为单位的当前时刻,溢出时间为 600s,使用 Tim2 实现
>> uint32_t gGetMills() :获取以 ms 为单位的当前时刻,使用 Tim2 实现
>> uint32_t gGetTmUsage_us(uint32_t uPrevUs): 获取距离 uPrevUs 时刻,以 us 为单位的时间间隔
>> uint32_t gDelay_us(uint16_t uDelay): 阻塞性延时 uDelay 微秒
>> uint32_t gGetTmUsage_ms(uint32_t uPrevMs) : 获取距离 uPrevMs 时刻,以 ms 为单位的时间间隔
>> void gTrigleTestPin(): 触发测试管脚(TEST_PIN, PC1)高低电平
>> uint32_t gRNG_GetRandomNum() : 获取随机数
>> ASSERT(f) : 确认表达式 f 为真
>> TRACE(fmt, args ...) : 通过控制台/调试串口(USART_CONSOLE),以串口中断方式输出文字信息
TRACE 采用邮件队列方式处理待发送字符串, 故多个TRACE执行时具有严格的顺序性, 此外 TRACE 具有跨线程安全性
TRACE 的运行依赖于线程的启动运行, 在线程启动运行之前该宏不能正确执行
>> void gPrintf(const char *fmt, ...) : 以中断方式向控制台/调试串口(USART_CONSOLE)输出字符串
gPrintf 在跨线程使用时应注意数据安全性,同时多个 gPrintf 密集执行时其时序可能会存在不确定性
gPrintf 可用于线程启动前的字符串输出
>> void gFormat(char *pBuffOut, const char *fmt, ...): 格式化输出字符串
>> CFreqDiv: loop 循环中用于控制代码运行时间间隔的功能类, 具体功能实现可参见功能实现代码
数据总线当中有一个模板数组 arSystemInfo[] 用于存储系统运行过程中的系统数据, 具体类型如下:
#define SYS_TM_IDLETHREAD 1 // 线程运行时间
#define SYS_TM_FAST 2
#define SYS_TM_NORMAL 3
#define SYS_TM_SLOW 4
#define SYS_FREEMEM_IDLETHREAD 5 // 各线程运行时间(us)
#define SYS_FREEMEM_FAST 6
#define SYS_FREEMEM_NORMAL 7
#define SYS_FREEMEM_SLOW 8
#define SYS_WORK_MODE 9 // 当前 PH7 系统工作模式, 宏定义: SYS_DEVELOP / SYS_RELEASE / SYS_ADMIM
#define SYS_CONSOLE_COMMAND 10 // 当前控制台接收到的命令, enum CONSOLE_COMMAND
/
5. 二次开发其他注意事项
.....................................................................................................
控制板进行首次固件烧写时的操作步骤
.....................................................................................................
系统初始化顺序
PH7 各模块初始化工作集中在 CAirPlane.Init() 函数中进行, 需要注意的是, 该函数调用顺序在 cubeMX 生成驱动代码初始化之后, FreeRtos 初始化(创建)及启动之前,
本函数运行于线程创建之前,故本函数中不能使用线程相关的调度、时间函数,以及使用了线程工作机制的 ASSERT, TRACE 等功能函数.
如果某些初始化工作必须在线程运行之后,那么可在 CAirPlane.InitAfterThreadStart() 进行初始化
CAirPlane.Init() 函数中各函数初始化顺序为:
drv.Init();
bus.Init();
frm.Init();
algo.Init();
gGlobalInit();
InitThread();
.....................................................................................................
参数系统定制:
飞控参数的个数, 类型可以自由定制, 增加参数的方法:
1. 在 DevStudio\Frame\ParaDefine.h 文件中加入在PARAID 枚举中对参数id的定义
2. 在上述文件的 const PARADICT g_arParaDictMCU[MAX_PARAS]{...} 结构数组中加入对参数名称, 默认值, 参数类型的定义
注意! 新加入参数在结构数组中的的下标 必须 与在PARAID 枚举中定义的 ID 下标一致
.....................................................................................................
数据总线定制:
.....................................................................................................
飞行数据记录定制:
.....................................................................................................
PH7 板间移植:
*/