CygwinのWEBサイトからsetup.exeをダウンロードして実行しました。インストール方法は簡単なのでここでは省きます。
TOPPERS/ASPカーネルの簡易パッケージからLM3SXXXX簡易パッケージのasp_lm3sxxxx_gcc-20110801.tar.gzをダウンロードして、c:\cygwin\home\ユーザー名\ (ユーザー名はWindowsにログインしているユーザ名)に解凍しました。c:\cygwinはCygwinのインストールフォルダです。C:\cygwin\home\ユーザ名フォルダはCygwin端末ログイン時のホームディレクトリになります。
コンフィギュレータは実行モジュールが用意されていますので、このまま使用します。
STEVAL-PCC010V2にはJTAGコネクタが用意されているので、TINY JTAG-ICE2を使用することにしました。これでプログラムの書き込みソフトウェアとしてGCC Developer Liteに付属するFlash WriterとopenOCDが使用できるようになりました。
ユーザーズマニュアルはc:\cyginw\home\ユーザー名\asp\doc\user.txtですが、EUCコードとなっているためEUC対応エディダで開きます。基本は以前のバージョンと変わっていないようです。
Cygwinのコンソール画面を起動したら、perlコマンドを実行します。が、ユーザプログラムと必要なファイルを作成しているだけなので今回はsampleフォルダを使用することにして実行しません。
次にコンパイラですが、gccはGCC Developer Liteを使用するので、Cygwinユーザのホームディレクト配下の.bashrcファイルのPATH変数に以下の通り追加しました。インストール先を変更していた場合は変更したフォルダを指定して下さい。
export PATH=${PATH}:"/cygdrive/c/Program Files/BestTech/GCC Developer Lite/GCC/ARM/bin"
依存関係ファイル(Makefile.depend)は何に使用しているか不明だったので、makeだけ実行することにします。が、当然の如くエラーが発生しました。コンパイルの前に色々と準備が必要のようです。
最初に、target/lm3sxxxx_gccフォルダをstm32f205_gccに変更します。変なフォルダ名ですが、決まり事なので従いましょう。stm32f205_gccをターゲット依存部と呼びます。doc/porting.txtの「2.システム構築環境のターゲット依存部」に詳細な記述があります。
名称変更したらのターゲット依存部の修正開始です。
まずはヘッダファイルから。
lm3sxxxx.hをstm32f205.hに名前変更し、TMAX_INTNOを15+80に変更します。
lm3sxxxx.hをインクルードしていたヘッダファイルは全てstm32f205.hに書換え、余分なインクルード文(inc/hw_ints.h等)も削除します。更にtarget_syssvc.hのTARGET_NAMEをSTM32F205に変更した後、taget_timer.hのTIMER_CLOCKを(120000)に設定します。今回は動けば良いのスタンスであるため、値の精査をしていません。TIMER_CLOCKはTOPPERSカーネル内で時間用に使用しているようなので、想定時間と違っていたらここを修正します。
修正したヘッダファイルはtarget_timer.h/target_serial.h/target_config.h/target_syssvc.hです。
次にtarget_config.cを修正します。
こちらも余計なインクルード(inc/hw_ints.h等)を削除し、target_initialize関数からコア依存の初期化以外を削除します。core_initialize関数の呼出し前にクロックの初期化を追加します。ざっくりと記載します。
レジスタ等の詳細はSTMicroelectronics社さんからダウンロード可能なリファレンスで確認して下さい。
#define RCC_CR (*(volatile uint32_t *)0x40023800)最後にtarget_fput_log関数がありますので、内容を削除して空の関数とします。
#define RCC_PLLCFGR (*(volatile uint32_t *)0x40023804)
#define RCC_CFGR (*(volatile uint32_t *)0x40023808)
#define RCC_CIR (*(volatile uint32_t *)0x4002380C)
#define FLASH_ACR (*(volatile uint32_t *)0x40023C00)
#define PLL_M 25
#define PLL_N 240
#define PLL_P 2
#define PLL_Q 5
/* 初期化部分 */
volatile uint32_t _up_cnt = 0, _hse_stat = 0;
RCC_CR |= (uint32_t)0x01;
RCC_CFGR = 0x0;
RCC_CR &= (uint32_t)0xFEF6FFFF;
RCC_PLLCFGR = 0x24003010;
RCC_CR &= (uint32_t)0xFFFBFFFF;
RCC_CIR = 0x00000000;
RCC_CR |= ((uint32_t)0x00010000); // enable HSE
while (!(RCC_CR & ((uint32_t)0x00020000)) && _up_cnt++ < (0x0500)); // HSE ready
if (RCC_CR & ((uint32_t)0x00020000)) { // not timeout
RCC_CFGR = (RCC_CFGR & ((uint32_t)0xFFFFFF0F)); // SYSCLK not divided
RCC_CFGR = (RCC_CFGR & ((uint32_t)0xFFFF1FFF) | ((uint32_t)0x00008000)); // PRPRE2 AHB clock divided by 2
RCC_CFGR = (RCC_CFGR & ((uint32_t)0xFFFFE3FF) | ((uint32_t)0x00001400)); // PRPRE1 AHB clock divided by 4
RCC_PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | ((uint32_t)0x00400000) | (PLL_Q << 24);
RCC_CR |= ((uint32_t)0x01000000); // main PLL enable
while (!(RCC_CR & ((uint32_t)0x02000000))); // PLL ready
FLASH_ACR = ((uint32_t)0x00000703);
RCC_CFGR = (RCC_CFGR & (uint32_t)((uint32_t)0xFFFFFFFC) | ((uint32_t)0x00000002)); // PLL used as the system clock
while (RCC_CFGR & ((uint32_t)0x0000000C) != ((uint32_t)0x00000008));
}
#define RCC_AHB1ENR (*(volatile uint32_t *)0x40023830)更にメインループでLEDの点灯と消灯を行います。
#define GPIOE_MODER (*(volatile uint32_t *)0x40021000)
#define GPIOE_OTYPER (*(volatile uint32_t *)0x40021004)
#define GPIOE_OSPEEDR (*(volatile uint32_t *)0x40021008)
#define GPIOE_PUPDR (*(volatile uint32_t *)0x4002100C)
#define GPIOE_BSRR (*(volatile uint32_t *)0x40021018)
/* 初期化部分 */
RCC_AHB1ENR |= ((uint32_t)0x00000010); // port E clock enable
GPIOE_MODER = ((GPIOE_MODER & 0xFFFFFF0F) | (uint32_t)0x050); // PE2/PE3 output
GPIOE_OSPEEDR = ((GPIOE_OSPEEDR & 0xFFFFFF0F) | (uint32_t)0x0F0); // PE2/PE3 100MHz
GPIOE_OTYPER = (GPIOE_OTYPER & 0xFFFFFFFB);
GPIOE_PUPDR = (GPIOE_PUPDR & 0xFFFFFFFB);
#define LED1 0x0004メイン以外の関数は変更しません。これでmakeが通るようになりました。
#define LED2 0x0008
/* メインループ */
while (1) {
GPIOE_BSRR = ((GPIOE_BSRR & 0x0000FFFF) | ((LED1 << 16)));
tslp_tsk (500);
GPIOE_BSRR = ((GPIOE_BSRR & 0xFFFF0000) | (LED1));
tslp_tsk (500);
}
TINY JTAG-ICE2経由でPCとSTEVAL-PCC010V2を接続したら、STM32F205用のopenOCDを起動します。
openOCD起動後、Flash Writerを起動します。書込むファイルはコンパイルしたasp.binを指定します。起動したFlash Writerのタイトルバー左端にあるアイコンをクリックすると、メニューが表示されるので、メニューから「FlashWriter Property」を選択します。すると、Flash Writerのウィンドウが拡大表示されます。
ウィンドウが拡大したら、CPU TYPEにopenOCDを選択し、Write Script Fileにはstm32f2xx_bin_flash.scriptを指定します。PORTは自動でopenOCDが設定されるので指定しません。
実際の書込みには[Execute]ボタンを押下して下さい。書き込み中はそれにかかる処理の状況が逐一ログウィンドウに表示されます。滞りなく成功すればFlash Writerのステータスバーに青色で Successful と表示されます。ログウィンドウは数秒放っておくと自動で閉じてしまうので、エラーメッセージを確認したい場合は気を付けてください。
書込みが完了すると自動でプログラムが実行され、LEDが1秒間隔で点滅し始めました。どうやら無事TOPPERS/ASPをSTM32F205上で実行できたようです。
その後、waitしないタスクをぶん回して割り込みを行ってみましたが、割り込みも問題(遅滞)なく動作しました。旧バージョンでは他のタスクが停止していたはずですが、バージョンアップしたTOPPERかSTM32F205の性能のせいなのか分かりませんが、当初の目的は達成できたのでTOPPERについてはここまでとします。