2015年12月6日日曜日

【STM8S】 フリーコンパイラsdccをSTライブラリと組み合わせて使う件

前回、STM8SのコンパイラがRaisonanceとCosmicを行ったり来たりするので移植の手間がかったるい、と書きました.

その記事を書いているときに、sdccというgccみたいなコンパイラがあって、それならRaisonanceだのCosmicだのに煩わされることなく使えそうだと知りました.

ST社が提供しているPeripheral Libraryとsdccを組み合わせて割り込みによるLEDチカチカを動かせましたので、以下それをreportします.

【開発環境】
Kona Linux 3.0をinstallした非力なマシン(atom 64bit)で、専らCUIとmakeで開発する.GUIのsdccがあるのかどうかは知らない.windows環境についても関知しない.

STM8SのFlash焼きもLinuxで行う.ST-LINK/V2を使う.写真のプリント基板は自作物なのですが、ST-LINKでSWIMコネクタに接続しているのが要点です.ゆえにSTM8S-discoveryを使っているのと事情は同じです.
【sdccの入手など】
kona-linuxの場合はこれでsdccのインストール完了です.makeとかはせずに済みました.どこかの誰かさんありがとう.
apt-get install sdcc

次に、LinuxからSTM8Sを焼くtoolをインストールします.
apt-get install libusb-1.0     ←usblibを使いますので
apt-get install git       ←gitをインストール
git clone https://github.com/vdudouyt/stm8flash.git    ←gitからコピる
cd stm8flash    ←以下はビルドと/usr/binあたりへのコピー
make
make install

root権限でやってます.
FLASH焼きtoolはstm8flashという名前です.使い方は後で.

追記: 後の方でstm8flashを-p stm8s105 コマンドオプションで使うのですが、DLした状態だと、FLASH=16kBの設定になっているので、わたしは32KBに改変してmakeしました.さもないと巨大なプログラムを焼けなくて難儀します.STM8S-discoveryに載っているSTM8S105C6は32kBです.
stm8.cの入手直後
        .name = "stm8s105",
        .ram_start = 0x0000,
        .ram_size = 2*1024,
        .eeprom_start = 0x4000,
        .eeprom_size = 1024,
        .flash_start = 0x8000,
        .flash_size = 16*1024,
        .flash_block_size = 128,
        REGS_STM8S
同改変後
        .name = "stm8s105",
        .ram_start = 0x0000,
        .ram_size = 2*1024,
        .eeprom_start = 0x4000,
        .eeprom_size = 1024,
        .flash_start = 0x8000,
        .flash_size = 32*1024,
        .flash_block_size = 128,
        REGS_STM8S


【ST提供のPeripheral Libraryの入手】
STのサイトが更新されるとリンク切れになりますけども、現時点でここに置いてあります.
http://www.st-japan.co.jp/web/jp/catalog/tools/FM147/CL1794/SC1807/SS1754/PF258009
解凍すると、ソースファイルが入っていますのでそれを作業フォルダにコピーします.
必要なファイルは以下です.
stsw-stm8069.zip\STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template\stm8s_conf.h
stsw-stm8069.zip\STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver\inc\*.h
stsw-stm8069.zip\STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver\src\*.c
作業フォルダに全部ベタコピーしちゃいました.鬼畜ですが実験用と云う事でお許しを.この時点で、Makefileとmain.c以外はSTライブラリファイルです.
【ST提供のPeripheral Libraryの改変】
ライセンス的にどうなのとお叱りを受けるかもだが、stm8s.hというファイルを一部変更するとsdccを通せるようになる.インラインアセンブラ表記をsdcc用に変える.本日現在の入手物で8箇所あるので全て変更.
入手直後  _asm
書き換え後 __asm__
それともう一つ、stm8s.hを書き換える必要がある.
#define STM8S105         /*!< STM8S Medium density devices */
ファイルの最初方にあるこのコメントアウトを外す.これは他の品種のSTM8を使うならば別の行を活かす必要があるので適宜やってください.こちらは通常の手続きです.

追記1) stm8s.hの中にある、NEARとFARを消す必要あり.
入手直後
 #define PointerAttr NEAR
 #define PointerAttr FAR
書き換え後
 #define PointerAttr

 #define PointerAttr

追記2) stm8s_flash.cの中にある、(NEAR uint8_t*)などの”NEAR”を消す必要あり.たぶん8箇所ある.

追記3) stm8s_itc.cの中にある、_asmを__asm__に変える必要あり.たぶん2箇所ある.

【実験用のmain()】
#include "stm8s.h"

void main(void)
{
        CLK_ClockSwitchConfig ( CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE );
        GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);
        GPIO_Init(GPIOE, GPIO_PIN_1, GPIO_MODE_OUT_OD_HIZ_FAST);
        TIM1_DeInit();
        TIM1_TimeBaseInit( 1599, TIM1_COUNTERMODE_UP, 5000, 0 );
        TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
        TIM1_Cmd(ENABLE);
     enableInterrupts();
     while(1) {}
}

void TIM1_interrupt(void) __interrupt (11) // interrupt interval 0.5 Sec
{
  TIM1_ClearFlag(TIM1_FLAG_UPDATE);
        GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
        GPIO_WriteReverse(GPIOE, GPIO_PIN_1);
        return;
}

#ifdef USE_FULL_ASSERT
void assert_failed(u8* file, u32 line) { while (1) {} }
#endif

TIM1割り込みでLEDをチカチカさせるだけのプログラムです.
main()でSTライブラリを多くcallしています.
sdccの割り込み表記は、__interrupt (11) のようにします.ここはsdccのポイントですね.

【コンパイル】
sdcc -c -lstm8 -mstm8 -D__CSMC__ main.c
sdcc -c -lstm8 -mstm8 -D__CSMC__ stm8s_gpio.c
sdcc -c -lstm8 -mstm8 -D__CSMC__ stm8s_clk.c
sdcc -c -lstm8 -mstm8 -D__CSMC__ stm8s_tim1.c
sdcc -lstm8 -mstm8 -D__CSMC__ --out-fmt-ihx main.rel stm8s_gpio.rel stm8s_clk.rel stm8s_tim1.rel

これで、出来上がるmain.ihxというファイルが、Intel hex formatになっているみたいです.

ちなみにここでコンパイルオプションで、__CSMC__をdefineしているのがミソでして、これはSTライブラリにCosmicコンパイラであるという嘘を吹き込んでいます.

【FLASH焼き】
stm8flash -c stlinkv2 -p stm8s105 -w main.ihx
Determine FLASH area
Writing Intel hex file 9536 bytes at 0x8000... OK
Bytes written: 9536

一行目のがコマンドラインです.2行目以降はメッセージです.冒頭の写真のように、ST-LINK/V2でSTM8SにSWIM接続しておいてから、コマンドを与えると10秒ぐらいで焼きあがります.

makefileを作っておけばmake一発でbuild~焼きまでできます.

なんだか意外に簡単にSTライブラリを使い、sdccも使え、Flash焼きもできました.
メールで.licファイルをもらったりしなくて済むしライセンス期限やサイズ制限を気にせずに使えるので今後はsdccを使おうと思います.

かしこ


=== STMのアフィリエイト始めました ===
STM32のwelcome-kitです
        
試用レポはいずれまた...



人気ブログランキングへ

2 件のコメント:

  1.  STM8で検索しましたら、ここにヒットしました。
     私も、コンパイラのライセンスでいつも困っていましたので、非常に
    参考になりました。 ありがとうございます。
     もうご存知かもしれませんが、Makefileとして、以下の内容を
    作成して、"make"、"make clean"を実行すれば、もっと手軽にデバック
    環境ができるのではないかと思い、お礼を兼ねて投稿させて頂きました。
     ご迷惑でないことを祈ります。
     尚、「STM8S_StdPeriph_Lib」は、/root/の下にある事が前提です。
     環境に応じてSTM8HとSTM8LIBを適切に変更してくださいませ。


    =================================================================
    PROJECT = main
    ARCH = stm8
    CTYPE = __CSMC__
    STM8H = -I/root/STM8S_StdPeriph_Lib/Libraries/STM8S_StdPeriph_Driver/inc/
    STM8LIB = /root/STM8S_StdPeriph_Lib/Libraries/STM8S_StdPeriph_Driver/src/
    SDCC = sdcc
    RM = rm
    CFLAGS = -c -l$(ARCH) -m$(ARCH) -D$(CTYPE) $(STM8H)
    LFLAGS = -l$(ARCH) -m$(ARCH) -D$(CTYPE) --out-fmt-ihx
    OBJGROUP = $(PROJECT).rel stm8s_gpio.rel stm8s_clk.rel stm8s_tim1.rel

    all : LINK

    LINK : $(OBJGROUP)
    $(SDCC) $(LFLAGS) $(OBJGROUP)

    clean :
    $(RM) -f *.ihx *.rel *.map *.rst *.sym *.cdb *.lk *.asm *.lst

    %.rel : %.c
    $(SDCC) $(CFLAGS) $<
    stm8s_%.rel : $(STM8LIB)stm8s_%.c
    $(SDCC) $(CFLAGS) $<
    ==================================================================

    返信削除
    返信
    1. あ、こりゃどうもです.makeのルールについていまいちよくわかってないものでして参考になります.多謝、多謝、、、

      削除