• カテゴリ TOPPERS の最新配信
  • RSS
  • RDF
  • ATOM

ブログ - TOPPERS/ASPを動かす #3・・・STM32F205をターゲットにする

TOPPERS/ASPを動かす #3・・・STM32F205をターゲットにする

カテゴリ : 
TOPPERS
2011-12-8 14:20
STM32F205上でTOPPERSを動かそうと思ったら、ターゲットにSTM32F205が見つからなかったので、新規に作成することにしました。
TOPPERS/ASPの導入については過去のブログを参考にしています。TOPPERSのバージョンは最新の1.7にしました。

使ったもの

環境の構築

1.Cygwinのインストール

CygwinのWEBサイトからsetup.exeをダウンロードして実行しました。インストール方法は簡単なのでここでは省きます。

2.TOPPER/ASPカーネルの準備

TOPPERS/ASPカーネル簡易パッケージからLM3SXXXX簡易パッケージのasp_lm3sxxxx_gcc-20110801.tar.gzをダウンロードして、c:\cygwin\home\ユーザー名\ (ユーザー名はWindowsにログインしているユーザ名)に解凍しました。c:\cygwinはCygwinのインストールフォルダです。C:\cygwin\home\ユーザ名フォルダはCygwin端末ログイン時のホームディレクトリになります。
コンフィギュレータは実行モジュールが用意されていますので、このまま使用します。

3.書き込みツールの準備

STEVAL-PCC010V2にはJTAGコネクタが用意されているので、TINY JTAG-ICE2を使用することにしました。これでプログラムの書き込みソフトウェアとしてGCC Developer Liteに付属するFlash WriterとopenOCDが使用できるようになりました。

TOPPERS/ASPのコンパイル

取りあえずSTEVAL-PCC010V2で動くことを確認したいので、プログラムはLEDの点滅程度の機能とします。

1.ユーザーズマニュアルを確認します

ユーザーズマニュアルはc:\cyginw\home\ユーザー名\asp\doc\user.txtですが、EUCコードとなっているためEUC対応エディダで開きます。基本は以前のバージョンと変わっていないようです。

2.サンプルプログラムのコンパイル

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だけ実行することにします。が、当然の如くエラーが発生しました。コンパイルの前に色々と準備が必要のようです。

3.ターゲットの作成

最初に、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)
#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));
}
最後にtarget_fput_log関数がありますので、内容を削除して空の関数とします。
次はMakefile.targetの修正です。
セグメントの開始アドレスを追加したらlm3sxxxx用の記述を削除して、stm32f205用に書き換えるだけです。大した修正ではないので詳細は省きます。
次にリンカスクリプトを作成します。今回はstm32f205.ldとしました。Makefile.targetにもそのように記述します。
リンカスクリプトについては出力セクション.textと.rodataはFLASHに配置します。出力セクション.textには.vectorセクションと.textセクションを配置します。出力セクション.rodataには.rodataセクションを配置します。
SRAMに出力セクション.dataと.bssを配置すれば完成です。MEMORY領域の設定はリファレンスで確認して下さい。
続いてsampleフォルダ内の修正です。
今回使用するSTEVAL-PCC010V2はシリアルが外部へ接続されていないので使用することができません。そのため、今回はsyslog関連を使用しないことにしました。
sample/Makefileから以下のファイルを使用しないようを修正します。システムサービスに関する定義のSYSSVC_COBJSに記述があります。
target/stm32f205_gcc/target_serial.c
syssvc/banner.c
syssvc/logtask.c
syssvc/serial.c
syssvc/syslog.c
syssvc/vasyslog.c
他の修正点はTARGETの変更、CFLAGSに-DTOPPERS_OMIT_SYSLOGの追加になります。
-DTOPPERS_OMIT_SYSLOGはカーネル側でもsyslogを使用しており、これを抑止するためのフラグです。
ターゲットファイルをall: $(OBJFILE)よりall: $(OBJNAME).binに変更したらMakefileの修正は完了です。
次にsample1.cfgの編集です。
syslogを使用しないことにしたので、syssvc配下のcfgファイルのINCLUDE文を削除します。
最後にsample1.cの修正です。
まず使用できない部分を削除します。syslog_msk_log関数を使用している最初のSVC_PERRORと、シリアルポートの初期化部分です。タスクについては今回起動しませんので励起しているact_tsk関数部分を削除します。task関数自体を削除する場合はsample1.cfgの修正を行ってください。メインループを空にしたら後は追加です。
STEVAL-PCC010V2のLEDはPE2とPE3に接続されていますので、まずはmain関数の最初に初期化を追加します。
#define RCC_AHB1ENR   (*(volatile uint32_t *)0x40023830)
#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);
更にメインループでLEDの点灯と消灯を行います。
#define LED1          0x0004
#define LED2 0x0008
/* メインループ */
while (1) {
GPIOE_BSRR = ((GPIOE_BSRR & 0x0000FFFF) | ((LED1 << 16)));
tslp_tsk (500);
GPIOE_BSRR = ((GPIOE_BSRR & 0xFFFF0000) | (LED1));
tslp_tsk (500);
}
メイン以外の関数は変更しません。これでmakeが通るようになりました。

 

マイコンボードで動かす

STEVAL-PCC010V2はJTAGコネクタが用意されているので、そのままTINY JTAG-ICE2を接続します。

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についてはここまでとします。

トラックバック

トラックバックpingアドレス http://www.besttechnology.co.jp/modules/d3blog/tb.php/107