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)

最低0.47元/天 解锁文章
1375

被折叠的 条评论
为什么被折叠?



