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を使ってみたいという奇特な方だけどうぞ…!

STM8Lはぢめました(まだはぢまってすらいない)

●STマイクロの8bitマイコンSTM8L



少し前に偽ATXMEGA128A1Uを掴まされた店から物のついでと同時に8Pinと
64PinのSTM8Lシリーズマイコンを購入しておりました。

かつてはVersaloonへの改造のため燃えないゴミと称してSTM8の部分は即廃棄
していましたが、2022年の現在はまともな開発環境とかそろってそうだったので
手を出してみた次第でございます・・・しかし…


●STM8ライタ復活への道

しかし!ねむいさんはVersaloonへの改造のためにSTM8-discoveryのSTLinkの
部分をつぶしてしまっておりました!!!
STM8に書き込みデバッグするために
SWIMプロトコルを持つSTLink系デバッガハードが必要です!
さすが私!やらかした!だめだこりゃ!

でも私はSTM32系のDiscovery持ってるじゃないか、あれのSTLinkの部分使えば
SWIMを引き出せられるんじゃないかと思い出し手持ちのDiscovery基板やNucleo
基板を引っ張り出して調べてみました。


改造できる条件として、STLinkのファームがSTM8用のSWIMプロトコルが実際に
使用できること、そして基板上にパタンが出て改造しやすいことです。
NUCLEO系や最近のDiscvoeryではSTLink/V2-1のファームが動いており、
それらはファームからも回路もオミットされているためこの時点でアウチです。


選んだのはSTM32F0Discoveryです(SWIM引き出し改造済み後の撮影ですが)
こいつはSWIM用の外部端子や構成回路こそはありませんが有り難いことに
SWIM向けに内部パタンは接続されており、最小限の配線をしてやればSWIMを
復活できるはず…!



そして根性の配線…ッ!
STM8S-DiscoveryのSWIM回路の真似して受動部品も装着です。
OpenOCDはすでにSTM8へのフラッシュ書き込みやデバッグ機能を持っているため、
ねむいさんの環境においてもたやすくできるはずです!
いざ勝負!



(注:STM32G0のプロジェクトになってますがmakefileをいじり、OpenOCDから
   STM8Lに書き込むようにしています。)

まぁ簡単にできるわけないよね。STM32F0DiscoveryのSTLink/V2のファームは
STM32のSWDに特化していてSWIMがファーム的に機能していませんorz
"STLINK V2J39S0"ってなっていますが"V2J39S0"の部分、J39がSWJのv39でS0は
SWIM機能ありませんって意味と解釈してください。

これ普通にSTLinkのアップデータでファームをあげてもJ39の部分が上がるだけ
なのでどう頑張ってもSWIMできません…


しかし…おそロシアの力を借りるとあら不思議(意味深)
STM8にも対応したデバッガーファームウエアが書き込まれてしまったでは
ありませんか!!しかもこの状態で最新ファームにもアップデート可能です!


おおっ!書き込み出来た!素晴らしい!V2J39S7となってSWIMが可能です!
もちろん従来のSTM32F0も書き込み可能!
流石モラルを真っ先に投擲機で投げ放つロシア!!おまえらのそういうとこだぞ!!
でもありがとう!!!!!


というわけで十数年前投げ捨ててしまったSTM8の書き込み機能を取り戻すため
かなりの労力を使ってしまったので肝心のSTM8ビルド環境については次回に
解説させていただきます…

20231009追:

し か し ・・・

Go to top of page