1. 教程说明
本教程适用于对飞控及Stm32程序设计比较熟悉的二次开发者快速掌握PH47框架的使用要点。本教程仅对PH47框架中最主要的二次开发特性进行简要说明,建议与框架中\DevStudio\Algorithms\Controller_Demo.cpp(.h)示例代码配合学习。关于二次开发特性中的详细或高级内容,请参见《PH47框架二次开发教程》。
对于飞控或是Stm32编程不是太熟练的开发者,建议先了解学习Stm32程序设计相关内容,以及《PH47框架二次开发教程》。
1.1 基本概念
- 时间相关、循环控制、调试功能大部分基本功能由框架层全局函数实现。
- 整个PH47框架内,数据读取、写入、交换等操作均依托框架层的数据总线系统(frm.bus),以frm.bus.Function()方式使用。
- 机载调参参数(控制参数)的读取、写入存储均通过框架层的参数系统(core.para)实现,以core.para.Function()方式使用。
- 用户代码一般位于应用层Application当中实现。应用层为用户提供了初始化、快速循环,普通循环、慢速循环函数,以及GCS上行指令响应函数、控制台指令响应函数等重要函数框架供用户扩充使用。
2. 基本全局功能函数使用
2.1 常用全局时间函数
函 数 |
功 能 描 述 |
HAL_Delay() |
用于ms 级延时,执行时独占系统资源 |
osDelay() |
用于ms 级延时。osDelay() 依赖于 FreeRTOS 启动完成,延时期间可以将系统资源轮换给其他线程使用 |
gDelay_us() |
用于 us 级别延时。延时时间不要超过 1000us |
gGetMills() |
获取调用时刻距离 mcu 加电启动时刻的ms时间间隔, 获取数据范围为 4294967296ms,即1193 hour |
gGetMills_f() |
获取精确到小数点后3位的ms时间, 即精确到us。 gGetMills_f()在运行时间超过4800s后会溢出重置为 0 后重新开始计时 |
gGetMicros() |
获取mcu加电以来的us时间。 注意: us计时器溢出时间为600s |
2.2 调试功能使用
函 数 |
功 能 描 述 |
TRACE() |
使用邮件队列方式显示格式化字符串。 具有线程安全性,且连续调用能够确保顺序正确。依赖于 PH47 框架的启动完成, 框架启动前不能正常工作。显示时刻会晚于函数调用时刻(滞后不高于 10ms 级别) 。 TRACE("\r\ndemo> 1. TRACE at %.3fms", gGetMills_f()); |
gPrintf() |
使用中断方式显示格式化字符串。 不依赖于框架的启动完成。连续密集调用时显示的先后顺序可能会发生改变 gPrintf("\r\ndemo> 2. gPrintf at %.3fms", gGetMills_f()); |
ASSERT(f) |
表达式f真值确认。 若表示式f为false,则核心板状态指示LED连续快速闪烁,当前线程执行停止在ASSERT()语句处,同时在调试串口输出ASSERT语句所在的文件名及代码行号。 |
bus.arDbg_1[10] bus.arDbg_2[10] |
调试专用总线数据项。只需将调试数据赋值给总线数据项即可。 PH47框架已经预置了调试数据的下行发送机制,用户无需自己实现。 调试数据默认下行发送频率为25hz,运行过程中可调整。 |
3 使用CFreqDiv类进行循环频率控制
- 1/3: 在.h文件中定义一个CFreqDiv类对象_FreqDemo_1Hz。
CFreqDiv _FreqDemo_1Hz;
- 2/3: 适当位置对_FreqDemo_1Hz对象进行初始化,如在.cpp文件初始化函数中,设定循环间隔。
_FreqDemo_1Hz.SetRunInv_ms(1000); // 循环控制间隔为 1000ms, 即 1Hz
- 3/3: 在需要进行循环频率控制的位置通过