PH47框架下BBDB飞控基础开发平台极简教程

1 硬件准备

1.1 一块WeAct 的Stm32F411核心板
在这里插入图片描述

1.2 2个USB-TTL模块。

在这里插入图片描述
1.3 Stm32开发所必须的如STlink烧写器。
1.4 必要的线材。

2 软件准备

2.1 Stm32开发所必备的Keil开发环境。
2.2 PH47框架代码,下载链接

2.3 CSS及BBDB 控制站工程,下载链接
2.4 一个串口调试工具软件。

3 硬件电路连接

3.1 Stm32F411核心板Usart1遥测串口、Usart6调试串口分别连接一个USB-TTL模块。
3.2 两个USB-TTL插入电脑,使用CSS打开遥测串口,使用串口调试工具打开调试串口,波特率均为115200。
3.3 Stm32F411核心板SWD调试口连接如Stlink的烧写器。
在这里插入图片描述

4 二次开发

4.1 用户代码位于DevStudio\Application\App_BBDB.cpp(.h)中。
4.2 框架回调功能函数:
 CAppBBDB.Init():PH7 框架完全启动后的的初始化函数。用户初始化代码可位于该函数中实现。
 CAppBBDB.FastThread_1000Hz():框架快速线程函数,调用频率在400—500hz之间波动。
 CAppBBDB.NormalThread_250Hz():框架普通线程函数,调用频率固定为250hz。
 CAppBBDB.SlowThread_50Hz():框架慢速线程函数,调用频率固定为50hz。
用户的算法及逻辑实现代码,根据更新频率,以及实际运行时间,合理置于上述三个函数中予以实现即可。相关高级功能使用,见PH47框架二次开发教程。
4.3 PH47框架全局函数、数据总线、参数系统、遥测通讯系统等等的使用示例,见CController_Demo示例类文件:\DevStudio\Algorithms\Controller_Demo.cpp(.h)。



// Demo_12. 算法层创建自定义控制器类(3/7) - 通用控制器抽象类派生类 CController_Demo 实现 
#include "./Controller_Demo.h"

/*
	CController_Demo 类为 PH47 控制代码框架 BBDB 固件特意设计的二次开发 Demo 代码集合.
		本代码对以下二次开发功能进行了示例(使用 IDE 查找功能在整个项目范围内查找如 "Demo_12." 即可找到该示例的全部操作步骤)
	
		Demo_1. 二次开发代码中基本文件包含
		Demo_2. TRACE/gPrintf 调试信息输出语句的使用
		Demo_3. 全局时间函数的基本使用
		Demo_4. 获取代码运行时间
		Demo_5. PH47 代码框架启动完成标志
		Demo_6. 数据总线基本操作
		Demo_7. 机载参数基本操作
		Demo_8. 使用 FreqDiv 类进行循环频率控制
		Demo_9. 如何实现调试串口自定义控制命令( 位于 CAppBBDB.HandleConsoleCmd() 函数实现)
		Demo_10.下行发送 mavlink 控制命令及状态信息
		Demo_11. 解析及响应 GCS 上行控制命令
		Demo_12. 算法层创建自定义控制器类
		Demo_13. 对自定义控制器类内部运行实施控制
		Demo_14. 自定义总线数据项 ( 分别位于DevStudio\BoardConfig\Board_BBDB\DataBus_BBDB.h, BusItemDef4User.h 中)
		Demo_15. 自定义全局状态变量 OptiFlowTof_MTF01 (位于 DevStudio\BoardConfig\Board_BBDB\StateVarDef_BBDB.h 文件中)
		Demo_16. 自定义机载控制参数 P_TEST_USER_1 (位于 \DevStudio\BoardConfig\Board_BBDB\ParamDict_BBDB.h / .cpp 文件中)
		Demo_17. PostMessage 机制使用
		Demo_18. Pwm 输入输出控制

	在调试串口当中输入命令 debug; 即可对上述示例代码运行效果进行切换
*/

// Demo_1. 二次开发文件包含 - 在 .cpp 文件中对 UseGlobalObject.h 进行文件包含
#include "../Frame/UseGlobalObject.h"	

void CController_Demo::Init() 
{
   
   
	// Demo_2. TRACE()/gPrintf() 调试信息输出语句使用:
	//   1. TRACE 为使用邮件队列方式显示格式化字符串, 特点是具有线程安全性,且连续调用能够确保顺序正确.
	//      依赖于 PH47 框架的启动完成, 框架启动前不能正常工作. 
	//      显示时刻会晚于函数调用时刻(滞后不高于 10ms 级别)	
	//   2. gPrintf() 为使用中断方式显示格式化字符串, 不依赖于框架的启动完成
	//      连续密集调用时显示的先后顺序可能会发生改变
	
	TRACE("\r\ndemo> 1. TRACE at %.3fms", gGetMills_f());	
	gPrintf("\r\ndemo> 2. gPrintf at %.3fms", gGetMills_f());	

	// Demo_3. 全局时间函数的基本使用 
	//   1. HAL_Delay() 或 osDelay() 函数可用于 ms 级延时, 区别在于 osDelay() 依赖于 FreeRTOS 启动完成(可以简单理解为PH47代码框架启动完成), HAL_Delay 则不依赖
	//      osDelay() 在延时期间可以将系统资源轮换给其他线程使用, HAL_Delay()则不能
	//   2. gDelay_us() 可用于 us 级别延时, 延时时间不要超过 1000us
	//   3. gGetMills()   获取调用时刻距离 mcu 加电启动时刻的 ms 时间间隔, 获取数据范围为 4294967296ms,即 1193 hour
	//   4. gGetMills_f() 可以获取精确到小数点后3位的 ms 时间, 即可以精确到 us. 但是 gGetMills_f() 在运行时间超过4800s后会溢出重置为 0 后重新开始计时
	//   5. gGetMicros()  获取 mcu 加电以来的 us 时间, 注意: us 计时器溢出时间为 600s
	
	osDelay(1);
	TRACE("\r\ndemo> 3. TRACE at %dms %.3fms %dus", gGetMills(), gGetMills_f(), gGetMicros());

	// Demo_4. 获取代码运行时间 (Step1/2) - 记录代码段执行开始时间
	uint32_t uPrevUs = gGetMicros();
	// 代码执行...
	gDelay_us(200);
	// Demo_4. 获取代码运行时间 (Step2/2)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值