当前位置: 首页 > 工具软件 > PH7 > 使用案例 >

PH7 202108 开发进度——驱动层、框架层完成

毛淳
2023-12-01

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 板间移植:
	
*/
 类似资料: