はじめに

これは前編の「STM8A Discovery kit (STM8AL EVALUATION BOARD)を動かしてみる」の続編で、STA8AFも動かすように試みます。

とりあえず、ビルドしてみる

STM8AFのプロジェクトをアクティブにして、ビルドしてみます。

#error clnk Debug\stm8af_discover.lkf:1 @svlreg missing for function f_CAN_RX_IRQHandler

というリンクエラーが表示されました。「 f_CAN_RX_IRQHandler 」という割り込みイベントのハンドラが割り込みテーブルに登録されているけど、関数が見当たらないエラーだと思われます。

grep で関数を探してみます。すると、Projects\STM8AF_Discover\src\stm8s_it.c(217): INTERRUPT_HANDLER(CAN_RX_IRQHandler, 8) と表示されました。関数は存在するようです。
f_CAN_RX_IRQHandler のf_ はコンパイラーが割り込みハンドラに自動的に付けていると思われます。

stm8s_it.c(217): を見ると、#if defined (STM8S208) || defined (STM8AF52Ax) で囲まれた範囲に関数が存在していました。AFボードはSTM8AF5288Tが搭載されているとユーザーマニュアルに記載してあります。もう一度、プロジェクトのセッティングからMCUの設定を確認してみます。

STM8AF5288 が設定されています。実機と合っています。サーどうしたものでしょうか。

対策としては「STM8AF52Ax」を宣言してあげれば良いと考えますが、この時点でソースをいじりたくありません。そこで、コンパイラーのオプションで定義出来ないか調べてみます。

あれ!?プリプロセッサにちゃんと「STM8AF52Ax」が記載されています。どういう事でしょうか。オプジェクトファイルや、アセンブリリストファイルを調査する限り、しっかりハンドラはコンパイルされていて、リンクの際にエラーが発生しています。

原因と対策方法

「@svlreg missing for function」 に問題解決の糸口があるようです。このエラーについて検索してみると…。ありました、ありました。STマイクロにテクニカルノートがありまし た。「How to adapt projects built with previous versions of COSMIC to version 4.4.5 and later 」に問題解決方法が記載されていました。

When using COSMIC version 4.4.5 or later, users can be confronted to applications that do not compile anymore while they compiled correctly with an older version of the COSMIC compiler. Some of the new compilation errors can result from the user’s own interrupt code as shown in Figure 2.

ってな記載がありました。その後の対処法も以下に転載しておきます。

つまり、割り込みルーチンの頭には、@svlregキーワードを付けて、安全性を担保せよ!って事の様です。ロングレジスタが使われるように強制的な記述をするようになった様です。いろいろと問題があったのでしょう。

割り込みハンドラの修正

対象の割り込みハンドラを修正します。対象となるソースファイルは「stm8s_it.c」です。書込禁止になっていると思いますのであらかじめ書込禁止を解除してからソースを修正します。以下の図を参考にして下さい。画像をクリックすると拡大画面が表示されます。

@svlregキーワードの記載例

これで無事にコンパイルが通せました。このサンプルプログラム作成時よりCosmicのコンパイラーのバージョンが新しくなった事で、発生したエラーと言えます。とはいえ、この割り込みハンドラだけエラーの警告が出されるのはなぜだかわかりませんが、他のハンドラは安全だとコンパイラーが判断したようです。

ST-Linkでデバッガの接続をしてみる

前編の「STM8A Discovery kit (STM8AL EVALUATION BOARD)を動かしてみる」 の要領で、PCにUSB接続をしてST-Linkによるデバッガ接続が可能か試してみます。すると以下のエラーが表示されました。

初期化する際に応答が返ってこないような表現ですね。

「Connedtion error (usb://usb) swim error [30006]: Comm init error: chip does not answer」について検索してみると、STのフォーラムにそれらしい情報がありました。

STM8S208C8 SWIM error [30006]: Comm init error: chip does not answer

電圧が怪しかろうと判断し、内部電圧をテスターで当たってみます。すると+5Vが出ていませんでした。+3Vは出ているので、USB5Vはちゃんと基板に来ていて、USB5Vから+5Vを変換している回路の周辺が怪しいです。

ユーザーマニュアルのSTM8AFの回路図を見てみましょう。

STM8ALの回路も同様の構成になっていますので、一応+5Vの電圧をテスターは測ってみると、ちゃんと5Vが出ていました。

結果的に12V系が原因だとわかりました。ジャンパーピンJP2をFlash側にする事で接続が可能になりました。STM8AFとALの12V系の回路図を見比べてみます。

STM8AFの12V系の回路図

STM8ALの12V系の 回路図

STM8ALのL99PM62GXPのCANのTxDCは12Vが接続されていますね。ここを12Vで吊ってあげないと動かないようです。