码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 浅析Betaflight中的OSD叠加程序【MAX7456&AT7456】


    前言:想要对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芯片的操作。   

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

    1. struct displayPortVTable_s;
    2. typedef struct displayPort_s {
    3. const struct displayPortVTable_s *vTable;
    4. xxxxx...
    5. } displayPort_t;
    6. typedef struct displayPortVTable_s {
    7. xxxxx...
    8. } displayPortVTable_t;
    9. typedef struct displayPortProfile_s {
    10. xxxxx...
    11. } 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函数看一下:

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

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

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

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

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

    后续:

    补一张之前整理的类图

  • 相关阅读:
    微信小程序抓包教程:Burpsuite版 附所需工具
    服务器数据恢复-V7000存储2块磁盘故障脱机的数据恢复案例
    vue 使用Dialog对话框使用过程中出现灰色遮罩问题
    yarn多级包依赖不同版本的组件,最终到底会怎么安装?
    [Qualcomm][Voice Call]语音通话流程和问题分析
    如何创建属于自己的百度百科?这几个创建方法赶紧收藏
    记录--两行CSS让页面提升了近7倍渲染性能!
    perl语言入门学习
    21天学习挑战赛--第四天打卡(横竖屏切换)
    彻底解决Win11锁屏界面黑屏或者图片不变化
  • 原文地址:https://blog.csdn.net/qq_44810226/article/details/121625888
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号