前言:想要对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部分代码应该有一点点了解了。其实其他部分应该也是这样看的。还剩下具体的硬件操作函数,我还没有看完,正好篇幅挺长了,主要是截图多。看完接着写,未完待续.....

浅析Betaflight中的OSD叠加程序【MAX7456AT7456】相关推荐

  1. 浅析C#中构建多线程应用程序

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  2. 视频矩阵系统中三代OSD字符叠加技术全面解析

    视频矩阵系统中三代OSD字符叠加技术全面解析 屏显信息更丰富 中文效果更出色 使用设置更灵活 --视频矩阵系统中三代OSD字符叠加技术全面解析 前言: 在以矩阵为控制中枢的视频监控系统中,大量的视频信 ...

  3. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  4. 浅析 PHP 中的 Generator

    浅析 PHP 中的 Generator Miss Wang php开发案例 前天 何为 Generator 从 PHP 5.5 开始,PHP 加入了一个新的特性,那就是 Generator,中文译为生 ...

  5. python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列

    浅析python中的分片与截断序列 序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的 ...

  6. java scri p t_深入浅析JavaScript中数据共享和数据传递_javascri

    数据共享和数据传递是相辅相成的,我们一起来讨论这个问题.首先要说的是共享和传递都是有作用域的.作用域就是起作用的区域,在同一个作用域数据可以共享,超过这个作用域就是跨作用域,就得用到数据传递了. 作用 ...

  7. java printf与println_浅析Java中print、printf、println的区别

    我们的程序员在开发的时候,都会使用到很多不同的功能,但是有些功能是大同小异,别着急,下文是爱站技术频道小编为大家带来的浅析Java中print.printf.println的区别,希望对你学习有帮助! ...

  8. python中的列表和元组_浅析Python中的列表和元组

    区别列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数). 元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变. 元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问 ...

  9. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

最新文章

  1. 五、吃掉Java基本数据类型,学习Java的基础
  2. 骗人的数学题,那消失的1块钱到底被谁拿走了
  3. 外媒:三星电子与现代汽车考虑在汽车芯片领域结盟
  4. 小微数字风控必学-冷启动开发风险评分(含实操)
  5. Number()函数转换‘单个数值的数组‘为何是数字?【JavaScript】
  6. 网络编程-TCP/IP各层介绍(5层模型讲解)
  7. juqery合成事件toggle方法
  8. Mac下安装第三方模块报错:‘sqlfront.h‘ file not found的解决办法
  9. Fastdfs(1)安装之Tracker
  10. acm运行时错误_计人即讯|ACM纳新赛
  11. 免费在upic中设置OneDrive或Google Drive作为图床
  12. 购买了正版的supermemo 15,花了60$
  13. Python下selenium的get()方法大量时间超时报错TimeOut
  14. Discovery and auto register
  15. php图片素描化,ps怎么把图片变成素描图片
  16. Java实现zip文件压缩:单个文件、文件夹以及文件和文件夹的压缩
  17. 基于matlab的颜色识别与提取_机器视觉综合实训有得
  18. linux下如何捕捉方向键
  19. @RestController注解的理解
  20. 红帽子服务器虚拟化技术只要是,红帽子企业版.Linux.5

热门文章

  1. UPC 2020年夏混合个人训练第五十场【DEG】
  2. 得用户者得天下  解析明基的保时捷设计水准
  3. Outlook打不开的问题
  4. 分数统计设计java程序_(windows综合程序)设计一个学生平时成绩统计软件 最后的Java作业...
  5. 【b站黑马程序员C++视频学习笔记-继承方式】
  6. a java programe about tcp server
  7. 当Android开发遇到魅族手机
  8. 【NOI2015模拟YDC】游戏
  9. sqlsugar模糊查询
  10. 网站点击弹窗微信二维码功能纯CSS