マイコン工作実験日記

Microcontroller を用いての工作、実験記録

新基板を作成

2024-05-15 12:50:34 | DoomPlayer

しばらくぶりの更新ですが、この1ヶ月の間にNucleo-U575ZI用の基板を作り直していました。

当初は使用する部品数を最低限に抑えて、簡単に作ることをひとつの目標としていたので、音の再生にはSTM32U5のDACを用いていました。その目的は達成することができて、音楽の再生もDOOMのゲームの実行もできるところまではできたのですが、実際に音を聞いてみるとやはり12bitのDACでは高域がカットされてしまうので、音の厚みが欠けており満足のできるものではありませんでした。

そんなわけで、部品数は増えてしまうけれども、やはりCODECを載せることに方針転換。基板を作り直しました。CODEC制御のためにSAIとI2Cを使う必要が生じたので、それに伴いSTM32U5側のピン割り当ても一部変更せねばならなくなりました。ひと通り動くようになったら、回路図とソースコードを開示するつもりです。


タスク構成 -- その2

2024-04-14 15:23:02 | DoomPlayer

前回の記事でタスク構成について書きましたが、その際にはCMSIS_OS2のAPIを使ってタスク情報を取得していました。DoomPlayerでは自分で書いたアプリ部分ではCMSIS_OS2のAPIを使っているので、自分が作成したタスク情報はこれで全て取得できているのですが、使用しているライブラリ部分でタスクが生成されていると、その情報は取得できていませんでした。

そこで、改めてFreeRTOSレベルのAPIを使ってタスク情報を取得するように変更しました。具体的にはuxTaskGetSystemState()を使用しています。また、タスク名に続いてそのタスクの優先度も表示することにしました。スタックサイズについては、ワード単位で表示されています。

この変更によりFreeRTOS内部で作成されているIDLEタスクとタイマー処理用の Tmr Svcタスクが表示されるようになりました。lv_conf.h において ''#define LV_USE_OS LV_OS_FREERTOS'' を指定するとlvglDrawという描画処理用のタスクも生成されるのですが、不必要に大きなスタックが消費される上に、タスクの優先度が高く設定されてしまい、他のタスクとの連携の観点で問題が生じするため、LV_OS_NONEを指定して使っています。この問題は、現在のlvglのgithub masterでは修正が加わっているようなので、次のリリースに期待したいところです。


CR1220とタスク構成

2024-03-20 12:16:46 | DoomPlayer

画面キャプチャ機能でSDカードに画像を保存できるようになったので、そのタイムスタンプとファイル名生成のためにRTCバックアップ用の電池としてCR1220を追加実装しました。Nucleo-U575ZIでは、ディフォルトでMCUのVBAT端子はVDDにジャンパされているのでSB50の0Ωを取り外してから、電池を装着してやります。これで、ようやくと計画していた全ての部品を実装したことになります。

RTCのカレンダー機能を使うので、日付と時刻の設定機能も必要となります。LVGLを使ってGUIとして実現するのがベストなのでしょうが、使用頻度が低い機能にわざわざGUIを用意するのも面倒です。そこでNT-Shellを導入してCLIのコマンドでdate, timeコマンドを用意しました。

せっかくNT-shellを入れたので、タスク状態を表示するpsコマンドとQSPIフラッシュ上に書き込まれているファイル情報を表示するflashコマンドも用意しました。

psコマンドで表示されている数字は、残りスタックサイズを示しています。各タスクの大まかな役割は次のとおりです。

 

タスク名 役割
defaultTask 起動時のSD, QSPI faslhの確認、スクリーンキャプチャ、タッチパネル処理を担当
guitask LVGLと画面更新処理
btstacktask BTstackとHIDホスト処理
shelltask NT-shellとコマンド処理
flacreader FLAC音楽データの読み出しと展開処理
mixplayer 音楽と効果音の合成とFFT処理

上記のコマンド実行例は、起動直後の状態を示しています。この後、Bluetoothでコントローラを接続して音楽を再生したりしているとスタックが消費され、DOOMのゲームを開始すると新たにdoomTaskが開始されます。


STM32H7R/S

2024-03-12 22:45:48 | Weblog

来週の発表になるのかもしれませんが、STM32H7R/Sシリーズが新たに出るようです。正式発表の前ですがYouTubeにDiscovery kitが紹介されています。

STのサイトで検索してみるとこんな資料が見つかりました。内蔵メモリを抑えて価格を抑えているようです。


画面キャプチャ

2024-03-06 20:13:47 | DoomPlayer

作業中のNucleo0U575ZI版のDoomPlayerにもようやくと画面のキャプチャ機能を用意しました。青いUSERスイッチを押すことで、SDカード上に画面キャプチャを保存します。今回は、16ビットのパラレル接続LCDを使っていますので、画面情報はLCDのコントローラであるILI9488が持つGRAMから読み出すことにしました。

書き込みの際にはMomory Writeコマンドを使ってRGB565形式の画素データを16ビットで書き込むことができますが、Memory Readコマンドを使っての読み出しの際には常にRGB888形式になるんですね。知らなかった。そのため、画面データ量は480x320x3 = 460,800バイトとなります。STM32H7B3を使っていた時は、JPEGエンコーダを使って圧縮した画像データをSDカードに保存していましたが、STM32U575ZIにはJPEGエンコーダは備わっていません。LibJPEGを使ってソフトで圧縮しようかとも思いましたが、作業領域のSRAMも必要になるので、今回はRGB888形式のままで保存することにしました。ちょっと手間ではありますが、PC側でImageMagickのconvertをつかてJPEG/PNGに変換しています。

画面データの読み出しは、LVGLの画面更新やDOOMの画面更新作業と競合しないように配慮しています。また、SDカードへの書き込み動作は、音楽再生のための読み出し動作とSDカードアクセスが競合するので、一時的に音楽再生を止めてから読み出しを行うことにしています。

DualShock4やDualSense, 8bitdo Zero2をつなげた時には、480x320に拡大して画面表示をしますが、コントローラが接続されていない場合には、320x200で表示することにしてみました。

LVGLを使って作成した画面上のボタンを押すことで操作可能になってはいますが、画面タッチでの操作はかなりキツイ。画面表示も小さくてみづらいし、実用的ではありませんでした。