STM32H5はぢめました

20240516追:
秋月さんよりNUCLEO-H563ZI販売開始です!!
20240516追:




STM32H56x/57xエラッタシートより
ぇえぇ…エラッタで1000回しかフラッシュ書き換えできないとか
どこのルネ〇サスのマイコンだYO…


被弾するのはrev.AとZね…ふむふむ





おいいいいいいいいいいいいいい!!!!!!!!11!!11




というわけでいきなり地雷を踏んで幸先の良いスタートを切った私のSTM32H5
ですが、現時点ではSTマイクロがリリースするCortex-M33コアを持つ最新の
マイコンとなっております。

動作周波数は250MHzにまで引き上げられ、インストラクションキャッシュや
データキャッシュ(FMCとQSPIのみ)も増強され、STM32F7に勝るとも劣らない
実力を備えながらも電力は控えめと環境にも優しいものとなっております。

過去にリリースされた同じCortex-M33のマイコン、STM32L5のパフォーマンス
強化型の進化の位置づけとなりなおかつベストセラーだったSTM32F4の後継と
なるでしょう。ちなみに低消費電力特化型はSTM32U5となりこちらも順当に
進化し続けております。




ねむいさんは7月上旬早々に144Pin版H5NUCLEOを購入しておりましたが先に
塩漬けになっていたSTM32L5の攻略に時間がかかっておりましたので10月に
入ってようやく手を付けた次第でございます…。


NUCLEO基板なのでデバッガもコミコミで搭載されております。
当たり前のようにSTM32F723がのっかっている…これはSTlinkV3相当ですね〜


USBの端子はすべてType-Cに統一されております。
STM32H5がUSB-PDに対応してるからですね〜STM32H5Cube見た限りでは
USB関連はかなりの魔境になっているので当分手出しできそうにないですが…


また、イーサネットも出ております。こちらも魔境なのでかなり先の課題と
なるでしょう…!



144Pin版NUCLEOなのでSTM32L5の時に拵えたゲタ基板ももちろん引き続き
流用可能となっております!



おっと
一点注意ですがQSPI-ROMも使いたい場合はSB70にジャンパをしてください。
PE2(OCTO-SPI IO2)がデフォルトでは電気的に接続されておりませんので
SB70をジャンパして有効にするのを忘れぬようご注意ください。
いずれ紹介するQSPI-ROM使用時の記事に再度アナウンスします。



そんなわけで今回は単に基板の紹介に終わってしまいましたが、実は
すでにねむいさんのいつもの(UART,SDMMC経由FatFs,OCTO-SPI,SPI液晶)
は実装済みとなっております。今回は各モジュール、特にSPIとDMAがL5と
全く違ったものとなっているため
一つ一つじっっくりと時間をかけて解説
させていただきます。H5の記事作成これからもがんばるぞい!


とりあえずSTM32H5のFatFs実装例を見たいんだーい!!って人はもうすでに
おきぱに配置しておりますので
予習をお願いいたします。
ねむいさんの真似をしてゲタ基板を作られた方ならすぐに再現可能と
なっておりますので是非ご利用ください!

また、私が提供するOpenOCDバイナリはSTM32H5の書き込み&デバッグを
サポート
しておりますのでNUCLEOをお持ちの方はこちらもご利用ください!!



STM8Lを使ってみる2 -いきなり終わった-


前回のあらすじ
STM32C0の登場によりSTM8Lはお役御免のNRNDとなってしまいました。
めでたしめでたし。



で終わったらマサカリ投げられそうなのでもう少し使ってるところを提示
して荼毘に付そうと思います…!


8pinのSTM8L050J3M3を使用します。


●ビルド環境を整える
STM8Lはかつては有償の使いづらいツールしかなかったのですが、
現在ではSDCCというGCCライクな無償のツールチェインがあります。

一方STM8LもStandardPeripheralLibrary(SPL)があるのですが、これは
SDCCに対応しておりません。しかしながら有志の方がSDCCに対応したSPL
を提供してくれております
。これを利用しましょう。

また、SDCC向けのmakefileも公開しておりますのでありがたく利用させて
もらいます。基本的にSTM32でやっていたビルド環境構築と同じように
拵えていきます。


ねむいさんの作例はUARTで"unk!"を送出しながらLEDをトグルします。
基本中の基本ですね。ちなみにAVRと違ってPROGMEMとかしないでもconstが
ちゃんと機能したりしますが今となってはどうでもいいですね。


なお、読み書きデバッグで使用するSWIMピンはInput/Outputを設定する
ことができますが特にOutputに設定してしまうとBrickedしてしまうので
厳重に注意してください!!!

AN5065は穴のあくほど目を通しておきましょう。ねむいさんはSetSystem()
関数内でフェールセーフを実現しています。またBricked対策のほかに
未使用ピンは入力プルアップしておきましょう。
↓実際のSetSystem関数です。

/**************************************************************************/
/*!
@brief Configures Main system clocks & power.
@param None.
@retval None.
*/
/**************************************************************************/
void Set_System(void)
{
/* STARTUP SWIM DELAY AT FIRST(MUST NEED avoid bricking) */
for(int d = 0; d < 3000; d++) {
for(int i=0;i<100; i++){nop();}
}

/* not connected pins as output low state (the best EMC immunity)
(PA1, PB0, PB1, PB2, PB4)*/
GPIOA->DDR |= GPIO_Pin_1;
GPIOB->DDR |= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4;

/* configure all STM8L050 pins as input with pull up */
GPIO_Init(GPIOC, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT); // pin 1
GPIO_Init(GPIOA, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT); // pin 2
GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); // pin 5
GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT); // pin 6
GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); // pin 7
GPIO_Init(GPIOC, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT); // pin 8

/* Set the frequency to 16 MHz */
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

/* Set delay timer */
SysTickInit();

/* Configure the LED */
LED_Configuration();
}

また、UARTの送信は送信割り込みを使用しておりますがSDCCの制約でなぜか
main関数に割り込みハンドラのプロトタイプ宣言をしないと割り込みが
機能しません


これについてはuart_support.hにプロトタイプ宣言を放り込んでincludeして
やれば解決です。


無事ビルドできました。OpenOCDはSTM8シリーズの書き込みに対応している
のでSTM32感覚で書き込みが可能です。
↓書き込みのログです。
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-dap.cfg -c "transport select swim" -f target/stm8l05x_swim_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.12.0+dev-00352-g1bc4182ce (2023-10-08-09:55)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
swim
Warn : Transport "swim" was already selected
Info : STLINK V2J43S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 2.874897
Info : clock speed 800 kHz
Info : starting gdb server for stm8l.cpu on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, pc: 0x00006000
Info : downloaded 4253 bytes in 1.148543s (3.616 KiB/s)
Info : verified 4253 bytes in 0.172508s (24.076 KiB/s)
shutdown command invoked

> Process Exit Code: 0
> Time Taken: 00:02



LEDが点滅し、一応動いてます…


●デバッグはどうするのか?
もちろんOpenOCDとGDBを組み合わせてデバッグが可能です。
必要なものは以下の3点です。
・OpenOCD
・binutils(stm8-gdb)
・CodeLite

OpenOCDはもう説明する必要もない定番でしょう〜。

binutilsは幸運にもPlatformI/OのサイトにWindows向けのビルド済み
binutilsバイナリが公開されているので
これを利用します。

CodeLiteは統合開発環境ですが今回はGDBのGUIとして利用します。

まだ整備中ですがねむいさんのARMマイコンデバッグ手順を参考に
makefileに記述されたディレクトリと各ツールのディレクトリを
一致させておいてください。
ねむいさんの作例は基本的に下記のディレクトリ構成としております。

・OpenOCD
C:/Devz/ARM/ocd

・binutils(GDB)
C:/Devz/sdcc/tool-stm8binutils/bin

・CodeLite
C:/Devz/ARM/CodeLite



まず初めにmakefileの"DEBUG_MOD = 1"の設定した状態でビルド・書き込み
を行ってください。


MAKE DEBUGでCodeLiteとOpenOCDを同時に呼び出します。


GDBの設定はsettings->debuggerのタブで設定します。


まずはGDBの実行形式ファイルとGDBの基本設定を行います。


次のタブ(Startup Commands)で"set output-radix 16"を設定しておきます。
これはレジスタを16進数で参照するために必要なものです。


最後のタブはお決まりのリセット->main関数の先頭で停止コマンドを
設定しておきましょう。これで準備完了です。


メイン画面に戻ってDebugger->Start/Continue Debuggerでデバッグ開始です。


無事main関数の最初の行で止まりました。
ちゃんとレジスタも16進数で参照できてますね。


ステップ実行も自由自在です☆


ちなみにデバッグを終わらせる際はtaskkilでOpenOCDとCodeLiteを
強制終了させて終わります。強引ですがこれが一番確実です。


と、
こんな感じでフリーなツールでSTM8Lの開発ができちゃいます…




が、

冒頭で言ったようにSTM8シリーズはSTM32L1と同じくNRND、もう新規採用は
不適となっております。
しかしながらこれも時代の流れ、後進のSTM32C0の活躍を見守りましょう〜


というわけで今回使用したねむいさんのSTM8Lプロジェクトをここ
おいておきます。今更STM8を使ってみたいという奇特な方だけどうぞ…!

Go to top of page