STM8Sに不揮発性データを保存するには?
--------自分でFLASHを焼きかえるプログラム--------



FLASHを書き換える方法について解説します.そんなのすでに判ってるって? そうですよね.USB経由のSWIMでプログラムを焼くのはマウスをポチッと押せば済むし、あるいは、RS232経由でプログラムを焼く のもできるようになっていますから.

しか〜し、マイコンで何かを制御したいときには、ただ単にプログラムを焼けばよいとは限りません.なんでかというと、プログラムを焼いただけでは、全てのプリント基板が画一な性能しか出せないからです.でも、それじゃ困る場面にかならず直面します.

たとえば、温度センサにはバラツキがありますから、個々の温度センサを補正する値を、一枚一枚のプリント基板に固有な値として書き込んでやらなくちゃいけません.あるいは、サーボモータの回転角度のゼロ点を決めるために、固有な値を書き込んでやらなくちゃいけない場面も想像できます.

したがって、マイコンのプログラミングとは、
   1) アプリソフトのような画一なFLASH書き換え 
   2) 補正値のような基板固有なFLASH書き換え
この両方をできてはじめて、マイコンシステムとしての真価を発揮できるわけです.

以下では、補正値のようなプリント基板固有なFLASH書き換えをどうやるか? を解説します.





プログラムをSTM8Sに焼くときは、STM8SはホストPCのスレーブとして「受動的に焼かれる」わけです.これを In-Circuit Programming (ICP)と呼びます.

一方で、プリント基板固有のデータをFLASHに焼きたいときは、STM8Sが実行状態のままで、STM8S自身が「主体的に自分を焼く」のです。それを、In-Application Programming (IAP)と呼びます.

以下は IAP の解説になります.





IAPは、メモリのどこを書き換えるのでしょうか?

アドレス 4000〜43FF の、データを格納するEEPROMメモリ領域
アドレス 4800〜487F の、オプションバイト領域
アドレス 8000〜FFFF の、プログラムを格納するFLASHメモリ領域

以上です.

この他に、下記の重要なメモリ領域がありますが、これらを書き換えるのはIAPの役割ではありません.

0000〜07FF  のRAM領域
6000〜67FF  のbootプログラムを格納するROM領域

ところで、IAPが、プログラム格納領域である8000〜FFFFを書き換えるということは、自分で自分を人格改造するようなものですので、迂闊に書き換えるとCPUが暴走して大変なことになります.そこで、IAPプログラムを0000〜07FFのRAM領域に格納してIAPプログラムを走らせる必要がありまして、少々手間がかかります.
そもそも、IAPによるFLASHメモリ領域(8000〜)の書き換えはホビー用途ではあまり出くわさない場面だと思われますので、割愛させていただきます.

ここでは、IAPによるEEPROMメモリ領域(4000〜)の書き換えだけを解説します.

さらに、IAPには、高速書き換えが可能な128BYTE block書き換えと、遅いけどお手軽な1BYTE/4BYTE書き換えの3つありまして、ここでは、1BYTE書き換えだけに解説を絞らせていただきます.





EEPROMメモリ領域(4000〜)の書き換え手順はこうです.

●オプションバイトの BOOTLOADER ENABLE を、enable にします.理由は不明ですが、これを怠ると、正常に書き換えできないことがありました.このことは、STMicro社のdocumentには書かれてないと思うんですが、FLASH書き換え関数が、bootloader codeの一部を利用しているから、BOOTLOADER ENABLEが関係するんじゃないかと推測します. BOOTLOADER ENABLEにするやりかたは、こちらを参照 してください.

●mainルーチンはこんなです.この例では、4000〜40FFまでインクリメンタルデータを書き込んでいます.
void main(void){
    int i,d;
    FLASH_Unlock(FLASH_MEMTYPE_DATA);
    d=0;<br>   for(i=0x4000;i<=0x40FF;i++){
        FLASH_EraseByte(i);
        FLASH_ProgramByte(i,d++);
    }
    FLASH_Lock (FLASH_MEMTYPE_DATA);
    while(1) {}
}





STMicro社提供のファームウエアライブラリは、つぎのFLASH書き換え関数を提供しています.(他にもあるが、めぼしいものだけ)

●FLASH_Unlock(FLASH_MEMTYPE_DATA);    書き換え許可    引数はEEPROM領域を示します
●FLASH_Lock (FLASH_MEMTYPE_DATA);     書き換え禁止

●FLASH_EraseByte (u32 Address)                      特定アドレスの消去
●FLASH_ProgramByte (u32 Address, u8 Data)      アドレスにデータを1BYTEを書き込む
●FLASH_ProgramWord (u32 Address, u32 Data)    アドレスにデータを4BYTE書き込む

●u8  FLASH_ReadByte (u32 Address)                  アドレスのデータを1BYTE読む





EEPROM領域焼き換えプログラムの例としてSTVD project フォルダを、こちら に起きます.

上でも書きましたが、BOOTLODER ENABLE にしてください.


main.c

とくに説明は不要だと思います.

#include "stm8s.h"
void main(void)
{
  int i,d;
  FLASH_Unlock(FLASH_MEMTYPE_DATA);
  d=0x00;<br> for(i=0x4000;i<=0x40FF;i++){
     FLASH_EraseByte(i);
     FLASH_ProgramByte(i,d++);
  }
  FLASH_Lock (FLASH_MEMTYPE_DATA); 
  while (1) { }
}


stm8s.h

#define STM8S105       CPUの型名のコメントを解除します



stm8s_conf.h

#define _FLASH (1)     FLASH関数のライブラリを使うために、このコメントを解除します



stm8_interrupt_vector.c

新規project作成時に、自動生成されたままで、変更しません.



stm8s_flash.c stm8s_flash.h

ファームウエアライブラリから、コピーしておきます.変更はしません.






プログラム実行前後のEEPROM領域の値を、ST Visual Programmer で確認した結果を載せます.


↓プログラム実行前、BootLoader Enabled にしてあります.




↓プログラムの実行前、EEPROM領域はオールゼロになっています.


↓プログラム実行後、EEPROM領域の 4000-40FF にインクリメントデータが書かれました.このインクリメントデータは、main() が自分でEEPROM領域を書き換えた結果です.これで、温度センサの補正値を不揮発的に記憶させることができるようになりました.






release 2010.9

inserted by FC2 system