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