BetaFlight统一硬件配置文件研读

news2024/9/25 9:35:56

BetaFlight统一硬件配置文件研读

  • 1. 源由
  • 2. 分析
    • 2.1 硬件SOC
    • 2.2 统一配置文件
    • 2.3 cli命令
    • 2.4 板级配置主要命令
      • 2.4.1 board_name
      • 2.4.2 manufacturer_id
      • 2.4.3 resource
      • 2.4.4 timer
      • 2.4.5 dma
      • 2.4.6 serial
      • 2.4.7 set
      • 2.4.8 feature
  • 3. 实例研读
    • 3.1 C遗留配置
    • 3.2 BoardName - AOCODARCH7DUAL
    • 3.3 ManufacturerId - SJET
    • 3.4 更多内容展开
  • 4. 参考资料

统一硬件配置文件的设计是一种非常好的设计模式,可以将硬件和软件的工作进行解耦。

1. 源由

统一硬件配置文件的软硬件解耦方式通过一系列的cli命令组成,最终通过parameter参数调整,达到硬件配置功能。

如果不过多深究内部设计,可以简单参考:BetaFlight统一硬件资源简单配置修改

希望了解更多内部实现,那不是一两句话可以简单说清楚的,我们接下来,对这部分内容进行展开,希望通过分析得到更多设计上的细节。

2. 分析

统一硬件配置文件是由一系列的cli命令组成,这些命令对不同SOC框架的MCU硬件资源进行配置。

2.1 硬件SOC

Betaflight 4.4.1 Note, 比如:4.4.1固件 STM32F405/F411/F745/F7X2/G47X/H723/H730/H743/H750
在这里插入图片描述

2.2 统一配置文件

betaflight/unified-targets, 提供了各种厂家各类板子。如果硬件设计是参考过来的,这里就有原始配置文件。基于这个进行修改将事半功倍。

厂家名录详见:manufacturer_id

在这里插入图片描述

2.3 cli命令

在BetaFlight模块设计之三十:Cli模块分析中,已经初步介绍了BetaFlight Configurator如何将cli命令解析和识别,并最终与命令挂钩的。

# help
adjrange - configure adjustment ranges
	<index> <unused> <range channel> <start> <end> <function> <select channel> [<center> <scale>]
aux - configure modes
	<index> <mode> <aux> <start> <end> <logic>
batch - start or end a batch of commands
	start | end
beacon - enable/disable Dshot beacon for a condition
	list
	<->[name]
beeper - enable/disable beeper for a condition
	list
	<->[name]
bind_rx - initiate binding for RX SPI or SRXL2
bl - reboot into bootloader
	[rom]
board_name - get / set the name of the board model
	[board name]
color - configure colors
defaults - reset to defaults and reboot
	{show} {nosave} {bare} {group_id <id>}
diff - list configuration changes from default
	[master|profile|rates|hardware|all] {defaults|bare}
dma - show/set DMA assignments
	<> | <device> <index> list | <device> <index> [<option>|none] | list | show
dshot_telemetry_info - display dshot telemetry info and stats
dshotprog - program DShot ESC(s)
	<index> <command>+
dump - dump configuration
	[master|profile|rates|hardware|all] {defaults|bare}
escprog - passthrough esc to serial
	<mode [sk/bl/ki/cc]> <index>
exit
feature - configure features
	list
	<->[name]
flash_erase - erase flash chip
flash_info - show flash chip info
flash_read
	<length> <address>
flash_scan - scan flash device for errors
flash_write
	<address> <message>
get - get variable value
	[name]
gpspassthrough - passthrough gps to serial
gyroregisters - dump gyro config registers contents
help - display command help
	[search string]
led - configure leds
manufacturer_id - get / set the id of the board manufacturer
	[manufacturer id]
map - configure rc channel order
	[<map>]
mcu_id - id of the microcontroller
mixer - configure mixer
	list
	<name>
mmix - custom motor mixer
mode_color - configure mode and special colors
motor - get/set motor
	<index> [<value>]
msc - switch into msc mode
	[<timezone offset minutes>]
play_sound
	[<index>]
profile - change profile
	[<index>]
rateprofile - change rate profile
	[<index>]
rc_smoothing_info - show rc_smoothing operational settings
resource - show/set resources
	<> | <resource name> <index> [<pin>|none] | show [all]
rxfail - show/set rx failsafe settings
rxrange - configure rx channel ranges
save - save and reboot
sd_info - sdcard info
serial - configure serial ports
serialpassthrough - passthrough serial data data from port 1 to VCP / port 2
	<id1> [<baud1>] [<mode1>] [none|<dtr pinio>|reset] [<id2>] [<baud2>] [<mode2>]
servo - configure servos
set - change setting
	[<name>=<value>]
signature - get / set the board type signature
	[signature]
simplified_tuning - applies or disables simplified tuning
	apply | disable
smix - servo mixer
	<rule> <servo> <source> <rate> <speed> <min> <max> <box>
	reset
	load <mixer>
	reverse <servo> <source> r|n
status - show status
tasks - show task stats
timer - show/set timers
	<> | <pin> list | <pin> [af<alternate function>|none|<option(deprecated)>] | list | show
version - show version
vtx - vtx channels on switch
	<index> <aux_channel> <vtx_band> <vtx_channel> <vtx_power> <start_range> <end_range>
vtx_info - vtx power config dump
vtxtable - vtx frequency table
	<band> <bandname> <bandletter> [FACTORY|CUSTOM] <freq> ... <freq>

2.4 板级配置主要命令

通常来说,与板子配置相关的主要命令如下:

2.4.1 board_name

board_name - get / set the name of the board model
	[board name]

2.4.2 manufacturer_id

manufacturer_id - get / set the id of the board manufacturer
	[manufacturer id]

2.4.3 resource

resource - show/set resources
	<> | <resource name> <index> [<pin>|none] | show [all]

2.4.4 timer

timer - show/set timers
	<> | <pin> list | <pin> [af<alternate function>|none|

2.4.5 dma

dma - show/set DMA assignments
	<> | <device> <index> list | <device> <index> [<option>|none] | list | show

2.4.6 serial

serial - configure serial ports

2.4.7 set

set - change setting
	[<name>=<value>]

2.4.8 feature

feature - configure features
	list
	<->[name]

3. 实例研读

手边正好有一块AOCODARC H7DUAL的板子,后续将就这块板子进行一个配置研读。

在这里插入图片描述
在这里插入图片描述

3.1 C遗留配置

以下配置内容,主要是说明该板子使用了一下硬件芯片:

  • 陀螺仪:BMI270
  • 气压计:DPS310
  • SPI Flash:W25N01G
  • 模拟OSD芯片:MAX7456
#define USE_ACCGYRO_BMI270
#define USE_BARO_DPS310
#define USE_FLASH_W25N01G
#define USE_MAX7456

3.2 BoardName - AOCODARCH7DUAL

board_name AOCODARCH7DUAL
static void cliBoardName(const char *cmdName, char *cmdline)
{
    const unsigned int len = strlen(cmdline);
    const char *boardName = getBoardName();
    if (len > 0 && strlen(boardName) != 0 && boardInformationIsSet() && (len != strlen(boardName) || strncmp(boardName, cmdline, len))) {  //合法性检查
        cliPrintErrorLinef(cmdName, ERROR_MESSAGE, "BOARD_NAME", boardName);
    } else {
        if (len > 0 && !configIsInCopy && setBoardName(cmdline)) {  //设置板子名称
            boardInformationUpdated = true;

            cliPrintHashLine("Set board_name.");
        }
        printBoardName(DUMP_ALL);
    }
}

3.3 ManufacturerId - SJET

manufacturer_id SJET
static void cliManufacturerId(const char *cmdName, char *cmdline)
{
    const unsigned int len = strlen(cmdline);
    const char *manufacturerId = getManufacturerId();
    if (len > 0 && boardInformationIsSet() && strlen(manufacturerId) != 0 && (len != strlen(manufacturerId) || strncmp(manufacturerId, cmdline, len))) {  //合法性验证
        cliPrintErrorLinef(cmdName, ERROR_MESSAGE, "MANUFACTURER_ID", manufacturerId);
    } else {
        if (len > 0 && !configIsInCopy && setManufacturerId(cmdline)) {  //设置生产商名称
            boardInformationUpdated = true;

            cliPrintHashLine("Set manufacturer_id.");
        }
        printManufacturerId(DUMP_ALL);
    }
}

3.4 更多内容展开

鉴于内容比较多,所以后续我们分章节进行(围绕配置命令展开):

  • 【1】BetaFlight统一硬件配置文件研读之resource命令
  • 【2】BetaFlight统一硬件配置文件研读之timer命令
  • 不断更新中,谢谢关注。。。 。。。

4. 参考资料

【1】BetaFlight开源代码框架简介
【2】BetaFlight统一硬件资源简单配置修改
【3】BetaFlight模块设计之三十:Cli模块分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net+C#基于web的失物招领系统ccA1A9程序

根据分析&#xff0c;该系统应该有二个角色&#xff1a;管理员、注册用户。系统需要赋予他们对应的功能和权限&#xff0c;具体如下&#xff1a; 管理员具有&#xff1a;管理管理注册用户、管理新闻模块、管理留言的功能和权限。 具有&#xff1a;浏览新闻、管理失物信息、参与…

【Linux内幕】DMA原理

1.前言 I/O设备与主存信息传送的控制方式分为程序轮询、中断、DMA、RDMA等。 2.DMA介绍 DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之…

GAT1400-视图库标准

一、简述&#xff1a; GA/T 1400是于2017年首次发布关于图片、视频片段、文件等属性对象的传输协议。 GA/T 1400《公安视频图像信息应用系统》分成4个部分&#xff1a; 第一部分–通用技术要求&#xff1b; 第二部分–应用平台技术要求&#xff1b; 第三部分–数据库技术要…

前端学习之使用JavaScript

前情回顾&#xff1a;网页布局 JavaScript 简介 avaScript诞生于1995年&#xff0c;它的出现主要是用于处理网页中的前端验证。所谓的前端验证&#xff0c;就是指检查用户输入的内容是否符合一定的规则。比如&#xff1a;用户名的长度&#xff0c;密码的长度&#xff0c;邮箱的…

刘强:作业帮给OceanBase提了九条意见

3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c; 作业帮数据库架构师刘强为大家带来了《作业帮基于 OceanBase 的 HTAP 实践》的分享 &#xff0c;为大家介绍了 OceanBase 上线作业帮半年来的体验与心得。 以下内容由大会演讲整理而成&#xff1a; …

提示工程玩转 ChatGPT

Prompt engineering is the skill of the future. 目录&#xff1a; 1. 简介 (Introduction) 2. 提示指南 (Prompt Guidelines) 2.1 指令要清晰明确 2.2 给模型时间思考 3. 迭代提示 (Iterative Prompt) 3.1 迭代过程 3.2 案例展示 4. 文本概括 (Text Summarization) 4.1 单文本…

五个有用的工具帮助您提高代码质量

前言 对于开发人员而言&#xff0c;代码质量一直是一个非常重要的话题。高质量的代码不仅可以提高应用程序的性能&#xff0c;还可以减少代码错误和维护成本。然而&#xff0c;如何确保代码质量呢&#xff1f;下面介绍五个有用的工具&#xff0c;可以帮助您提高代码质量。 So…

SLAM论文速递:SLAM—— NICER-SLAM: RGB SLAM的神经隐式场景编码—5.04(1)

论文信息 题目&#xff1a; NICER-SLAM:Neural Implicit Scene Encoding for RGB SLAM NICER-SLAM: RGB SLAM的神经隐式场景编码论文地址&#xff1a; https://arxiv.org/pdf/2302.03594.pdf发表期刊&#xff1a; Computer Vision and Pattern Recognition (cs.CV)标签 xxxx…

机器学习:协同过滤推荐算法

目录标题 题目&#xff1a;使用协同过滤&#xff08;基于用户&#xff09;构建简单的电影推荐系统1.1.1 实验目的1.1.2 实验内容及步骤1.1.3 程序运行过程、方法和运行结果1.1.4 实验小结 题目&#xff1a;使用协同过滤&#xff08;基于用户&#xff09;构建简单的电影推荐系统…

详解Mybatis之参数传递问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 目录 一. Mybatis中参数传递问题1.1 单个普通参数传递1.2 多个普通参数传递1.3 命名参数1.4 POJO(java Bean…

MySQL知识学习02(MySQL索引详解)

1、索引介绍&#xff1f; 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。打个比方: 我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去找我们需要查的那个字&…

鸿蒙Hi3861学习四-Huawei LiteOS介绍

一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统&#xff0c;是华为物联网战略的重要组成部分&#xff0c;具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈&#xff0c;为开发者提供“一…

MEET开发者 | 从无代码小白到大神,95后精神小伙的职场初体验

「无代码开发者故事」第一期的嘉宾是一位初入职场的95后&#xff0c;他保留了白羊座直率、热情的孩子天性&#xff0c;即便长期驻场也能“苦中作乐”&#xff0c;发挥自己旅游和摄影的爱好。初入职场的他在项目中主要承担需求分析的角色&#xff0c;2021年初受公司委派学习和评…

VR全景展示--探索无限可能

随着科技的发展&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术逐渐成为人们关注的焦点。VR技术使得人们可以在虚拟现实中体验到与现实世界不同的感官体验。在VR全景展示中&#xff0c;观众可以通过虚拟现实技术&#xff0c;沉浸式地感受到…

指针函数和函数指针

本文目录 • 前言 • 一、返回指针的函数 二、指向函数的指针回到顶部 一、返回指针的函数 指针也是C语言中的一种数据类型&#xff0c;因此一个函数的返回值肯定可以是指针类型的。 返回指针的函数的一般形式为&#xff1a;类型名 * 函数名(参数列表) 比如下面这个函数&#…

用手机号码归属地 API 开发的应用推荐

引言 手机号码归属地 API是一种提供手机号码归属地信息的接口&#xff0c;通过该接口&#xff0c;可以获取手机号码所属的省份、城市、运营商等信息。它可以帮助企业更好地了解客户&#xff0c;为个性化推荐和精准广告投放提供数据支持。作为一种数据服务&#xff0c;手机号码…

打造高可用、高效的Nginx反向代理应用 - 实战篇

前言 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;阿里云社区博客专家&#x1f609;&#x1f609; &#x1f495; 座右铭&#xff1a; 先努力成长自己&#xff0c;再帮助更多的人 &#xff0c…

快排代码原理实现

参考博客&#xff1a;快速排序算法详解&#xff08;原理、实现和时间复杂度&#xff09; 排序算法的思想非常简单&#xff0c;在待排序的数列中&#xff0c;我们首先要找一个数字作为基准数&#xff08;这只是个专用名词&#xff09;。为了方便&#xff0c;我们一般选择第 1 个…

Java每日一练(20230504)

目录 1. 位1的个数 &#x1f31f; 2. 移除元素 &#x1f31f; 3. 验证二叉搜索树 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 位1的个数 编写一个…

推荐一个免费GIF动图下载的网站

在开发过程中难免遇到耗时操作,耗时操作往往导致线程阻塞,通常这种情况可以采用开线程的方式解决,即将耗时操作放入新线程中,同时在UI线程中加一个GIF动图即可。可作为后端开发工程师来讲单独设计一个GIF图实在是意义不大(懒+不会)。 好在现在发现了这个GIF免费下载的网站…