当前位置: 首页 > news >正文

BetaFlight统一硬件配置文件研读之timer命令

BetaFlight统一硬件配置文件研读之timer命令

  • 1. 源由
  • 2. 代码分析
  • 3. 实例分析
  • 4. 配置情况
    • 4.1 AFn配置查表
    • 4.2 timer
    • 4.3 timer show
    • 4.4 timer pin list
  • 5. 参考资料

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

1. 源由

cli命令中timer是对硬件引脚和timer资源进行绑定的一个操作,主要用于以下设备:

  • 电机
  • PPM接收机
  • LED灯带
  • 伺服器

2. 代码分析

cliTimer├──> "timer"│   └──> printTimer(DUMP_MASTER, NULL); return├──> "timer list"│   └──> "NOT IMPLEMENTED YET"├──> <USE_TIMER_MAP_PRINT> "timer map"│   └──> showTimerMap(); return├──> "timer show"│   └──> showTimers(); return├──> <!pch || !strToPin(pch, &ioTag)> error return //边界检查├──> <!IOGetByTag(ioTag)> error return //有效性检查├──> [find existing entry, or go for next available] error return //如果entry满,失败├──> <!pch> printTimerDetails(ioTag, timerIOConfig(timerIOIndex)->index, false, DUMP_MASTER, cliDumpPrintLinef); return└──> <pch> ├──> "list"│   ├──> for (unsigned index = 0; (timer = timerGetByTagAndIndex(ioTag, index + 1)); index++) │   ├──> cliPrintLinef("# AF%d: TIM%d CH%d%s", timer->alternateFunction, timerGetTIMNumber(timer->tim), CC_INDEX_FROM_CHANNEL(timer->channel) + 1,timer->output & TIMER_OUTPUT_N_CHANNEL ? "N" : "");│   └──> return├──> "none"│   └──> timerIndex = TIMER_INDEX_UNDEFINED;├──> "af"│   ├──> for (unsigned index = 0; (timer = timerGetByTagAndIndex(ioTag, index + 1)); index++)│   ├──> for (unsigned index = 0; (timer = timerGetByTagAndIndex(ioTag, index + 1)); index++)│   └──> <timer->alternateFunction == alternateFunction> timerIndex = index;├──> [assign new io timer]│   ├──> int oldTimerIndex = isExistingTimerOpt ? timerIOConfig(timerIOIndex)->index - 1 : -1;│   ├──> timerIOConfigMutable(timerIOIndex)->ioTag = timerIndex == TIMER_INDEX_UNDEFINED ? IO_TAG_NONE : ioTag;│   ├──> timerIOConfigMutable(timerIOIndex)->index = timerIndex + 1;│   └──> timerIOConfigMutable(timerIOIndex)->dmaopt = DMA_OPT_UNUSED;├──> <timerIndex == oldTimerIndex>│   └──> cliPrintLinef("# timer %c%02d: no change: %s", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), orgvalString)└──> <timerIndex != oldTimerIndex>└──> cliPrintLinef("# timer %c%02d: changed from %s to %s", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), orgvalString, optvalString);

3. 实例分析

# timer
timer A10 AF1
# pin A10: TIM1 CH3 (AF1)
timer B00 AF2
# pin B00: TIM3 CH3 (AF2)
timer B01 AF2
# pin B01: TIM3 CH4 (AF2)
timer A00 AF2
# pin A00: TIM5 CH1 (AF2)
timer A01 AF2
# pin A01: TIM5 CH2 (AF2)
timer A02 AF2
# pin A02: TIM5 CH3 (AF2)
timer A03 AF2
# pin A03: TIM5 CH4 (AF2)
timer D12 AF2
# pin D12: TIM4 CH1 (AF2)
timer D13 AF2
# pin D13: TIM4 CH2 (AF2)
timer D14 AF2
# pin D14: TIM4 CH3 (AF2)
timer D15 AF2
# pin D15: TIM4 CH4 (AF2)
timer E05 AF4
# pin E05: TIM15 CH1 (AF4)
timer E06 AF4
# pin E06: TIM15 CH2 (AF4)
timer A08 AF1
# pin A08: TIM1 CH1 (AF1)

4. 配置情况

# help timer
timer - show/set timers<> | <pin> list | <pin> [af<alternate function>|none|<option(deprecated)>] | list | show

4.1 AFn配置查表

在这里插入图片描述

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

在这里插入图片描述

4.2 timer

# timer
timer A10 AF1
# pin A10: TIM1 CH3 (AF1)
timer B00 AF2
# pin B00: TIM3 CH3 (AF2)
timer B01 AF2
# pin B01: TIM3 CH4 (AF2)
timer A00 AF2
# pin A00: TIM5 CH1 (AF2)
timer A01 AF2
# pin A01: TIM5 CH2 (AF2)
timer A02 AF2
# pin A02: TIM5 CH3 (AF2)
timer A03 AF2
# pin A03: TIM5 CH4 (AF2)
timer D12 AF2
# pin D12: TIM4 CH1 (AF2)
timer D13 AF2
# pin D13: TIM4 CH2 (AF2)
timer D14 AF2
# pin D14: TIM4 CH3 (AF2)
timer D15 AF2
# pin D15: TIM4 CH4 (AF2)
timer E05 AF4
# pin E05: TIM15 CH1 (AF4)
timer E06 AF4
# pin E06: TIM15 CH2 (AF4)
timer A08 AF1
# pin A08: TIM1 CH1 (AF1)

4.3 timer show

# timer showCurrently active Timers:
-----------------------
TIM1:CH1 : LED_STRIP
TIM2: FREE
TIM3: FREE
TIM4: FREE
TIM5: FREE
TIM6: FREE
TIM7: FREE
TIM8:CH1 : DSHOT_BITBANG 2CH2 : DSHOT_BITBANG 1
TIM12: FREE
TIM13: FREE
TIM14: FREE
TIM15: FREE
TIM16: FREE
TIM17: FREE

4.4 timer pin list

# timer A10 list
# AF1: TIM1 CH3

5. 参考资料

【1】BetaFlight开源代码框架简介
【2】BetaFlight统一硬件资源简单配置修改
【3】BetaFlight统一硬件配置文件研读

http://www.lryc.cn/news/64541.html

相关文章:

  • 码出高效:Java开发手册笔记(java对象四种引用关系及ThreadLocal)
  • 为什么要进行数据决策?数据决策对企业而言有何重要意义?
  • 2. Java 异常体系
  • 如何学好STM32,需要哪些步骤?
  • 武忠祥老师每日一题||不定积分基础训练(四)
  • 记一次产线打印json导致的redis连接超时
  • FPGA入门系列12--RAM的使用
  • 【三十天精通Vue 3】第二十六天 Vue3 与 TypeScript 最佳实践
  • ffmpeg-mov-metadate不识别Bug修复
  • (8)(8.6) 引导程序更新
  • 汽车电路图、原理框图、线束图、元器件布置图的识读技巧与要点
  • ( 数组和矩阵) 667. 优美的排列 II ——【Leetcode每日一题】
  • 【python基础语法七】python内置函数和内置模块
  • 81. read readline readlines 读取文件的三种方法
  • 【社区图书馆】【图书活动第四期】
  • webpack学习指南(上)
  • 刷题记录˃ʍ˂
  • Word2vec原理+实战学习笔记(二)
  • 什么是Java的多线程?
  • “use strict“是什么? 使用它有什么优缺点?
  • 【C++】C++11常用特性总结
  • 泛型——List 优于数组
  • JavaScript中对象的定义、引用和复制
  • JavaScript通过函数异常处理来输入圆的半径,输出圆的面积的代码
  • Ubuntu 安装 Mysql
  • 【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )
  • 分布式事务 --- Seata事务模式、高可用
  • SQL(基础)
  • 「OceanBase 4.1 体验」OceanBase 4.1社区版的部署及使用体验
  • 计算机操作系统实验:银行家算法模拟