Category Archives: STM32

フライトコントローラーを自作してみる。~その19~ F7マイコン購入

コロナ禍による半導体不足で長らく手に入らなかったSTM32F722マイコン、最近Aliexpressを見たらマトモな値段で売られているのを見つけ、2個注文したのが届きました。
1個1297円×2個。

自作FCの中に壊したのが1枚あって、どうもマイコンが壊れているっぽいのでこれに交換しようと思います。
でも最近、ちょっと忙しいのでもう少し先。。。


フライトコントローラー自作関連の投稿一覧

フライトコントローラーを自作してみる。
フライトコントローラーを自作してみる。~その2~
フライトコントローラーを自作してみる。~その3~
フライトコントローラーを自作してみる。~その4~
フライトコントローラーを自作してみる。~その5~
フライトコントローラーを自作してみる。~その6~
フライトコントローラーを自作してみる。~その7~ リフロー炉
フライトコントローラーを自作してみる。~その8~
フライトコントローラーを自作してみる。~その9~ 動作確認
フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。
フライトコントローラーを自作してみる。~その11~ Rev2基板
フライトコントローラーを自作してみる。~その12~ Rev2基板組み立て
フライトコントローラーを自作してみる。~その13~ Rev2基板動作確認
フライトコントローラーを自作してみる。~その14~ マイコンパワーアップ検討
フライトコントローラーを自作してみる。~その15~ 基板データ公開
フライトコントローラーを自作してみる。~その16~ JDLで飛ばす。
フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。
フライトコントローラーを自作してみる。~その18~ またまたF7
フライトコントローラーを自作してみる。~その19~ F7マイコン購入



HOI-LINKのELRS版~その2~

気づいたらまた長らくBLOGを放置していました。
HOI-LINKのELRS版のその後、割と直ぐに動作はしたのに改良しようとしたところでハマってそのままになったので、「とりあえず動作版」を公開いたします。
※このページの下の方にファームへのリンクを貼っています。

前回(いやもう4か月も前^^;)、JUMPER T8SGにBETAFPVの送信モジュールを接続して動作したところまでを書きました。その後の色々を書こうと思っていましたが時間が過ぎてしまったので以下簡単に済ませます。

まずELRS受信機が出すCRSFプロトコルをマイコンボードで読んでみました。420Kbpsで動作させたいのでArduinoUNO等ではスピードが足りず、いつかのトラ技の付録でESP32搭載のボードを使用。

そしてSTM32F411 Nuclero-64ボードでELRS版HOI-LINKとして動作を確認。
(これでドローンシミュレータVelocidroneで使えるぞー。 \^o^/ )

STM32F411のボードだと勿体ないのでSTM32F103ボードに移植。

その後、改良したい点があったのですが時間が過ぎてしまったので一旦この時点のファームをページの最下部に貼り付けました。

HOI-LINK ELRS版 を試す方法

使ったボードは秋月電子で購入したSTM32F103C8T6マイコンボードです。
ファームを解凍するとHOI-LINK-EX\Debug\HOI-LINK-EX.binというファイルが含まれているので、ボードの取説に従いFlash loader demonstratorを使って書き込みます。

書込み中の図。
左上のゴチャゴチャッとしたのはUSBシリアル変換です。

再コンパイルする場合はSTMicroelectronicsのCubeIDEを使用します(私が使ったバージョンは1.7.0でした)。上記バイナリを書込むだけなら再コンパイルは不要です。

書込み後、基板回りの接続は次の様に配線します。
・PB10(USART3TX)<–>ELRS受信機のRX
・PB11(USART3RX)<–>ELRS受信機のTX
・基板GND<–>ELRS受信機のGND
・基板5V<–>ELRS受信機の5V
※基板上に5Vという端子がないのでSW2の真ん中の端子に接続しました。
※ USBを使用するのでJ1,J2のジャンパーはハンダで短絡しておく必要があります。
※なおELRS受信機は420Kbpsで接続出来る様に予め設定しておきます。

裏面:赤い線がELRC受信機に5Vを入れる配線。

そうするとこんな感じでPCに繋がり、Velocidroneで練習できるのです。

注意:例によって正式なUSBベンダーIDがないので適当な値を書いています(VID:0xFFFF PID:0x0015) 。
よって使用する際は自己責任でお願いします。

改良したい点

ELRSの受信機はPCと接続して諸々の設定をする必要があります。その為にはHOI-LINKの回路をUSBシリアル変換としても使えると便利かなと思いますが、気軽に試し始めたらUSBとUART間のタイミングが結構難しくてハマっています。
またSBUS版HOI-LINKの時、このページで公開しただけでは世間に広まらず、NONSAYAさんが販売されて広まったという経緯がありました。しかし販売するためにはUSBのベンダーIDが必要なので、またマイクロチップテクノロジーのマイコンに移植してIDの分配を受けようかと考えています(実はPIC32MXでの動作は確認済なのです)。

ファームウェアのダウンロード:HOI-LINK-EX_20220919.zip

HOI-LINKのELRS版

先日JDL宮崎の会場で「HOI-LINKのELRS版ってできないの?」と聞かれました。

今までのHOI-LINKS-BUS信号をUSBに変換してPCに送っているので主にフタバ系のプロポシステムが対象になっています。
一方ELRSというのはこちらで開発されているラジコン電波のプロトコルで、昨年あたりからドローンレース界隈でちょっとしたブームになっているのです。

私は今までELRSを扱える機材を持っていなかったのですが、そう言われるとやってみたくなるのが人情というもの。。。

システムは大体この図の様な感じになるので、試すには最低でも送信モジュール、受信モジュールは購入する必要がありますね。あと送信機本体はどうかな?

送信、受信のどちらのモジュールもCRSFプロトコル(ハードウェア的にはUART)で接続するので、このCRSFプロトコルを知るのがキモとなりそうです。

送信機本体でよく使われているのはファームウェアがOPEN-TXのものですが、ウチにはありません。さすがにこのために送信機まで購入するのはちょっとですね。。。
で、色々調べていくとどうやらJumperのT8SGが使えそうという事が分かってきました。
というのも送信機と送信モジュールの間はCRSFプロトコルというシリアル通信で接続します。で、T8SGにもCRSFプロトコルを選択できるのです。
ならばT8SGにCRSFプロトコルを出力させてみましょう。信号をオシロスコープで見ると、420Kbpsのそれっぽい信号が出ています。

420Kbpsも速いしデータの繰返し周期が約2mSなのも速いですねー。

なんか、イケそうですね。
ならば送受信モジュールだけ購入して実験してみましょう。

という事で発注しました。・・・そして到着したのは盆休みの最終日。もう少し前に届くと着手しやすかったんですけど、仕方ないですね。

購入した送信モジュールはBETAFPV”ELRS NANO TX”。このモジュールは技適が取れているので、日本では殆どの人がこれを使っています。
そして受信モジュールもBETAFPV”ELRS Lite RX”。この受信モジュールはメチャクチャ小さいですね。

これで材料が揃ったので、まずは普通に使えるかというところから。
こちらのページを参考にしながら試していきます。

まず最初にELRSモジュールは諸々の設定をするためにPCと接続する必要があります。送信モジュールとはUSB Type-Cで接続できるので簡単です。受信モジュールはUARTで接続しますが、フライトコントローラー経由でもBetaflightがうまくやってくれる様です(なのでFC経由でやりました)。

そして今回設定したのはこの内容。まずは送信モジュール・・・

そして受信モジュール・・・

各モジュールの設定ができたので接続します。まず送信側・・・

なおT8SGとNANO-TXの間はこの様に配線しました。

そして受信モジュールをFCと接続(実際にはファームを設定したときに接続した)・・・

FCの右についているのがERLS受信モジュール。
なお上についている基板は別の実験用なので関係ないです。

受信モジュールはTX/RX両方の信号を接続する必要があります。(テレメトリを使わなければRX側は繋がなくても良さそうに思えますが、たぶんファームの書換えにも使うのやっぱり繋いでおきます)。

ところで送信機←→送信モジュールの間、および受信機←→FCの間、両方共CRSFプロトコルで接続するという事になっているのですが、送信機側の接続はシリアル信号線は1本、受信機側は2本となっています。
たぶん送信機側は半二重、受信機側は全二重なのかと思いますが、名称的には区別ないんですかね?

そして送信機の電源を入れ、FCをPCに接続してBetaflightConfiguratorの”受信機”ページで確認すると、あっさり接続できていました。

T8SGで問題なくELRSできる様ですね。

・・・でもここまでは準備段階。ここからELRS(というかCRSFプロトコル)に踏み込んでいきます。

フライトコントローラーを自作してみる。~その18~ またまたF7

久々のFC自作ネタですが、内容は前回とほぼ同じ。
壊れたFCを大量に貰ってきたので、ここからSTM32のF7マイコンを外して自作基板に載せるのです。
未だにSTM32マイコンは入手困難なので壊れたFCを頂けると非常に助かります。

ESCまで含まれていますがこっちの自作は難易度高く、今の所FCだけ。

こうしてみると見るからに壊れている基板からパッと見では何ともなさそうなモノまで色々あります。正常っぽいのはもしかして直るかもという期待もあるので今回は明らかに壊れていそうな中から2枚を選び、マイコンを外して新しいFCを2個作ろうと思います。

では取り外しから。ヒートガンで温めると・・・

隣の発振子も一緒に外れました。

もう一個も外しましょう。今度はレギュレーターらしきICも一緒に外れました。

次に新しい基板にハンダペーストを塗って部品を載せます。前回までは古くなったハンダペーストにアルコールをスプレーして無理やり使っていましたが今回は新しいハンダペーストを使う事にします。

そしてリフロー

なんかいっぱいブリッジしています。

でも裏面に進み、またリフロー。

裏面は結構うまくできました。

問題は表面のブリッジ。 基板から外した時にリードが曲がり、これを完全に直していなかったのでバラバラです。
実装前にもっと完璧に直しておくべきでしたね。
もう半田ゴテでやるしかありません。汗かきながらなんとか修正しました。

またSHコネクタが思いっきりずれているのを発見。
リフロー前に手でも当たったのな?こちらも修正。

なおこの部分、F4の頃はSBUS信号を入れる為に反転回路を通す必要があったのでXOR用ICを載せる設計にしていましたが、前回F7だと反転不要である事が判ったのでXORは載せずに直結しています。

ところで私のレベルでは実装をミスる事が結構あるので実機に載せてテストするまで安心できません。という事で実装テスト。

一番良く実装をミスるのがジャイロセンサーのMPU6000ですが、今回新品のハンダペーストが効いたのか一発で動作しました。

しかし片方の基板はバッテリーから電源を供給するとDCDCコンバータ付近からジーという音がします。このDCDCはバッテリー電圧から5Vを作り出しますが、5V波形をオシロで見てもガタガタです。
DCDC周りの配線を見まわしても原因らしきものが見当たらないし、以前「MP1584EN その3」の時にハズレICを引いているので今回もMP1584ENを外してみました。外観は異常ない様ですが、別の個体を取り付けてみると正常になったので、やっぱりハズレICを引いたんですかね(もう一度このICに戻せばハッキリするんですがやる気が起きません)。’’

前回のハズレ品は裏面パッドが無かったけど今回はちゃんとついています。

今のところ10個買った内の2個がハズレなのは確率高すぎですね。やっぱりパチもんだったのかなぁ。まだ半導体不足になる前とはいえ10個で218円だったしなぁ。

ところでこの部分、VTX用の5V電源をチップコンデンサの根本から取っています。

回路図ではこの部分で・・・

ここから5Vを取ればUSBから電源供給する時にはVTXを動作させなくできます。
もし通常の5V端子からVTX電源を取ると、レースや大勢で飛ばすとき、PCと接続してレートを変更するだけでも電波が出てしまうと色々と不都合があるのです。
次に基板を設計する際はこのためのパッドを設けておこうと思います。

そんなこんなでFC2枚完成です。

実は今年も7月23,24日のJDL宮崎戦に参加する予定なので予備基板を作っておきたかったのです。機体に積んでいるFCは去年作ったF4搭載の物なので今回作ったF7の方が高性能ですが、レースまでに飛ばす機会がないので実績のある方を積んでいきます。
去年は自作FCで参戦する事が目標な感じでしたが、今回は人並みのタイムで飛ばし、できれば(オープンクラスですけど)予選を通過したいと思います。


フライトコントローラー自作関連の投稿一覧

フライトコントローラーを自作してみる。
フライトコントローラーを自作してみる。~その2~
フライトコントローラーを自作してみる。~その3~
フライトコントローラーを自作してみる。~その4~
フライトコントローラーを自作してみる。~その5~
フライトコントローラーを自作してみる。~その6~
フライトコントローラーを自作してみる。~その7~ リフロー炉
フライトコントローラーを自作してみる。~その8~
フライトコントローラーを自作してみる。~その9~ 動作確認
フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。
フライトコントローラーを自作してみる。~その11~ Rev2基板
フライトコントローラーを自作してみる。~その12~ Rev2基板組み立て
フライトコントローラーを自作してみる。~その13~ Rev2基板動作確認
フライトコントローラーを自作してみる。~その14~ マイコンパワーアップ検討
フライトコントローラーを自作してみる。~その15~ 基板データ公開
フライトコントローラーを自作してみる。~その16~ JDLで飛ばす。
フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。
フライトコントローラーを自作してみる。~その18~ またまたF7
フライトコントローラーを自作してみる。~その19~ F7マイコン購入

DSHOT信号を作ってみる。その2

前のを壊しまったので新たに発注していたNucleoボードが届きました。
実験を再開してモーターを逆転させてみようと思います。

左が新たに届いたNucleoボード。
右は壊したやつ。

前回「値として0~47のどれかを送ると逆転するはず」という様な事を書きましたが、結局何番なん?というと、やはり資料が見当たらないのでbetaflightのソースを眺める事にします。

探し当てたのはこれ。ソースツリーを~/Gitに置いたとして次の場所にあるファイルを見ると・・・
~/Git/betaflight/src/main/drivers/dshot_command.h

・・・こういう記述がありました。

 typedef enum {
DSHOT_CMDtypedef enum {
DSHOT_CMD_MOTOR_STOP = 0,
DSHOT_CMD_BEACON1,
DSHOT_CMD_BEACON2,
DSHOT_CMD_BEACON3,
DSHOT_CMD_BEACON4,
DSHOT_CMD_BEACON5,
DSHOT_CMD_ESC_INFO, // V2 includes settings
DSHOT_CMD_SPIN_DIRECTION_1,
DSHOT_CMD_SPIN_DIRECTION_2,
DSHOT_CMD_3D_MODE_OFF,
DSHOT_CMD_3D_MODE_ON,
DSHOT_CMD_SETTINGS_REQUEST, // Currently not implemented
DSHOT_CMD_SAVE_SETTINGS,
DSHOT_CMD_SPIN_DIRECTION_NORMAL = 20,
DSHOT_CMD_SPIN_DIRECTION_REVERSED = 21,
DSHOT_CMD_LED0_ON, // BLHeli32 only
DSHOT_CMD_LED1_ON, // BLHeli32 only
DSHOT_CMD_LED2_ON, // BLHeli32 only
DSHOT_CMD_LED3_ON, // BLHeli32 only
DSHOT_CMD_LED0_OFF, // BLHeli32 only
DSHOT_CMD_LED1_OFF, // BLHeli32 only
DSHOT_CMD_LED2_OFF, // BLHeli32 only
DSHOT_CMD_LED3_OFF, // BLHeli32 only
DSHOT_CMD_AUDIO_STREAM_MODE_ON_OFF = 30, // KISS audio Stream mode on/Off
DSHOT_CMD_SILENT_MODE_ON_OFF = 31, // KISS silent Mode on/Off
DSHOT_CMD_MAX = 47
} dshotCommands_e;

enamを使ってコマンド毎の番号を定義しています。注目したのは20番と21番。
20だと正転、21だと逆転する様に見えます。更にソースを眺めると、コマンドを送る時は10回繰り返して送っており、それ以降は指定された回転方向になりそうな雰囲気です。10回送るのは少しくらい伝送エラーが出ても確実に伝える様にだと思います。

そこでNucleoボードのGPIOにボタンを2個追加し、これらを押すと回転数信号の代わりに20と21の値を出す様にプログラムを変更しました。

そしてESCとモーターを接続し、逆転ボタンを押した後に回転させると・・・何も起らず同じ方向に回っています。
何か違うのかなー。

上記リストを見ているとDSHOT_CMD_BEACON1というコマンドもあります。これはたぶんモーターを機体発見ブザー代りに鳴らす時のアレみたいですね。
betaflightからはブザーの音色を5種類から選べるのに対し、上記コマンドもBEACON1~5まであるので間違いないでしょう。値として1番~5番を送ってやればモーターから音が鳴りそうです。
そこでさっき取り付けた2個のボタンを押せば1や2を送る様にプログラムを変更しました。
そして試すと・・・やっぱり鳴りません。

うーん。
betaflightのソースをもっと細かく見ていけば解るんでしょうけど結構大変ですよね。

そこでFCから出てくる信号をオシロスコープで見ながら機体発見ブザーを鳴らしてみます。反転信号だと一瞬なので波形を捕まえ難いですがブザーだと繰り返し発生するので捕まえやすいのです。そして以下の事が判りました。

まず今までDSHOTで送る16bitのデータはこう思っていました。
値とCRCの間の1bit(右のLSB側から5番目なので以後「5bit目」と呼びます)は通常は0でテレメトリを要求するとき(RPMフィルタで回転数を取り出す場合等)に1にする。・・・と色々なサイトに書いてあります・・・

Hパルス幅が長いと1、短いと0を表します。

しかし実際にFCが出しているブザーコマンドを見ると1になっていました・・・

どうやら制御コマンドを送る時は5bit目を1にする様です。
ならばNucleoボードでもこの通りの波形を作ってみると・・・
鳴りますねぇ。
そして予想通りBEACON1 と2で音程が変わります。
また普段機体発見ブザーを鳴らすとピッ、ピッと断続的に鳴るのは FCから断続的にコマンドをON/OFFしている訳では なく、ボタンを押し続ければESC側で断続させてくれる様ですね。
試した様子を動画で・・・

https://youtu.be/hmSqN_zpciA

では同様に逆転コマンドの20番、21番も5bit目=1でやってみます。
これもちゃんと逆転しますねー。
逆転に設定しておき電源を入れ直すと正転に戻ります(もしかするとどっかに覚えてるんじゃないかと思ったけど、そんな事ないですね)。
これも動画で・・・

https://youtu.be/Y9Ko3SlgvzI

という事でコマンドを送る時は右から5bit目を1にするのが正しい様です。という事はテレメトリの場合はどうなんでしょう?一つ判っているのはFCでRPMフィルターをONにするとDSHOT信号のH/Lが逆転している様です。
って事はテレメトリは5bit目ではなくH/Lの極性で決まるのかな・・・
あと回転数の値は48~2047だと思っていますが、コマンドである事が5it目で決まるのなら回転値は47以下を使っても良さそうな気がします。

BetaflightでRPMフィルターONの波形

このあたりはもうちょっと調べる必要がありそうですね。

Nucleoボードを壊した

やってしまいました。
先日STM32 Nucleo-F411REボードでDSHOT信号を作って、もう少し調べようと試していたら突然PCとの接続ができなくなったのです。

Nucleo-F411REボード

よく見るとICクリップが壊れてバネが見えており、これがボードのST-LINK部分に接触していたみたいです。

根本で折れてバネが見えている。

ST-LINKのファームを更新(なぜかこの時更新はできた)したりPC側のドライバを入れ直してもダメです。

このボード、既に3.3Vのレギュレータが壊れており外付けで動かしていました。
自作フライトコントローラーの実験で屋根くらいの高さから落とした事もあります。
もうそろそろ諦めて新しいのを発注しました。秋月電子で1850円の出費です。

DSHOT信号を作ってみる。

先日自作フライトコントローラーでRPMフィルターをいじった時DSHOT関係でハマって以来、気になっていました。
何でも理解を深める為には作ってみるのが一番、という事でSTM32マイコンボードでDSHOT信号を作ってモーターを回してみます。

DSHOT とはフライトコントローラーからESCに伝える信号のプロトコルで、 これによりモーターの回転量をESCに伝えます。
同種のプロトコルには色々(PWM,ONESHOT,MULTISHOT等)ありますが、恐らく現在のドローンレースで一番使われているのがDSHOTなのです。

DSHOT の概要については以前NONSAYAさんが紹介されています。
これを読んで大体のところは理解できましたが、実際に信号を作るためにはもう少し詳細な情報が必要です。で、色々探したけれど全体を通した仕様というか、本家のサイトの仕様書みたいなのが見つからないのです。

それでもこの辺りのサイトが参考になりました・・・

DSHOT概略

詳しい内容は上記サイトを読んで頂くとして、ここではサラッと概略を書きます。
まずDSHOT波形の例・・・

  • まず16発のHパルスを1セットとし、少しの時間を置いてこれを繰り返します。PWMっぽくも見えますが一発ずつパルス幅が長かったり短かったりします。
  • Hパルスの幅が短い場合が0、長い場合は1を示し、これにより16ビットのデータを表します。
  • 左から11bit分がスロットル量を表します(左がMSB)。この11bitの値は48から2047迄なので2000個の値を表せます。なお0~47は特別な意味を持ち、例えば0だとディスアームです(それ以外の値は資料が見当たりませんが、モーター逆転等が含まれる様です)。
  • 12bit目は基本は0ですが、ここを1にするとテレメトリ要求の意味となり、16発のパルスを送り終えた後に今度はESC側から信号を送ってきます。RPMフィルターではこの機能を使って回転数を読み出している様ですが今回の実験ではそこまでの域には達しておらず、一方的に回転数を伝えるのみです。
  • 13bit目から16bit目の4bitはこれまでの12bitデータに対するCRC値で、次の式で算出しています。CRC=(DATA ^ (DATA >> 4) ^ (DATA >> 8)) & 0xf
  • これまで一言でDSHOTと言ってきましたが実際にはDSHOT150、
    DSHOT300、 DSHOT600、 DSHOT1200等、速度に応じた名前がついています。150とか300とかの数字は1bitを表すパルス幅が150Kbpsとか300Kbpsという意味みたいです。なのでDSHOT300での1bit分のパルス間隔は1/300Kbps=3.33μSとなります。
  • DSHOT300の場合、パルス間隔は上記の通り3.33μSで、L(を表す短いパルス幅)は1.25μS、H(を表す長いパルス幅)は2.5μSです。

マイコンボードSTM32 Nucleo-F411RE

マイコンボードにはNucleo-F411REを使用します。このボード、フライトコントローラの実験で使ったときに3.3Vのレギュレータを壊してしまい、それ以来外付けレギュレータで無理やり動かしています。

ピロッと付いているのが3.3Vレギュレータ。

開発環境

開発環境にはSTマイクロエレクトロニクス社純正のCubeIDEを使用します。
これにはCubeMXというコード生成ツールが付属していて、周辺機能の初期化をGUIで設定できるので便利です(でもドキュメントが分かりにくい気がする)。

構想

DSHOTの信号をどうやって作りだしましょう?DSHOT150でも6.66μS毎に異なる幅のパルスを生成する必要があります。手持ちのESCがなぜかDSHOT150では動作しないのでDSHOT300を使うとなると3.33μS周期という結構な速さで更新が必要です。
タイマーをPWMモードで使うのがやり易そうですが、1パルス毎に幅を変える必要があるのでDMAを使って都度書き換えてみます。
これにはあらかじめRAM上のバッファにパルス数分のデータを格納しておき、1パルス毎にDMAコントローラーが (パルス幅を決める) CCRレジスタに転送していくのです。図にするとざっとこんな感じ。

作る・・・

実際にはRAM上のバッファはデータの16個分に加えて空白期間34個分の合計50個分を用意し、後半の34個分は常に値を0にしています。
以上の動作は一旦タイマやDMAコントローラーを設定すればCPUとは係りなく動き続けます。
なおRAM上のバッファはDMAが呼び出す割り込み処理ルーチン内で書き換える事にします。DMAの割込みはバッファの内容を半分出力した時点で呼ぶ事もできるので、これを用いて空白期間の間にデータを書き換えています。

そしてメインプログラム側ではDSHOTに出力する値を決めます。
今回はスイッチと可変抵抗を1個ずつ使い、スイッチはアーミング、可変抵抗は回転数を決める事にします。なのでGPIO一つとA/D入力一つが必要ですが、これもCubeMXの機能で簡単に設定できます(設定後の使い方がドキュメント見てもわかりずらいのですが)。

メインルーチンは初期化後無限ループに入ります。このループ内で可変抵抗の値を取るためAD変換を実施し、ESCに送る16bitのデータを作ります。
これをRAM上の仮バッファに置くところまでがメインルーチンの処理です。
そして仮バッファの値をDMAバッファに転送するのがDMA転送が半分終了した時点で呼び出す割り込みコールバックルーチンで行います。わざわざバッファを2段階にしているのはDMA転送中にバッファを書き換えてしまう事を防ぐためです。

詳細はソースを参照ください。
これ→DSHOT_MX.zip
プロジェクトディレクトリ丸ごとなので他のプロジェクトと同列の場所に置いて下図のメニューで開けると思います(試した限り大丈夫でしたがIDEのバージョンが違うとエラーとか出るかもしれません)。

動かしてみる

ESCに繋いでモーターを回してみたところを動画で・・・

https://youtu.be/N3eUpX3jJkg

そして・・・

あとモーターを反転させるのを試したいのですが、このあたりの情報が見つかりません。Betaflightのソースを解読すべきなのでしょうか?