浅析Betaflight中的OSD叠加程序【MAX7456AT7456】
创始人
2024-02-07 06:52:16
0

前言:想要对OSD下手已经不是头一次了,前几次都浅尝辄止。一个是能力不够,BetaFlight的代码体系太庞大了,看不懂也摘不出来。

这次要做一款带osd功能的接收机(用在遥控车上),所以又来打飞控程序主意。

参考代码:betaflight-3.3.1
OSD叠加芯片:AT7456E 【可以在立创商城中搜索PDF的文档】

 Betaflight中有关于常用飞控型号的图片,经过查看可以知道大多数飞控使用的OSD芯片为AT7456E

飞控板子一般不会留下SWD接口给予调试。所以想要拿飞控板进行开发AT7456的话可以我之前发布的一篇文章进行烧录。关于对飞控芯片(STM32)DFU模式升级的认识_New农民工的博客-CSDN博客【举报再看养成习惯,噢 不对,点赞再看 养成习惯。感谢支持】首先:飞控只是一个开发板,大家都可以开发!开发就要把自己的程序下载进去,所以我们来看一下在没有Jlink帮助,只使用飞控上的USB口升级飞控固件的办法。当前市面上主流飞控都是DFU升级,我之前做过的项目中也有使用dfu升级固件的,但都是使用Dfuse demo工具升级的【如下图所示】。升级使用的文件后缀也是.dfu。所以我就好奇,为什么bf软件使用DFU的方式升级,使用的却是hex文件?没想...https://blog.csdn.net/qq_44810226/article/details/122858063?spm=1001.2014.3001.5501

下面是AT7456部分的电路图。可以看到使用SPI与之通讯不需要额外的控制引脚。

MAX7456和AT7456的不同之处:

 

 

AT7456预装512的字符, AT7456E有两页。MAX只有一页。

AT通过CA【8】来翻页,MAX用不到CA【8】。所以后面可以通过CA【8】寄存器来区分AT和MAX7456

 

 

 

解析过程:

=======================================

新版本的bf源代码看起来不够直观,因为要适配很多平台所以,看起来有点绕。

下面分析使用的版本为betaflight-3.3.1。可以到github-bf下载历史版本。

 上述文件是OSD框架文件。这里没有具体的硬件层操作,是将底层操作函数封装成一个结构体。然后通过对结构体的调用,来实现对OSD芯片的操作。   

【记住这里的几个结构体的名字】等下会看到。

 

struct displayPortVTable_s;typedef struct displayPort_s {const struct displayPortVTable_s *vTable;xxxxx...
} displayPort_t;typedef struct displayPortVTable_s {xxxxx...
} displayPortVTable_t;typedef struct displayPortProfile_s {xxxxx...
} displayPortProfile_t;

 这里可以把结构体理解为一个类,这个类拥有描述自己参数,以及操作OSD的函数可以调用。像是Python中的Class。后面的程序会将结构体作为参数来传递。

========================================================================

通过上述文件:OSD显示程序的调用是这里实现的,以60Hz的频率调用 osdSlaveUpdate函数,相当于在后台loop这个函数,以实现osd刷新功能。

进入【osdSlaveUpdate】函数 来到下面文件【osd_slave.c】

 可以看到实际是调用的【displayDrawScreen(osdDisplayPort);】函数。

然后看一下这个文件主要做什么:

 主要就三个函数:

        一、Init初始化函数,osd初始化阶段要做的事情。

displayWrite(osdDisplayPort, 13, 6, "OSD");

         可以看出主要是通过displayWrite函数进行显示。

        二、check函数、暂时不关心

        三、osdSlaveUpdate就是之前说的后台Loop函数。用于程序运行过程中的刷新

从这个文件中就可以看出,所有的操作都是对displayPort_t结构体的实例化的操作。

接下来我们看看,初始化函数中传入的实际参数是谁。

void osdSlaveInit(displayPort_t *osdDisplayPortToUse)

通过全局搜索:

 是下面函数的返回值 给了init初始化函数。继续进入函数内部查看

osdDisplayPort = max7456DisplayPortInit(vcdProfile());

【displayport_max7456.c】 

【max7456.c】再进入max7456Init函数看一下:

 可以看出这里是对硬件进行配置。很多操作都是针对硬件的了。框起来的程序中有一部分是对芯片进行区分。

    // Detect device type by writing and reading CA[8] bit at CMAL[6].// Do this at half the speed for safety.spiSetDivisor(MAX7456_SPI_INSTANCE, MAX7456_SPI_CLK * 2);max7456Send(MAX7456ADD_CMAL, (1 << 6)); // CA[8] bitif (max7456Send(MAX7456ADD_CMAL|MAX7456ADD_READ, 0xff) & (1 << 6)) {max7456DeviceType = MAX7456_DEVICE_TYPE_AT;} else {max7456DeviceType = MAX7456_DEVICE_TYPE_MAX;}

 通过对CA8寄存器的读写来判断当前使用的那款芯片。

先对上述的几个文件进行整理分析:

 

到此,对bf固件中osd部分代码应该有一点点了解了。其实其他部分应该也是这样看的。还剩下具体的硬件操作函数,我还没有看完,正好篇幅挺长了,主要是截图多。看完接着写,未完待续.....

相关内容

热门资讯

“手术钻头断裂遗留患者体内”,... 12月21日,湖南祁阳市卫生健康局发布情况通报称,近日,有媒体报道祁阳市中医医院发生骨科手术钻头断裂...
代驾纠纷 代驾时撞伤行人、车辆发生故障…… 这些都和车主无关,应由代驾赔偿? 观点: 使用代驾服务并非将所有...
公司股东与妻子分居期间出轨女下... 近日据报道,宁夏永宁县人民法院一审查明公司股东李某乙在与妻子李某甲分居期间,与公司女员工马某某存在不...
动物学家、律师和创作者,Thi... 12月21日,以“一起·了不起”为主题的2025 ThinkPad黑FUN礼在京举办。活动现场,律师...
徐奇渊:扩内需与对外政策紧密相... 近日,中国海关总署发布了一组数据令人关注:2025年前11个月,我国货物贸易顺差达到1.08万亿美元...
46岁上海独居女子不幸离世,官... 居住在上海虹口区46岁的蒋女士因突发脑溢血于今年10月入院,远亲吴先生与其公司共同垫付了医药费,但她...
威海市汽车以旧换新补贴政策调整... 根据稳妥有序开展消费品以旧换新工作统一部署,经研究决定,对我市汽车以旧换新补贴政策进行调整。现将有关...
动物学家、律师、创作者都pic... 12月21日,在2025 ThinkPad黑FUN礼现场,三名专业领域用户用真实案例诠释了Think...
从拒赔到和解:涉外货运保险理赔... 近日,国家金融监管总局、最高人民法院遴选出6个具有典型性、示范性的金融领域纠纷多元化解案例,12月1...