NXP LPC1114 のUART機能検証を続けています。まず、これまでに現れた不具合は、
・LPC1114のUSRT設定
LPC1114側のボーレート115200で PC側ターミナルソフトで文字化けが起こる。
LPC1114側のボーレート9600で、PC側(115200)で正常な通信を確認。
・Systick設定
Systick割り込みインターバルが想定の1/2
ということで、システムクロックの設定について何か問題でもあるのかとも思いました。
もともとNXP他が提供するサンプルソースはSystem Osillator(外付けクリスタル)をクロックソースにしていて、これをIRC Oscillator にして機能検証を行っていました。
そこで、クロックソースをSystem Oscillatorに戻して、これまでの検証を繰り返しました。(手持ちの水晶発振子が8MHzだったのでそれを使用)
LPC1114各レジスタ設定値
<LPC1114 UART設定:ボーレート9600 Systick設定:480000>
システムPLL制御レジスタ(SYSPLLCTRL) 0x25 MSEL:5 (M=6) PSEL:4(P=4)
システムPLLステータスレジスタ(SYSPLLSTAT) 0x01 PLL はロック状態
システムオシレータ制御レジスタ(SYSOSCCTRL) 0x00 オシレータはバイパスされません。/周波数範囲1 ~ 20 MHz
システムPLLクロックソース選択レジスタ(SYSPLLCLKSEL) 0x01 システムオシレータを選択
メインクロックソース選択レジスタ(MAINCLKSEL) 0x03 システムPLL クロック出力を選択
システムAHBクロック分周器レジスタ(SYSAHBCLKDIV) 0x01 1 で分周
システムAHBクロック制御レジスタ(SYSAHBCLKCTRL) 0x1105F
これらの設定でメインクロック48MHz稼働を確認しました。
UARTクロック分周器(UARTCLKDIV) 0x01
UARTライン制御レジスタ(U0LCR) 0x03 8 ビットの文字長/1 ストップビット/パリティなし/DLAB=0
UART分数分周器レジスタ(U0FDR) 0x10 DIVADDVAL=0/MULVAL=1
UARTボーレート分周器レジスタ(U0DLL) 0x00
UARTボーレート分周器レジスタ(U0DLM) 0x05 DL=0x0500
これらのUART設定では、ボーレートは2343となりそう。
BaudRate = 48M/(16*0x0500) = 2343
システムtick カウンタ校正レジスタ(SYSTCKCAL) 0x04 システムtick タイマ校正値0x04
システムタイマリロード値レジスタ(SYST_RVR) 0x752FF RELOAD
システムタイマ校正値レジスタ(SYST_CALIB) 0x04 TENMS=0x04 default値
これらのSystick設定では、Systick割り込み間隔は 20mSになりそう。
Systick割り込み間隔 = 0x752FF/(48M*1/2 ) = 0.02 Sec.
計測内容
・UARTのTX信号を測定すると、ビット巾は約0.1mSであった。
、 実際のUARTのボーレートは、9600であった事が確かめられた。
PC側のボーレート設定9600のターミナルソフトでUART通信を確認。
(PC側ボーレート115200でもUART通信が成立してしまうことを確認、前回、LPC1114側でボーレートを9600に設定すると115200のボーレートになると考えたことは、誤り。)
・Systick割り込みでGPIOのHigh/Lowを出力すると、High、Lowそれぞれの巾は10mSであった。
その他、
UARTでボーレートを115200にした場合やはり、PC側で文字化けを起こした。(前回と同じ)
ボーレートは115200付近であろうと思われ、 UART分数分周器レジスタ(U0FDR)でボーレートの微調整を試しましたが、不調に終わりました。
LPC111xのデータシートでは システムオシレータの範囲は1~25MHzでした、しかしユーザーマニュアルでは一部10MHz~25MHzの表記があります。ドキュメント内、ドキュメント間で整合性がとれていないのではと思います。
まとめ、
サンプルコードを利用したUART設定でボーレートは正しく設定された。ただし、ユーザーマニュアルのレジストリ設定と実際のレジストリ設定で食い違いがあるように思える。
また、Systick設定では、ユーザーマニュアルの「システムtick タイマクロックはシステムクロック1/2」という事は実際と異なると思われる。
現時点でのLPC1114のアプリケーション開発はユーザーマニュアルより、NXP等から提供されるサンプルコードを優先して参考にしたほうがよさそうです。
2013年2月6日水曜日
2013年2月4日月曜日
TI LaunchPad 電子温度計 その後
以前作成した、TI Stellaris LaunchPad 電子温度計の動作確認を行いました。
電子温度計に40℃の温度設定をすると、ヒータのスイッチが入り、徐々に水槽の水温が上昇しました。あとは、設定温度+αでスイッチが切れるのドキドキしながら待ちました。さて水温が40℃に到達、しばらくしてヒーターのスイッチが切れました。まず第一段階クリア。
測定間隔5秒(目盛5分)、温度表示域30~46℃(目盛2℃)
温度設定:40℃、動作:ヒーター、温度調整巾1℃(40.5℃でヒータースイッチOFF、39.5℃以下でヒータースイッチON)
水温は12~13分で上昇、下降を繰り返しました。水温は39.2℃~40.8℃の範囲で変化
●温度調整巾 0.4に変更
(40.2でヒータスイッチOFF、39.8℃以下でスイッチON)
水温は7分で上昇、下降を繰り返しました。水温は39.5℃~40.5℃の範囲で変化。
今回テストした電子温度計は、まあ、観賞魚用の温度コントローラ並みの機能、しかしヒーターのスイッチにリレーを使用、その動作保障は10万回、つまり、7分サイクルの温度調節で8カ月でこの電子温度計の寿命を迎えることになります。
電子温度計に40℃の温度設定をすると、ヒータのスイッチが入り、徐々に水槽の水温が上昇しました。あとは、設定温度+αでスイッチが切れるのドキドキしながら待ちました。さて水温が40℃に到達、しばらくしてヒーターのスイッチが切れました。まず第一段階クリア。
ヒータのスイッチが切れた後、水温は惰性で若干上昇後、緩やかに下降を始めました。設定温度の40℃を切ったところで再度ヒーターのスイッチが入り所定の動作確認が出来ました。
●最初の設定測定間隔5秒(目盛5分)、温度表示域30~46℃(目盛2℃)
温度設定:40℃、動作:ヒーター、温度調整巾1℃(40.5℃でヒータースイッチOFF、39.5℃以下でヒータースイッチON)
水温は12~13分で上昇、下降を繰り返しました。水温は39.2℃~40.8℃の範囲で変化
●温度調整巾 0.4に変更
(40.2でヒータスイッチOFF、39.8℃以下でスイッチON)
水温は7分で上昇、下降を繰り返しました。水温は39.5℃~40.5℃の範囲で変化。
今回テストした電子温度計は、まあ、観賞魚用の温度コントローラ並みの機能、しかしヒーターのスイッチにリレーを使用、その動作保障は10万回、つまり、7分サイクルの温度調節で8カ月でこの電子温度計の寿命を迎えることになります。
2013年2月3日日曜日
LPC1114 システムクロックについて(Systick)
LPC1114FN28のシステムクロック設定の検証を続けています。
今回はSystickタイマの動作を確認することでメインクロックの動作を確認しました。
Systickタイマのサンプルコードは「lpc11xx.keil-examples-CMSIS-update.zip」にあるプロジェクト「systick」のsysticktest.cのみを利用しました。
1.Systick割り込みでGPIOのHigh/Low出力を行い。出力周波数を計測。
1)サンプルコード systicktest.c について
以下のコードで 10mS でSystick割り込みを実現しています。
#define SYSTICK_DELAY (SystemCoreClock/100)
SysTick_Config( SYSTICK_DELAY );
2)割り込みで呼ばれる SysTick_Handler(void)にGPIO PIO1_4のHigh/Low出力を追加。
void SysTick_Handler(void)
{
int i;
TimeTick++;
TimeTick &= 0x7fffffff;
i = TimeTick & 0x01;
GPIOSetValue( 1, 4, i );
}
3)GPIO出力周波数測定。
測定された周波数は40~50Hz。(自作の周波数カウンタでの結果)
Systickの設定を 10μS にして実行 測定周波数 49700Hz
#define SYSTICK_DELAY (SystemCoreClock/100000)
また、メインクロックは48MHzであった。
こkまでの結果をみると、Systick設定、システムクロックの設定で整合性はとれているおもわれる。 。。。。?
※ユーザーマニュアル17章「システムtick タイマ」の記載「システムクロックの周波数の半分に固定されています。」 で SysTick_Config()や、SystickのRELOADに設定される値はコーディング上二分の一される必要があると思われる。
、
今回はSystickタイマの動作を確認することでメインクロックの動作を確認しました。
Systickタイマのサンプルコードは「lpc11xx.keil-examples-CMSIS-update.zip」にあるプロジェクト「systick」のsysticktest.cのみを利用しました。
1.Systick割り込みでGPIOのHigh/Low出力を行い。出力周波数を計測。
1)サンプルコード systicktest.c について
以下のコードで 10mS でSystick割り込みを実現しています。
#define SYSTICK_DELAY (SystemCoreClock/100)
SysTick_Config( SYSTICK_DELAY );
2)割り込みで呼ばれる SysTick_Handler(void)にGPIO PIO1_4のHigh/Low出力を追加。
void SysTick_Handler(void)
{
int i;
TimeTick++;
TimeTick &= 0x7fffffff;
i = TimeTick & 0x01;
GPIOSetValue( 1, 4, i );
}
3)GPIO出力周波数測定。
測定された周波数は40~50Hz。(自作の周波数カウンタでの結果)
Systickの設定を 10μS にして実行 測定周波数 49700Hz
#define SYSTICK_DELAY (SystemCoreClock/100000)
また、メインクロックは48MHzであった。
こkまでの結果をみると、Systick設定、システムクロックの設定で整合性はとれているおもわれる。 。。。。?
※ユーザーマニュアル17章「システムtick タイマ」の記載「システムクロックの周波数の半分に固定されています。」 で SysTick_Config()や、SystickのRELOADに設定される値はコーディング上二分の一される必要があると思われる。
、
LPC1114 UART及びメインクロックの確認
トラ技付録LPC1114でUARTの機能を以下の手順で検証しました。
1.プログラムコードの入手
NXPからサンプルコード「lpc11xx.keil-examples-CMSIS-update.zip」を入手し、以下のプログラムコードを抽出利用しました。
・uarttest.c フォルダUART
・uart.c、core_cm0.c フォルダCommon/src
・uart.h、type.h フォルダCommon/inc
2.Keil uVision4で新規プロジェクトTestUART01を作成ビルド
・上記のサンプルコードファイルをプロジェクトTestUART01に追加
・system_LPC11xx.cは、GPIOを試したプロジェクトで使用したものをプロジェクトTestUART01に追加
3.プロジェクトTestUART01をデバッグ
1)サンプルコードそのままで実行
・PCのターミナルソフトでUARTの通信は確認できなかった。
2)ボーレートを遅くして実行
・UARTInit();によるボーレート指定を 115200から9600に変更した。
・最初、1)と同様にUARTは沈黙、、、いろいろもがくうちに、たまたま、PCのターミナルソフトのボーレートを115200で試すと、本来のUARTの動作が確認出来ました。
LPC1114のボーレートが9600、PC側のボーレート115200でUARTの送受信が確認出来ました。
後は、LPC1114側のUART設定かメインクロックの設定の問題と思い、プログラムコードを点検しました。(特にメインクロックの設定はもともとクロックソースとしてシステムクロック(外部)であったのをIRCクロックに変更したので要注意)
4.プログラムコードsystem_LPC11xx.cの確認
1)システムPLL 制御レジスタ(SYSPLLCTRL)設定とメインクロック(SystemCoreClock)の計算に誤りと思われるコードがある。
SYSPLLCTRLの設定値は0x00000023で分周比M=4 ポスト分周比P=2となりIRCクロック12MHzではメインクロックは24MHzとなるはず、
しかしsystem_LPC11xx.cのSystemCoreClockUpdate()で計算されるメインクロックは48MHzとなりました。
計算式
SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);はレジスタSYSPLLCTRLのポスト分周比Pが考慮されていない。
次のように修正した、
SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1) / (0x01 << ((SYSPLLCTRL_Val & 0x060) >> 5) );
5.system_LPC11xx.c修正の検証
ひとまずメインクロックの計算式を修正した段階でUARTの検証を行った、当然、計算されるメインクロックは2分の1の 24MHz となるので LPC側のボーレートは2倍になります。PC 側のターミナルソフトのボーレートを230400に設定しました。
その結果は、文字化けが多発、一部の英数XYZ12345がエコーバックで表示出来ている。つまり、ボーレートに若干のずれがあると言うことでしょう。
6.UARTボーレートの調整
LPC1114とPC側のボーレート設定の不一致は、ひとまず棚上げ、LPC1114のボーレートの調整を行いました。
ユーザマニュアルでUART 分数分周器レジスタ(U0FDR)の設定でボーレートの調整が出来ることがわかり試しました。
その結果は、DIVADDVALを1に、MULVALを12にした場合 最も文字化けが少なくなるが依然、使用に耐えるレベルにない。
現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、
![]() |
| メインクロックの表示 |
1.プログラムコードの入手
NXPからサンプルコード「lpc11xx.keil-examples-CMSIS-update.zip」を入手し、以下のプログラムコードを抽出利用しました。
・uarttest.c フォルダUART
・uart.c、core_cm0.c フォルダCommon/src
・uart.h、type.h フォルダCommon/inc
2.Keil uVision4で新規プロジェクトTestUART01を作成ビルド
・上記のサンプルコードファイルをプロジェクトTestUART01に追加
・system_LPC11xx.cは、GPIOを試したプロジェクトで使用したものをプロジェクトTestUART01に追加
3.プロジェクトTestUART01をデバッグ
1)サンプルコードそのままで実行
・PCのターミナルソフトでUARTの通信は確認できなかった。
2)ボーレートを遅くして実行
・UARTInit();によるボーレート指定を 115200から9600に変更した。
・最初、1)と同様にUARTは沈黙、、、いろいろもがくうちに、たまたま、PCのターミナルソフトのボーレートを115200で試すと、本来のUARTの動作が確認出来ました。
LPC1114のボーレートが9600、PC側のボーレート115200でUARTの送受信が確認出来ました。
![]() |
| 初めてUARTの動作確認 |
4.プログラムコードsystem_LPC11xx.cの確認
1)システムPLL 制御レジスタ(SYSPLLCTRL)設定とメインクロック(SystemCoreClock)の計算に誤りと思われるコードがある。
SYSPLLCTRLの設定値は0x00000023で分周比M=4 ポスト分周比P=2となりIRCクロック12MHzではメインクロックは24MHzとなるはず、
しかしsystem_LPC11xx.cのSystemCoreClockUpdate()で計算されるメインクロックは48MHzとなりました。
計算式
SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);はレジスタSYSPLLCTRLのポスト分周比Pが考慮されていない。
次のように修正した、
SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1) / (0x01 << ((SYSPLLCTRL_Val & 0x060) >> 5) );
5.system_LPC11xx.c修正の検証
ひとまずメインクロックの計算式を修正した段階でUARTの検証を行った、当然、計算されるメインクロックは2分の1の 24MHz となるので LPC側のボーレートは2倍になります。PC 側のターミナルソフトのボーレートを230400に設定しました。
その結果は、文字化けが多発、一部の英数XYZ12345がエコーバックで表示出来ている。つまり、ボーレートに若干のずれがあると言うことでしょう。
6.UARTボーレートの調整
LPC1114とPC側のボーレート設定の不一致は、ひとまず棚上げ、LPC1114のボーレートの調整を行いました。
ユーザマニュアルでUART 分数分周器レジスタ(U0FDR)の設定でボーレートの調整が出来ることがわかり試しました。
![]() |
| 文字化けがなかなか解消されない。 |
現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、
2013年2月2日土曜日
LPC1114FN28 GPIO でジタバタ
数か月遅れで、トラ技(2012年10月号)付録マイコンLPC1114を試しています。付録DVDにあったサンプルプログラム「MDK_sample」を修正して、各機能のチェックを行おうと思いました。
第一歩GPIOを確かめてみました。
これが不幸の始まり。
まず、トラ技の記事の「端子配置/機能」(P60、P61)を眺め、パラレルデータインターフェース用に8ビットまたは4ビットのデータポートを確保しようと思いました。
当然、PIO0_0~PIO0_7(ポート0)または、PIO1_0~PIO1_7(ポート1)のいずれかを使うことになります。しかし、PIO0_0、PIO0_1はRESETとISPへの切り替え用となっているので、ポート0はデータポートしては使えないと判断、またPIO1_6、PIO1_7はUART用に使われます、ポート1も使えない、、、、、、、(強引にPIO0_4~PIO0_11で8ビットのデータポートを確保するしかないのかと思いました。)
8ビットデータインターフェースは諦め、一まず、次のように、4ビット(PIO1_0~PIO1_3)のデータポートを実現しようとしました。
1.I/O設定(MDK_sample main.c)
1)LPC_IOCON->PIO1_1 = 0xd0;を追加するがコンパイルエラーが発生次の通り修正
LPC_IOCON->R_PIO1_0 = 0xd1;
LPC_IOCON->R_PIO1_1 = 0xd1;
LPC_IOCON->R_PIO1_2= 0xd1;
LPC_IOCON->SWDIO_PIO1_3 = 0xd1;
2)LPC1114に書き込めど、動かず、
LPC_IOCON->PIOx_yで設定できるGPIOは動作確認できるが、それ以外のGPIOは不能となる。
LPC_IOCON->R_PIOx_yについて、ユーザーマニュアル 6章「I/O設定」を繰り返し読む、レジスタの説明で[R機能]が優先、しかし[R機能]の意味が解らない、、、
LPC_IOCON->SWDIO_PIO1_3について はシリアルワイヤデバッグ(SWD)のピンが優先、したがって、SWDの機能を無効にすればPIO1_3が使えるようになると思いました。
しかし、ユーザマニュアルにSWDを無効にする方法もレジスタの表記も無い。NXPの他のドキュメントを繰るとCRP(Code Read Protection)の機能でSWDを無効に出来そうだと、、、、、
2.CRPの設定
1)アドレス0x000002FCに値0x12345678を書き込む。
startup_LPC11xx.sを以下の用に修正
・・・・・・・・・・・・・・・・・・
IF :LNOT::DEF:NO_CRP
AREA |.ARM.__at_0x02FC|, CODE, READONLY
CRP_Key DCD 0xFFFFFFFF
ENDIF
CRP_Key DCD 0xFFFFFFFF を CRP_Key DCD 0x12345678 に変更
2)FlashMagicでCRP1の設定を確認
FlashMagic ISP/Read Security....でCRP1を確認(通常はCRP is disable)
3)GPIO PIO1_3の出力を調べるが、不調
依然として、High/Lowの出力が出来ない。
4)プログラムのフラッシュの書き込み不能に。
CRPに関するドキュメントでは、CRP1ではプログラムの書き込みは可能なはず、しかしFlashMagicでのプログラム書き込みは不能。またセクタ0の消去は不能(ドキュメント通り)
そこで全消去をしようと思ったが、FlashMagicではそのような機能は無いようです。
5)LPC1114 一つ廃棄
LPC1114を試して1週間、最初の石は不能に、、、
LPC1114について、ネットを調べまくると、多くのソースコードでLPC_IOCON->R_PIO1_0 の設定があります。LPC1114自体 PIO1_0はCRPなどの面倒な設定なしで普通に使えるはず。。。。
問題は「Keil uVision4」でしょうか?「Keil uVision4」でR機能、SWD機能を前提にする環境があるのか、もしかしてGNU GCCを使えば このGPIOの問題は解決か。。。。
3.GCCによる開発
以前LPC2388のプロジェクトをひな形に、付録DVDのサンプルプロジェクトを参考に
1)プログラムソース
main.c
cr_startup_lpc11.c (Rev.01 2011.04.17 Munetomo Maruyama)
system_LPC11xx.c (17. November 2009 by ARM)
2)memory.def
ROM0000.ld(created from nxp_lpc13_c.ld (v3.1.4 (200912230917)) )をリネイム
3)Makefile
コンパイルオプション COMPILE_OPTS = -c -mcpu=cortex-m0 -mthumb
ライブラリディレクトリ LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb -L /usr/local/arm-tools/lib/gcc/arm-elf/4.6.3/thumb (GCCのインストールにより適宜に修正)
4)動作確認
今まで沈黙していたPIO1_0につないだLEDが点滅
よし、GCCでのプログラム開発でLPC1114の全てのGPIO入出力に目途がたったと思いました。
しかし、いままで集めたサンプルプロジェクト中から、使えそうなものを修正し、動作の検証を行ったところ、前述の「Keil uVision4」と同じGPIOの不調が起きました。その不調の原因を調べると、どうも使っていたsystem_LPC11xx.cが異なっていたことに気づきました。
実際2つのsystem_LPC11xx.cを比較しても、GPIOの不調が起こるコーディングは見つけ出せない(現在)
さてそうなると、前述の「Keil uVision4」が原因で起こるGPIO不調に疑問、、そこでプロジェクトのsystem_LPC11xx.cを見ると、GPIO不調のGCCプロジェクトのsystem_LPC11xx.cと同じでした。
そこで、system_LPC11xx.cを置き換え、検証すると「Keil uVision4」のGPIOの不調は解消。
まとめ
●LPC1114で R機能、SWD機能の共有ピンの GPIO動作不調はsystem_LPC11xx.cによる。
※「MDK_sample」のsystem_LPC11xx.c に System AHB clock 制御レジスタ (SYSAHBCLKCTRL)の設定を追加するとGPIO は正常に。
追加コード
#define AHBCLKCTRL_Val 0x0001FFFF
LPC_SYSCON->SYSAHBCLKCTRL = AHBCLKCTRL_Val; ....(2013/2/3)
●GCCでのビルド(make)では、コンパイルオプション -mcpu=cortex-m0 -mthumb が必須
またリンクするライブラリ(libc.a等)は thumb配下のライブラリを指定。
(LPC2388ではARM・thumbどちらでも可、LPC1114はthumbのみ可)
●CRP(Code Read Protection)設定 CRP1は現時点で設定しない方がよい。
第一歩GPIOを確かめてみました。
これが不幸の始まり。
まず、トラ技の記事の「端子配置/機能」(P60、P61)を眺め、パラレルデータインターフェース用に8ビットまたは4ビットのデータポートを確保しようと思いました。
当然、PIO0_0~PIO0_7(ポート0)または、PIO1_0~PIO1_7(ポート1)のいずれかを使うことになります。しかし、PIO0_0、PIO0_1はRESETとISPへの切り替え用となっているので、ポート0はデータポートしては使えないと判断、またPIO1_6、PIO1_7はUART用に使われます、ポート1も使えない、、、、、、、(強引にPIO0_4~PIO0_11で8ビットのデータポートを確保するしかないのかと思いました。)
8ビットデータインターフェースは諦め、一まず、次のように、4ビット(PIO1_0~PIO1_3)のデータポートを実現しようとしました。
1.I/O設定(MDK_sample main.c)
1)LPC_IOCON->PIO1_1 = 0xd0;を追加するがコンパイルエラーが発生次の通り修正
LPC_IOCON->R_PIO1_0 = 0xd1;
LPC_IOCON->R_PIO1_1 = 0xd1;
LPC_IOCON->R_PIO1_2= 0xd1;
LPC_IOCON->SWDIO_PIO1_3 = 0xd1;
2)LPC1114に書き込めど、動かず、
LPC_IOCON->PIOx_yで設定できるGPIOは動作確認できるが、それ以外のGPIOは不能となる。
LPC_IOCON->R_PIOx_yについて、ユーザーマニュアル 6章「I/O設定」を繰り返し読む、レジスタの説明で[R機能]が優先、しかし[R機能]の意味が解らない、、、
LPC_IOCON->SWDIO_PIO1_3について はシリアルワイヤデバッグ(SWD)のピンが優先、したがって、SWDの機能を無効にすればPIO1_3が使えるようになると思いました。
しかし、ユーザマニュアルにSWDを無効にする方法もレジスタの表記も無い。NXPの他のドキュメントを繰るとCRP(Code Read Protection)の機能でSWDを無効に出来そうだと、、、、、
2.CRPの設定
1)アドレス0x000002FCに値0x12345678を書き込む。
startup_LPC11xx.sを以下の用に修正
・・・・・・・・・・・・・・・・・・
IF :LNOT::DEF:NO_CRP
AREA |.ARM.__at_0x02FC|, CODE, READONLY
CRP_Key DCD 0xFFFFFFFF
ENDIF
CRP_Key DCD 0xFFFFFFFF を CRP_Key DCD 0x12345678 に変更
2)FlashMagicでCRP1の設定を確認
FlashMagic ISP/Read Security....でCRP1を確認(通常はCRP is disable)
3)GPIO PIO1_3の出力を調べるが、不調
依然として、High/Lowの出力が出来ない。
4)プログラムのフラッシュの書き込み不能に。CRPに関するドキュメントでは、CRP1ではプログラムの書き込みは可能なはず、しかしFlashMagicでのプログラム書き込みは不能。またセクタ0の消去は不能(ドキュメント通り)
そこで全消去をしようと思ったが、FlashMagicではそのような機能は無いようです。
5)LPC1114 一つ廃棄
LPC1114を試して1週間、最初の石は不能に、、、
LPC1114について、ネットを調べまくると、多くのソースコードでLPC_IOCON->R_PIO1_0 の設定があります。LPC1114自体 PIO1_0はCRPなどの面倒な設定なしで普通に使えるはず。。。。
問題は「Keil uVision4」でしょうか?「Keil uVision4」でR機能、SWD機能を前提にする環境があるのか、もしかしてGNU GCCを使えば このGPIOの問題は解決か。。。。
3.GCCによる開発
以前LPC2388のプロジェクトをひな形に、付録DVDのサンプルプロジェクトを参考に
1)プログラムソース
main.c
cr_startup_lpc11.c (Rev.01 2011.04.17 Munetomo Maruyama)
system_LPC11xx.c (17. November 2009 by ARM)
2)memory.def
ROM0000.ld(created from nxp_lpc13_c.ld (v3.1.4 (200912230917)) )をリネイム
3)Makefile
コンパイルオプション COMPILE_OPTS = -c -mcpu=cortex-m0 -mthumb
ライブラリディレクトリ LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb -L /usr/local/arm-tools/lib/gcc/arm-elf/4.6.3/thumb (GCCのインストールにより適宜に修正)
4)動作確認
今まで沈黙していたPIO1_0につないだLEDが点滅
よし、GCCでのプログラム開発でLPC1114の全てのGPIO入出力に目途がたったと思いました。
しかし、いままで集めたサンプルプロジェクト中から、使えそうなものを修正し、動作の検証を行ったところ、前述の「Keil uVision4」と同じGPIOの不調が起きました。その不調の原因を調べると、どうも使っていたsystem_LPC11xx.cが異なっていたことに気づきました。
実際2つのsystem_LPC11xx.cを比較しても、GPIOの不調が起こるコーディングは見つけ出せない(現在)
さてそうなると、前述の「Keil uVision4」が原因で起こるGPIO不調に疑問、、そこでプロジェクトのsystem_LPC11xx.cを見ると、GPIO不調のGCCプロジェクトのsystem_LPC11xx.cと同じでした。
そこで、system_LPC11xx.cを置き換え、検証すると「Keil uVision4」のGPIOの不調は解消。
まとめ
●LPC1114で R機能、SWD機能の共有ピンの GPIO動作不調はsystem_LPC11xx.cによる。
※「MDK_sample」のsystem_LPC11xx.c に System AHB clock 制御レジスタ (SYSAHBCLKCTRL)の設定を追加するとGPIO は正常に。
追加コード
#define AHBCLKCTRL_Val 0x0001FFFF
LPC_SYSCON->SYSAHBCLKCTRL = AHBCLKCTRL_Val; ....(2013/2/3)
●GCCでのビルド(make)では、コンパイルオプション -mcpu=cortex-m0 -mthumb が必須
またリンクするライブラリ(libc.a等)は thumb配下のライブラリを指定。
(LPC2388ではARM・thumbどちらでも可、LPC1114はthumbのみ可)
●CRP(Code Read Protection)設定 CRP1は現時点で設定しない方がよい。
2013年1月24日木曜日
トラ技(2012-10)付録 LPC1114を試しました。
遅ればせながら、CQ出版 トランジスタ技術 2012年10月号 付録の NXP LPC1114を試しました。
昨年 同誌をとりあえず購入、3か月余り書棚にしまいこんだままでした。しまいこんだ割には、その付録が気になっていました。付録は他の雑誌付録と違ってLPC1114単体、「一体どうやって使うのだろう?」 4KバイトのRAM、32KバイトのフラッシュROM、記事の通り「チョコット試す」にはもったいないようなスペック。
今日、改めて記事を眺めてみました。すると、LPC1114を試すには、USB シリアル(RS232C、UART)のIFドライバIC、電源レギュレータ―等諸々、が必要であることが分かりました。
入手できそうなIFドライバはFT231X(ICパッケージはSSOP-20)、電源レギュレータは手持ちかあるが結構手間取ることになりそう。
ふと、傍らのTIのLaunchPad パッケージに目が止まりました。LunchPadを使えば、「USB-UART(Rx Tx)変換が簡単に利用出来そう!」「Vddの出力もある!」「USBドライバーのインストール不要!」 早速LPC1114のプログラミングに挑戦。以下にその顛末を述べます。
まず、開発環境の整備
1.MDK-ARMのインストール(不要)
Interface誌付属 FM3基板を試したときインストールしたKeil uVision4の機能を確かめる。
新規プロジェクト作成で対応CPUをみると
LPC1114/201 ~ LPC1114/323 が対応していました。
そこで LPC1114/102 用にデバイスデータベースをインストールしました。
1)付録CDで立ち上がるIE HTMLページでMDK-ARM_NXP_LPCxxxx.exeを実行
2)Keil uVision4を再度立ち上げ新規プロジェクト作成
Select a CPU Data Base Fileで「NXP LPC Family Device Database」が選択可能になり そこに登録されているLPC1114/102でプロジェクト作成が可能になりました。
2.MyARM_sampleのインストール
サンプルプログラムを入手するためインストールしました。
3.Flash Magicのインストール
サンプルプログラムによる、プログラム開発の実施
4.LPC1114の周辺回路の構築
・電源 Vdd、Vss 必須
・UART Rx、Tx 必須
・スイッチ SW1 (PIO0_1) SW2(Reset) 必須(ブートローダでISPを起動させるため・・・後述)
・LED LED1(PIO0_7) LED2(PIO1_5) 適宜
5.サンプルプログラムMDK-sampleをビルド/プログラム書き込み/実行
メモ
●Flash Magicでのプログラム書き込み。
FlashMagic側) Baud Rateを115200に指定 InterfaceをNone(ISP)に
PC側) デバイスマネージャでCOMポート ボーレートを1152000 に設定
●書き込み失敗時
SW1(PIO0_1) SW2(RESET)同時 Push後 再度書き込む。
(CPUリセット時 PIO0_1がLowの場合 ISPが起動、UARTによるプログラムの書き込みが可能になります。)
●トラ技2012-10号 P62 の図1の回路図でRXD/TXDの配線間違いがあるので注意
(Flash Magicで、てこずった原因)
昨年 同誌をとりあえず購入、3か月余り書棚にしまいこんだままでした。しまいこんだ割には、その付録が気になっていました。付録は他の雑誌付録と違ってLPC1114単体、「一体どうやって使うのだろう?」 4KバイトのRAM、32KバイトのフラッシュROM、記事の通り「チョコット試す」にはもったいないようなスペック。
今日、改めて記事を眺めてみました。すると、LPC1114を試すには、USB シリアル(RS232C、UART)のIFドライバIC、電源レギュレータ―等諸々、が必要であることが分かりました。
入手できそうなIFドライバはFT231X(ICパッケージはSSOP-20)、電源レギュレータは手持ちかあるが結構手間取ることになりそう。
ふと、傍らのTIのLaunchPad パッケージに目が止まりました。LunchPadを使えば、「USB-UART(Rx Tx)変換が簡単に利用出来そう!」「Vddの出力もある!」「USBドライバーのインストール不要!」 早速LPC1114のプログラミングに挑戦。以下にその顛末を述べます。
まず、開発環境の整備
1.MDK-ARMのインストール(不要)
Interface誌付属 FM3基板を試したときインストールしたKeil uVision4の機能を確かめる。
新規プロジェクト作成で対応CPUをみると
LPC1114/201 ~ LPC1114/323 が対応していました。
そこで LPC1114/102 用にデバイスデータベースをインストールしました。
1)付録CDで立ち上がるIE HTMLページでMDK-ARM_NXP_LPCxxxx.exeを実行
2)Keil uVision4を再度立ち上げ新規プロジェクト作成
Select a CPU Data Base Fileで「NXP LPC Family Device Database」が選択可能になり そこに登録されているLPC1114/102でプロジェクト作成が可能になりました。
2.MyARM_sampleのインストール
サンプルプログラムを入手するためインストールしました。
3.Flash Magicのインストール
サンプルプログラムによる、プログラム開発の実施
4.LPC1114の周辺回路の構築
・電源 Vdd、Vss 必須
・UART Rx、Tx 必須
・スイッチ SW1 (PIO0_1) SW2(Reset) 必須(ブートローダでISPを起動させるため・・・後述)
・LED LED1(PIO0_7) LED2(PIO1_5) 適宜
5.サンプルプログラムMDK-sampleをビルド/プログラム書き込み/実行
メモ
●Flash Magicでのプログラム書き込み。
FlashMagic側) Baud Rateを115200に指定 InterfaceをNone(ISP)に
PC側) デバイスマネージャでCOMポート ボーレートを1152000 に設定
●書き込み失敗時
SW1(PIO0_1) SW2(RESET)同時 Push後 再度書き込む。
(CPUリセット時 PIO0_1がLowの場合 ISPが起動、UARTによるプログラムの書き込みが可能になります。)
●トラ技2012-10号 P62 の図1の回路図でRXD/TXDの配線間違いがあるので注意
(Flash Magicで、てこずった原因)
2013年1月15日火曜日
NHD-C12864でチャート表示を試しました。
SG12864のデータインターフェースはパラレル、一方NHD-C12864はシリアル、当初、SG12864の方が、表示能力に勝ると思われたのですが、最小限の表示プログラム改造でNHD-C12864を稼働させると、遜色ない結果になりました。逆に、SG12864で起こる表示の乱れがNHD-C12864で起こらない満足いく結果になりました。
グラフィックLCD NHD-C12864A1Zを試しました。
Newhaven Display International社 グラフィックLCD NHD-C12864A1Z-FSB-FBWを試しました。
これまではTI Stellaris LaunchPadでSUNLIKE社グラフィックLED SG12864 を使用していました。SG12864ではGPIOピンを13本占有するので、開発アプリケーションが自ずと制限されます。
そこで、データインターフェースがシリアルのLCDを探したところ、DigiKeyでNHD-C12864A1Zを見つけ、早速に入手しました。
NHD-C12864A1Zは、
・マイコンとのインターフェースはGPIOピン4本でOK
・0.1インチ(2.54mm)ピッチの12本のピン (6×2)
・3.3V駆動 (No.9ピン H+ ヒータ用の12Vの給電があるが、いまいち不明?)
最初、シリアルのデータインターフェースはSPI(SSI)やI2Cを使うと予想していたのですが、ドキュメントに記載された、初期化コードをみると、単純にGPIOのHi/Low出力でSCLとSI(SDA、Tx)を実現しているようで以下のコーディングを行いました。
* シリアルによるデータ出力 1バイトの出力データ siout を シフトさせながら1ビットづつ出力
for(i=0;i<8;i++)
{
lcd_SCL_low(); //SCL:Low
if(siout & _10000000B)
{
GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, LCD_PIN_SI); //SI:High
}
else
{
GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, 0); //SI:Low
}
lcd_SCL_high(); //SCL:High
siout = siout <<1; //1ビットのシフト
}
*感想
・表示内容により、濃淡のムラがある。
・比較的簡単に表示が実現。
(SG12864では、各信号の出力タイミングの調整が必要でしたが、今回は簡単に表示が確認出来ました。)
これまではTI Stellaris LaunchPadでSUNLIKE社グラフィックLED SG12864 を使用していました。SG12864ではGPIOピンを13本占有するので、開発アプリケーションが自ずと制限されます。
そこで、データインターフェースがシリアルのLCDを探したところ、DigiKeyでNHD-C12864A1Zを見つけ、早速に入手しました。
NHD-C12864A1Zは、
・マイコンとのインターフェースはGPIOピン4本でOK
・0.1インチ(2.54mm)ピッチの12本のピン (6×2)
・3.3V駆動 (No.9ピン H+ ヒータ用の12Vの給電があるが、いまいち不明?)
最初、シリアルのデータインターフェースはSPI(SSI)やI2Cを使うと予想していたのですが、ドキュメントに記載された、初期化コードをみると、単純にGPIOのHi/Low出力でSCLとSI(SDA、Tx)を実現しているようで以下のコーディングを行いました。
* シリアルによるデータ出力 1バイトの出力データ siout を シフトさせながら1ビットづつ出力
for(i=0;i<8;i++)
{
lcd_SCL_low(); //SCL:Low
if(siout & _10000000B)
{
GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, LCD_PIN_SI); //SI:High
}
else
{
GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, 0); //SI:Low
}
lcd_SCL_high(); //SCL:High
siout = siout <<1; //1ビットのシフト
}
*感想
・表示内容により、濃淡のムラがある。
・比較的簡単に表示が実現。
(SG12864では、各信号の出力タイミングの調整が必要でしたが、今回は簡単に表示が確認出来ました。)
2013年1月12日土曜日
.Net (VC++) Chartクラスを使ってグラフを表示
先日作成した電子温度計(Stellaris LM4F120)とPCとの連携を行いたいと思い、測定データをPCに取り込み、データのグラフ表示を試しました。
以前VC++でグラフ表示を行った時 System::Drawing::Graphics等の Drawing配下のクラスを利用しましたが、今回は、Chartクラスを使ったグラフ表示を試しました。
===================================================================
1.概要
電子温度計 [UART] ==(USB)== [COMポート] PC
測定温度
デザイン
VC++でWindowsフォームアプリケーションでプロジェクトを作成する。
Form1にChart、SerialPort オブジェクトを追加 設定する。
初期処理
Chart/Seriseに1024個のDataPointを値0で登録する。
メイン処理
シリアルポート受信イベントで電子温度計が出力する温度データを取り込む。
取り込んだ温度データを順次 Chart/Serise/DataPointオブジェクトに設定する。
===================================================================
2.VC++プロジェクト作成<<非時系列チャート>>1)Chart設定
Form1にChartオブジェクト chart1 を作成
プロパティ設定 Seriseコレクション(ChartType:Line)
2)SerialPort設定
Form1にSerialPortオブジェクト serialPort1を作成
プロパティ設定 BaudRate と PortNameを設定
3)コーディング コンストラクタ Form1(void)
①Charting/Seriesオブジェクト series1tをローカル宣言
System::Windows::Forms::DataVisualization::Charting::Series^ series1t;
②chart1のSeries1を①で宣言したseries1tに読みだす。
series1t = this->chart1->Series["Series1"];
③Charting/DataPointオブジェクトを初期値で作成。
System::Windows:・・・:Charting::DataPoint^ tmppoint
= (gcnew System::Windows::・・・::Charting::DataPoint(i,0));
④Charting/DataPointオブジェクトを①で宣言したseries1tに登録する。
series1t->Points->Add(tmppoint);
*③④を繰り返し1024のDataPointオブジェクトをseries1t(chart1/Series1)に登録する。
⑤シリアルポートをOpenする。
this->serialPort1->Open();
4)コーディング シリアルポート受信イベント処理 (serialPort1_DataReceived)
①Charting/Series、Pointsオブジェクト series1t、tmppoint をローカル宣言
②DateTime型で現在時刻を取得する。
DateTime timesp = System::DateTime::Now;
③シリアルポート受信データを取り込み、温度データを抽出する。
strreceive = this->serialPort1->ReadLine(); [[strreceive:String]]
strvalue = strreceive->Substring(7,6); [[strvalue:String 温度データ位置:7]]
④取得した温度データでSeries1のDataPointを更新する。
(インデックス指定で、一旦Series1のDataPointを削除して、取得した温度データでDataPointオブジェクトを作成し登録し直す。)
series1t = this->chart1->Series["Series1"];
tmppoint = series1t->Points[IntPointIndex]; [[IntPointIndex:DataPointインデックス]]
series1t->Points->Remove(tmppoint);
System::Windows:・・・:Charting::DataPoint^ tmppoint1
= (gcnew System::Windows::Forms::DataVisualization::Charting::DataPoint(IntPointIndex,System::Convert::ToDouble(strvalue)));
series1t->Points->Insert(IntPointIndex,tmppoint1);

5)エラー対処
このコーディングでプログラムを実行すると、不定期のタイミングで「InvalidOperationException ”コレクションが変更されました。実行されない可能性があります。” エラー」が発生します。
①原因の予想
チャート表示処理中にチャート情報の更新が重なったため起きたエラーと思われます。
②対処
Serise1/DataPointオブジェクトの削除、挿入処理はChartを一旦非表示にして実行する。
this->chart1->Visible = false;
===================================================================
3.VC++プロジェクト作成 <<時系列チャート>>
1)Chart設定
プロパティ設定 Seriseコレクション(ChartType:Line XValueType:Time)
2)SerialPort設定
3)コーディング コンストラクタ Form1(void)
①シリアルポートをOpenする。
4)コーディング シリアルポート受信イベント処理 (serialPort1_DataReceived)
①Charting/Seriesオブジェクト series1tをローカル宣言
②DateTime型で現在時刻を取得する。
③シリアルポート受信データを取り込み、温度データを抽出する。
④取得した温度データでDataPointを作成し Series1に登録する。
System::Windows:・・・:Charting::DataPoint^ tmppoint2
= (gcnew System:・・・:Charting::DataPoint(timesp.ToOADate(),System::Convert::ToDouble(strvalue)));
series1t->Points->Add(tmppoint2);
⑤Series1に登録されたDataPointオブジェクトが1024を超えた場合。先頭のDataPointオブジェクトを削除する。
series1t->Points->RemoveAt(0);
===================================================================
※メモ
●DataPointの設定
DateTime値をDataPointのX値に設定する場合 ToOADate()メソッドを使用する。
●チャートデータの更新処理の工夫
データDataPointコレクションの更新時 Chatオブジェクトは非表示にする。 (前述)
※気になる点
●MicroSoftのmsdnオンラインドキュメントの不備
ChartクラスのSystem名前空間からの継承階層はSystem::Windows::Forms::DataVisualization::Charting::Chartですが、オンライドキュメントでSystem名前空間から繰るとSystem::Windows::Forms名前空間 止まりでした。また、DataVisualization名前空間配下の Series等のクラスではドキュメントの繰り方で、内容の無いページが現れます。
とにかく、Chartクラスを使うのには情報が少ない。
2012年12月27日木曜日
Stellaris LaunchPadで電子温度計を作ってみました。
TI Stellaris LaunchPadに温度センサーを繋げて温度表示を行いました。
最初、単にStellaris LM4F120のAIN端子に温度センサを繋げて、「はい終了!」のつもりが。。。
以前 MSP430で温度計を作ったときは、電圧出力型温度センサを使ったのですが、今回はLM4F120のADCが12ビットなので、
せっかくなら、「精度のある温度センサを!」
せっかくなら、「複数の温度センサを!」
といったことで、結構手間取るはめになりました。
1.温度センサについて
今回使用した温度センサはUS Sensor社のUSP11491 です。
最初、単にStellaris LM4F120のAIN端子に温度センサを繋げて、「はい終了!」のつもりが。。。
以前 MSP430で温度計を作ったときは、電圧出力型温度センサを使ったのですが、今回はLM4F120のADCが12ビットなので、
せっかくなら、「精度のある温度センサを!」
せっかくなら、「複数の温度センサを!」
といったことで、結構手間取るはめになりました。
1.温度センサについて
今回使用した温度センサはUS Sensor社のUSP11491 です。
2.Rcの選択について
今回使用の温度センサは、計測温度の上昇に伴い、抵抗値が減少します。したがってLM4F120が出力する電圧Vccの分圧回路を組む必要があると考えました。分圧回路を構成する2つの抵抗 1つはこの温度センサ、もう1つは固定抵抗(Rc) つまりRcを決める必要があります。
![]() |
| 温度測定回路、温度計算式等 |
①各温度(-55~150℃)での温度センサの抵抗値を計算
※ただし 温度センサの B値は (0~50℃)でこの温度範囲外はBを補正する必要がありそうですが、それこそ、精密な温度計が必要になりそうで今回は目をつぶります。
②Rcを仮に設定して、各温度(-55~150℃)での分圧(V)を計算し、1℃あたりの分圧の変化⊿Vを把握
⊿Vが大きいほど測定温度の分解能が大きくなる。
●Rc 3.3KΩ の場合 35~54℃(45℃がピーク)で⊿Vが大きくなる。
●Rc 5KΩ の場合 20~50℃(34℃がピーク)で⊿Vが大きくなる。
●Rc 10KΩ の場合 0~40℃(19℃がピーク)で⊿Vが大きくなる。
※測定温度域が低い場合 Rcを大きく 高い場合 Rcを小さくすることになります。
3.Stellaris LM4F120のADCの使い方。
StellarisWareのサンプルプログラムを参考に温度測定回路の電圧Vを取り込み温度表示をおこないました。比較的簡単に出来ました。
しかし、複数温度センサー構成を試みたところ、なかなか2ch以降の電圧Vの取り込みが行えませんでした、StellarisのADCのシーケンス、シーケンスステップがなかなか理解できなかったのが要因でした、ドキュメントに関連するブロック図でもあったらと思います。
//////// 3チャネルのADC取り込み設定//////////////////////////////////////////
////////////////端子設定/////////////////////////////////////////////////////////////////////
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1);
///////////////ADC0の使用宣言///////////////////////////////////////////////////////
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
///////////////シーケンス設定///////////////////////////////////////////////////////////
ROM_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_PROCESSOR, 0);
//////////////ステップ設定////////////////////////////////////////////////////////////////
ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH0 |ADC_CTL_IE );
ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 1, ADC_CTL_CH1 |ADC_CTL_IE );
ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 2, ADC_CTL_CH2 |ADC_CTL_IE |ADC_CTL_END);
//////////////シーケンス稼働////////////////////////////////////////////////////////////////
ROM_ADCSequenceEnable(ADC0_BASE, 2);
ROM_ADCIntClear(ADC0_BASE, 2);
ROM_ADCSequenceEnable(ADC0_BASE, 2);
ROM_ADCIntClear(ADC0_BASE, 2);
//////// 3チャネルのADC 取り込み //////////////////////////////////////////
///////////////ADCトリガ////////////////////////////////////////////////////////////////////
ROM_ADCProcessorTrigger(ADC0_BASE, 2);
///////////////ADCコンバージョン完了待ち////////////////////////////////////////////////////////////////////
///////////////ADCコンバージョン完了待ち////////////////////////////////////////////////////////////////////
while(!ROM_ADCIntStatus(ADC0_BASE, 2, false))
{
}
{
}
ROM_ADCIntClear(ADC0_BASE,2);
///////////////ADCデータ取得////////////////////////////////////////////////////////////////////
ROM_ADCSequenceDataGet(ADC0_BASE, 2, ulADC0_Value);
///////////////ADCデータ取得////////////////////////////////////////////////////////////////////
ROM_ADCSequenceDataGet(ADC0_BASE, 2, ulADC0_Value);
ulADC0_Valueは配列 ulADC0_Value[0]がCh0 ulADC0_Value[1]がCh1 ulADC0_Value[2]がCh2 の値を格納
Stellaris LaunchPadを試してみました。
![]() |
| SG12864によるアルファベット&テストパターン表示 |
開発環境の Code Composer Studio v5 はライセンス切れで、GNU GCCでのプログラミングを試しました。
他のマイコンとは異なり、Stellarisでは、レジストリを直接操作するようなプログラミングはせず、レジストリの操作を遮蔽した各種関数を使用たプログラミングとなりました。
1.デバイスドライバ―のインストール
TIのHPから、ICDIドライバー(spmc016.zip)をダウンロードし、以下のドライバーをインストールしました。
・Stellaris ICDI JTAG/SWD Interface
・Stellaris ICDI DFU Device
・Stellaris Virtual Serial Port
2.LM フラッシュ・プログラマ のインストール
・ダウンロードファイル:LMFlashProgrammer_1470.zip
3.StellarisWare のインストール
StellarisのドキュメントをTIのサイト探すのですが、プログラミングガイド、レジストリのリファレンスマニュアル等が見つからず、使えそうなドキュメントは各種関数のユーザーガイド(LM4F120H5QR_ROM_UserGuid.pdf)ぐらいで、プログラム開発は困難と思われました。
StellarisWareには、LM3S,LM4Fシリーズのサンプルコードが含まれこれが開発の糸口になります。
*TIからStellarisWareのファイルを ダウンロードすると、ダウンロード元でSW-LM3S-9453.exe(129MB) と SW-LM3S-9453(356M)の2つの異なったファイルが得られます。
SW-LM3S-9453.exeを実行するとインストールエラーになり、そこで強引にSW-LM3S-9453のファイル名をSW-LM3S-9453.exeに変更してインストールを実行しました。
4.GNU GCC
GCCはすでにインストール済み(Interface誌 付属FM3基板 Cortex-M3 用)
StellarisWareのサンプルコードのディレクトリで make は成功しました。
※Stellaris LaunchPadの価格が1259円(DigiKey)に改定されていました。しかも在庫0 もう少し多めに買っとけば良かったかなと。。。。
2012年10月9日火曜日
TI LaunchPad Stellaris を購入しました。
テキサスインスツルメンツ(TI)より、Stellaris LM4F120 LaunchPadが発売され、半分収集癖から、とりあえず購入しました。このLaunchPadはMSP430と同レベルの価格で450円(C2000 LaunchPadが特別に高いということでしょうか)
以前試した、Stellaris LM3S8962 の経験から使いやすいマイコンと予想しています。
今回 のマイコン LM4F120 はARM Cortex-M4 で従来のM3からどの程度進化したのか期待をこめてパッケージを眺めています。
今は、C2000 LaunchPadの使い方が解り始めたところで、当分このLanchPadの機能を検証していきたいとおもいます、 Stellaris LanchPadを試すのはずっと先になりそうです。

C2000(TMS320) 32 60MHz 12KB 64KB かなりユニーク
Stellaris(LM4F120) 32 80MHz 32KB 256KB 一般的(予想)
3機種のLaunchPad 単純に比較はできないと思いますが。今回のStellaris LanchPad は、以下の点でマイコンの学習用に最も適していると思われます。
以前試した、Stellaris LM3S8962 の経験から使いやすいマイコンと予想しています。
今回 のマイコン LM4F120 はARM Cortex-M4 で従来のM3からどの程度進化したのか期待をこめてパッケージを眺めています。
今は、C2000 LaunchPadの使い方が解り始めたところで、当分このLanchPadの機能を検証していきたいとおもいます、 Stellaris LanchPadを試すのはずっと先になりそうです。

※LanchPad 3機種
CPU Bit Clock RAM Flash 特徴
MSP430 16 16MHz 128~512B 2KB~16KB 手軽に開発C2000(TMS320) 32 60MHz 12KB 64KB かなりユニーク
Stellaris(LM4F120) 32 80MHz 32KB 256KB 一般的(予想)
3機種のLaunchPad 単純に比較はできないと思いますが。今回のStellaris LanchPad は、以下の点でマイコンの学習用に最も適していると思われます。
- メモリが大きい、
- CPU コアが ARM Cortex-M4
- 外部出力のPinが多い、 J1~J4の Vcc GND Reset 以外の外部ピンが殆どGPIOで使えます。
- 超 低価格
2012年10月8日月曜日
TI C2000 LaunchPad 割り込み処理で悪戦苦闘
テキサスインスツルメンツ(TI)のC2000 LaunchPad を 試し始めて、ほぼ1カ月たちました。
この、マイコン基板、他のマイコン基板(MSP430 LaunchPad や CQ出版の付属マイコン基板)に
に比べ やたら凝った構成になっているのに気付きました。
例えば、以下の2点
●デジタルアイソレータISO72x
PCとのシリアル通信(USBシリアル変換)を直接繋げず、デジタルアイソレータで通信によるPCからのノイズをシャットアウトするようになっているようです。
●LEDの点滅にロジックIC(バッファ)を使っている。
今まで、LEDの点滅はGPIOの出力で行うのが定番と思っていたのですが、この基板、バッファを使うことで、GPIO端子が入力であろうと出力であろうと関係なく、端子の電圧レベル(Hi/Low)で点滅します。LEDはGPIO端子のモニタとなっているようです。
これらは、今後Know Howとして生かせそうな気がします。
さて、開発の方では、CCSv5で作成するプロジェクトがデバッグは出来るものの、FlashROMへの書き込みが不調で、これがなかなか解決できずにいました。やむなく、デモプロジェクト(C2kLaunchPadDemo)をCCSv5にインポート(Copyで)し、
このプロジェクトがFlashROMへの書き込みが成功するのを確かめた上で、大部分の機能を削りLEDの点滅のみのプログラムに改造しました。
これをCCSv5でCopy/Pasteして新規のプロジェクトとして使用するようにしました。
C2000 LaunchPadのプログラム開発 第一歩
として各種 割り込みを試しました。
1.タイマ割り込
サンプルプロジェクトtimed_led_blinkを参考にすると、難なくタイマ割り込みを実現できました。
タイマ設定 TIMER_setPeriod(myTimer, 50 * 500000); の Period 値は const uint32_t になるような値だと問題ないのですが、uint16_tでおさまる値の場合キャスト(const uint32_t)が必要になるようです。
また、ユーザーが使えるタイマはTimer0のみの1本で、プログラミングで工夫が必要となりそうです。
2.外部割り込み(GPIO)
サンプルプロジェクトexternal_interruptを参考にすると、難なく外部割り込みを実現できました。
外部割り込み(XINT1,XINT2)とGPIO入力Pinは1対1で、1つのピンにXINTnを割り当てると、他のPinに割り当てられないようです。つまり他のマイコンのように外部割り込みが ポート(複数のPin)に割り当てるようなことが出来ず、2本のGPIOの入力のみに外部割り込みが割り当て可能となるようです。
3.SCI(UART)割り込み
サンプルプログラムscia_loopback_interruptsを 参考にするのですが、コーディングミスでSCI割り込みが失敗。各マニュアルをひっくり返すはめに、すると、割り込みを実現するために設定しなければならないレジスタがあまりにも多いことが解りました。
また、TIが提供するソースコードで以下の誤りがありました。
sci.cのSCI_setRxFifoIntLevel()の
// clear the value
sci->SCIFFTX &= (~SCI_SCIFFRX_IL_BITS); <=レジスタ間違い SCIFFRX
sci->SCIFFTX &= (~SCI_SCIFFRX_IL_BITS); <=レジスタ間違い SCIFFRX
(RXFFIL4-0が初期値 11111のまま、で変更不可となってしまいます・・・・)
また FIFOがマニュアル上は16ワード(16バイト?)のはずが、4ワードが上限になっているようです。
2012年9月24日月曜日
TI C2000 LaunchPad を試しました。
2012年8月 テキサス・インスツルメンツ(TI)より、LaunchPad第二弾、C2000 LaunchPadがリリースされました。
TIのホームページで同LaunchPadの外観を見て、40本のPinが引き出されていて、MSP430 LaunchPadに比べ、拡張性が高いと思い、早々に発注しました。購入価格は1551円
9月上旬に届けられた、パッケージを開くと、意外と質素、まあ、MSP430 LaunchPadのパケージが価格のわりに凝り過ぎの感が否めなかったからでしょうか。
まず C2000 LaunchPad で デモプログラムのデバッグが出来るまでの手順を以下に記します。
1.LaunchPadデモプログラムの稼働
・付属のUSBケーブルでLaunchPadを PCにつなぎます。(FT2232ドライバ(FTDI)はMSP430 LaunchPad等で導入済み)
LaunchPadのLED0~3が流れるように点滅します。
・PCでターミナルソフトを立ち上げます。シリアル接続でボーレートを11520に設定します。
・LaunchPadのResetスイッチを押します。
TIのロゴマークのパターンがターミナルソフトに出力されます。
・スイッチS3を押すと、LEDの点滅が変化し、ターミナルソフトに温度変化が出力されます。
2.Code Composer Studio(CCSV5)のインストール
MSP430を試したときのバージョン4(CCSV4)で、C2000 TMS320F28027のプロジェクトを作成、(TIのホームページよりダウンロード(sprc191.zip)したサンプルプログラム を使用)
ビルドは成功するのですが、LaunchPadとの接続が出来ない。接続エラーも出力しない。(うんともすんとも言わない状態) CCSV4では無理と判断 CCSV5のインストールを行いました。
1)TIからCCSV5をダウンロードした ccs_setup_5.2.1.00018.exe を実行
CCSV5はc:\tiのフォルダにインストールされる。
2)CCSV5を実行 ライセンス登録を行う。
・ライセンス管理のため ネットワークカードのMACアドレスが必要
コマンドプロンプトで ipconfig /all を実行 イーサネットアダプタの物理アドレスを使う。
・メールで送られてきた ライセンスファイル(TMDFCCS-ALLT90A-v5.lic)を c:\ti\licenceのフォルダに置く。
3.controlSUITEのインストール
これは、LaunchPadのデモプログラム(C2kLaunchPadDemo)を利用するためにインストールしました。
デモプログラム
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_examples\C2kLaunchPadDemo
4.デモプログラムのデバッグ
1)CCSV5を立ち上げ、前述のデモプログラムをImportしました。
・Buildを実行すると成功、しかしLaunchPadとの接続エラーでデバッグは実行出来ず。
2)デモプロジェクトにNewでTarget Configuration File を作成しました。
・Connection: Texas Instruments XDS100v1 USB Emulatorを選択
・Boad or Device: TMS320F28027にチェック
・Save Configuration 後 Test Connectionを実行 =>成功
※接続ログ 後述
3)デバッグを実行
今回 C2000 LauchPad のデバッグ 実行から開始までかなり時間がかかりました。(40秒)
5.開発初期プロジェクトの作成
1)File/NewでCCS Project を作成する。
・Project name 入力
・Device Family:C2000
Variant:2802x Piccolo TMS320F28027
・Connection:Texas Instruments XDS100v1 USB Emulator
・Project templates and examples で Empty Project(with main.c) を選択
*Taget Configration File は TMS320F28027.ccxml で作成されました。
2)プログラムコーディング/ビルド/デバッグ
LED0~3の点滅のプログラムはビルド成功しかし、コーディングを進めるに従い、次のエラー発生
../28027_RAM_lnk.cmd", line 114: error #10099-D: program will not fit into available memory. placement with alignment/blocking fails for section ".text" size 0xaa5 page 0. Available memory ranges:
どうも RAMのエリアが足りないエラーのようです。
・cmdファイル 28027_RAM_lnk.cmd の置き換え。
とりあえずデモプロジェクトで使われている 2つのcmdファイルに置き換えました。
<cmdファイル>
●F2802x_Headers_nonBIOS.cmd
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_headers\cmd
●F28027.cmd
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_common\cmd
これで一部WARNINGはでるものの一応ビルドは成功しました。
何とかLED の点滅が可能になったので、キャラクタLCDでメッセージが表示を試しました。
----------------------------------------
現時点では、まだデバッグは出来るものの、フラッシュROMへの書き込みは不調のようで、C2000 LaunchPadでもう少しじたばたしそうです。
----------------------------------------
C2000 LaunchPadの40本のピン 意外とGPIOに割り当てられたピンが少なく、少々残念、購入前に リファレンスマニュアルを読み込んでおけば。。。。。
----------------------------------------
※ 成功のLaunchPad 接続ログ
=======================================
[Start]
Execute the command:
%ccs_base%/common/uscif/dbgjtag -f %boarddatafile% -rv -o -F inform,logfile=yes -S pathlength -S integrity
[Result]
-----[Print the board config pathname(s)]------------------------------------
C:\Users\yanagi\AppData\Local\.TI\213602635\
0\0\BrdDat\testBoard.dat
-----[Print the reset-command software log-file]-----------------------------
This utility has selected a 100- or 510-class product.
This utility will load the adapter 'jioserdesusb.dll'.
The library build date was 'May 30 2012'.
The library build time was '22:52:27'.
The library package version is '5.0.747.0'.
The library component version is '35.34.40.0'.
The controller does not use a programmable FPGA.
The controller has a version number of '4' (0x00000004).
The controller has an insertion length of '0' (0x00000000).
This utility will attempt to reset the controller.
This utility has successfully reset the controller.
-----[Print the reset-command hardware log-file]-----------------------------
The scan-path will be reset by toggling the JTAG TRST signal.
The controller is the FTDI FT2232 with USB interface.
The link from controller to target is direct (without cable).
The software is configured for FTDI FT2232 features.
The controller cannot monitor the value on the EMU[0] pin.
The controller cannot monitor the value on the EMU[1] pin.
The controller cannot control the timing on output pins.
The controller cannot control the timing on input pins.
The scan-path link-delay has been set to exactly '0' (0x0000).
-----[The log-file for the JTAG TCLK output generated from the PLL]----------
There is no hardware for programming the JTAG TCLK frequency.
-----[Measure the source and frequency of the final JTAG TCLKR input]--------
There is no hardware for measuring the JTAG TCLK frequency.
-----[Perform the standard path-length test on the JTAG IR and DR]-----------
This path-length test uses blocks of 512 32-bit words.
The test for the JTAG IR instruction path-length succeeded.
The JTAG IR instruction path-length is 38 bits.
The test for the JTAG DR bypass path-length succeeded.
The JTAG DR bypass path-length is 1 bits.
-----[Perform the Integrity scan-test on the JTAG IR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG IR Integrity scan-test has succeeded.
-----[Perform the Integrity scan-test on the JTAG DR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG DR Integrity scan-test has succeeded.
[End]
=======================================
TIのホームページで同LaunchPadの外観を見て、40本のPinが引き出されていて、MSP430 LaunchPadに比べ、拡張性が高いと思い、早々に発注しました。購入価格は1551円
9月上旬に届けられた、パッケージを開くと、意外と質素、まあ、MSP430 LaunchPadのパケージが価格のわりに凝り過ぎの感が否めなかったからでしょうか。
まず C2000 LaunchPad で デモプログラムのデバッグが出来るまでの手順を以下に記します。
1.LaunchPadデモプログラムの稼働
・付属のUSBケーブルでLaunchPadを PCにつなぎます。(FT2232ドライバ(FTDI)はMSP430 LaunchPad等で導入済み)
LaunchPadのLED0~3が流れるように点滅します。
・PCでターミナルソフトを立ち上げます。シリアル接続でボーレートを11520に設定します。
・LaunchPadのResetスイッチを押します。
TIのロゴマークのパターンがターミナルソフトに出力されます。
・スイッチS3を押すと、LEDの点滅が変化し、ターミナルソフトに温度変化が出力されます。
2.Code Composer Studio(CCSV5)のインストール
MSP430を試したときのバージョン4(CCSV4)で、C2000 TMS320F28027のプロジェクトを作成、(TIのホームページよりダウンロード(sprc191.zip)したサンプルプログラム を使用)
ビルドは成功するのですが、LaunchPadとの接続が出来ない。接続エラーも出力しない。(うんともすんとも言わない状態) CCSV4では無理と判断 CCSV5のインストールを行いました。
1)TIからCCSV5をダウンロードした ccs_setup_5.2.1.00018.exe を実行
CCSV5はc:\tiのフォルダにインストールされる。
2)CCSV5を実行 ライセンス登録を行う。
・ライセンス管理のため ネットワークカードのMACアドレスが必要
コマンドプロンプトで ipconfig /all を実行 イーサネットアダプタの物理アドレスを使う。
・メールで送られてきた ライセンスファイル(TMDFCCS-ALLT90A-v5.lic)を c:\ti\licenceのフォルダに置く。
3.controlSUITEのインストール
これは、LaunchPadのデモプログラム(C2kLaunchPadDemo)を利用するためにインストールしました。
デモプログラム
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_examples\C2kLaunchPadDemo
4.デモプログラムのデバッグ
1)CCSV5を立ち上げ、前述のデモプログラムをImportしました。
・Buildを実行すると成功、しかしLaunchPadとの接続エラーでデバッグは実行出来ず。
2)デモプロジェクトにNewでTarget Configuration File を作成しました。
・Connection: Texas Instruments XDS100v1 USB Emulatorを選択
・Boad or Device: TMS320F28027にチェック
・Save Configuration 後 Test Connectionを実行 =>成功
※接続ログ 後述
3)デバッグを実行
今回 C2000 LauchPad のデバッグ 実行から開始までかなり時間がかかりました。(40秒)
5.開発初期プロジェクトの作成
1)File/NewでCCS Project を作成する。
・Project name 入力
・Device Family:C2000
Variant:2802x Piccolo TMS320F28027
・Connection:Texas Instruments XDS100v1 USB Emulator
・Project templates and examples で Empty Project(with main.c) を選択
*Taget Configration File は TMS320F28027.ccxml で作成されました。
2)プログラムコーディング/ビルド/デバッグ
LED0~3の点滅のプログラムはビルド成功しかし、コーディングを進めるに従い、次のエラー発生
../28027_RAM_lnk.cmd", line 114: error #10099-D: program will not fit into available memory. placement with alignment/blocking fails for section ".text" size 0xaa5 page 0. Available memory ranges:
どうも RAMのエリアが足りないエラーのようです。
・cmdファイル 28027_RAM_lnk.cmd の置き換え。
とりあえずデモプロジェクトで使われている 2つのcmdファイルに置き換えました。
<cmdファイル>
●F2802x_Headers_nonBIOS.cmd
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_headers\cmd
●F28027.cmd
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_common\cmd
これで一部WARNINGはでるものの一応ビルドは成功しました。
何とかLED の点滅が可能になったので、キャラクタLCDでメッセージが表示を試しました。
----------------------------------------
現時点では、まだデバッグは出来るものの、フラッシュROMへの書き込みは不調のようで、C2000 LaunchPadでもう少しじたばたしそうです。
----------------------------------------
C2000 LaunchPadの40本のピン 意外とGPIOに割り当てられたピンが少なく、少々残念、購入前に リファレンスマニュアルを読み込んでおけば。。。。。
----------------------------------------
※ 成功のLaunchPad 接続ログ
=======================================
[Start]
Execute the command:
%ccs_base%/common/uscif/dbgjtag -f %boarddatafile% -rv -o -F inform,logfile=yes -S pathlength -S integrity
[Result]
-----[Print the board config pathname(s)]------------------------------------
C:\Users\yanagi\AppData\Local\.TI\213602635\
0\0\BrdDat\testBoard.dat
-----[Print the reset-command software log-file]-----------------------------
This utility has selected a 100- or 510-class product.
This utility will load the adapter 'jioserdesusb.dll'.
The library build date was 'May 30 2012'.
The library build time was '22:52:27'.
The library package version is '5.0.747.0'.
The library component version is '35.34.40.0'.
The controller does not use a programmable FPGA.
The controller has a version number of '4' (0x00000004).
The controller has an insertion length of '0' (0x00000000).
This utility will attempt to reset the controller.
This utility has successfully reset the controller.
-----[Print the reset-command hardware log-file]-----------------------------
The scan-path will be reset by toggling the JTAG TRST signal.
The controller is the FTDI FT2232 with USB interface.
The link from controller to target is direct (without cable).
The software is configured for FTDI FT2232 features.
The controller cannot monitor the value on the EMU[0] pin.
The controller cannot monitor the value on the EMU[1] pin.
The controller cannot control the timing on output pins.
The controller cannot control the timing on input pins.
The scan-path link-delay has been set to exactly '0' (0x0000).
-----[The log-file for the JTAG TCLK output generated from the PLL]----------
There is no hardware for programming the JTAG TCLK frequency.
-----[Measure the source and frequency of the final JTAG TCLKR input]--------
There is no hardware for measuring the JTAG TCLK frequency.
-----[Perform the standard path-length test on the JTAG IR and DR]-----------
This path-length test uses blocks of 512 32-bit words.
The test for the JTAG IR instruction path-length succeeded.
The JTAG IR instruction path-length is 38 bits.
The test for the JTAG DR bypass path-length succeeded.
The JTAG DR bypass path-length is 1 bits.
-----[Perform the Integrity scan-test on the JTAG IR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG IR Integrity scan-test has succeeded.
-----[Perform the Integrity scan-test on the JTAG DR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG DR Integrity scan-test has succeeded.
[End]
=======================================
2012年5月15日火曜日
付属FM3基板 LCD表示(SG12864)
Interface誌 付属FM3基板 でモノクログラフィック SG12864 を繋げてみました。
当初 付属SH-2A基板で使っていたプログラムソースを流用したのですが。まったく動作せず、軽くタイミング調整でなんとかなると思っていたのですが、これに手こずり、いまだ使えずにいます。
◎FM3 <=> SG12864 インターフェース
----------------------------------------
FM3 GPIO SG12864 PORT
----------------------------------------
P50 D/I 4
P51 R/W 5
P52 E 6
PB0-PB7 DB0-DB7 7-14
P3A CS1 15
P3B CS2 16
P53 /RES 17
そこで、SG12864 を使った簡単なプログラムソースが無いか、ネットで調べると、「Sim's blog」さんの SG12864Aを使ってみました の記事に ソースコード(ATMEL AVRマイコン ATMega168)が掲載、これを拝借、
なにより、ソースが明瞭簡単、各信号の出力タイミングの調整すごく楽そうだったので、このソースコードを試すことにしました。
始めは、ノイズパターン(意味不明の)表示でした。そこで画像データの代りに、0x55、0x50(4本線2本線パターン表示)の固定値を書き込むように変更。
E信号等の出力前にWaitを加えその待機時間を調整、最初十数ドット巾の線が、待機時間の調整で徐々に広がり最終的に全画面表示に、そこで、本来の画像データの表示に戻すと、「初音ミク」登場とあいなりました。
*本来使いたかった私のSG12684のプログラムソースは 付属V850基板のときに作成、付属ARM(LPC2386)基板の時に、別のマイコンでも簡単に対応できるように、いろいろプログラムに工夫をこらしました、おかげで付属ARM(STM32)基板、付属SH-2A基板ではすんなり改造ができたので今回も簡単にできると思っていました。
今回のSG12684のプログラムソースの付属FM3基板への対応、一旦改造に失敗すると、凝ったプログラムは悲惨。。。と 反省
*今回の付属FM3基板 GPIOによるデジタル出力(パラレル)の能力が非常に高いと言えるのかも知れません。
当初 付属SH-2A基板で使っていたプログラムソースを流用したのですが。まったく動作せず、軽くタイミング調整でなんとかなると思っていたのですが、これに手こずり、いまだ使えずにいます。
◎FM3 <=> SG12864 インターフェース
----------------------------------------
FM3 GPIO SG12864 PORT
----------------------------------------
P50 D/I 4
P51 R/W 5
P52 E 6
PB0-PB7 DB0-DB7 7-14
P3A CS1 15
P3B CS2 16
P53 /RES 17
そこで、SG12864 を使った簡単なプログラムソースが無いか、ネットで調べると、「Sim's blog」さんの SG12864Aを使ってみました の記事に ソースコード(ATMEL AVRマイコン ATMega168)が掲載、これを拝借、
なにより、ソースが明瞭簡単、各信号の出力タイミングの調整すごく楽そうだったので、このソースコードを試すことにしました。
始めは、ノイズパターン(意味不明の)表示でした。そこで画像データの代りに、0x55、0x50(4本線2本線パターン表示)の固定値を書き込むように変更。
E信号等の出力前にWaitを加えその待機時間を調整、最初十数ドット巾の線が、待機時間の調整で徐々に広がり最終的に全画面表示に、そこで、本来の画像データの表示に戻すと、「初音ミク」登場とあいなりました。
*本来使いたかった私のSG12684のプログラムソースは 付属V850基板のときに作成、付属ARM(LPC2386)基板の時に、別のマイコンでも簡単に対応できるように、いろいろプログラムに工夫をこらしました、おかげで付属ARM(STM32)基板、付属SH-2A基板ではすんなり改造ができたので今回も簡単にできると思っていました。
今回のSG12684のプログラムソースの付属FM3基板への対応、一旦改造に失敗すると、凝ったプログラムは悲惨。。。と 反省
*今回の付属FM3基板 GPIOによるデジタル出力(パラレル)の能力が非常に高いと言えるのかも知れません。
2012年5月11日金曜日
付属FM3基板 第二歩 タイマ割り込み。
Interface誌 付属FM3基板 で タイマ割り込みがようやく使えるようになりました。デュアルタイマ、多機能タイマ何れもタイマ割り込みによるLEDの点滅が実現できました。
苦戦1週間余り、富士通からダウンロードしたサンプルプログラム(mb9bf51xt_dualtimer-v10)を幾度も見直すのですが、これが難解、ただ単に、ただ単に3つのレジスタを設定するだけでタイマを使えるようになるはず、と思いながら、解読。
レジスタおよび、レジスタの項目ごとの設定順をああでもない、こうでもないと。
実際にタイマが機能し始めたとき、このプログラムは何度か試したと思い。なんでこんな簡単なプログラムに手間取ったのか、少々じくじたる思い。
以下にそのプログラムソースを記します。(最も簡単なタイマ割り込みプログラム。
◎多機能タイマについて。
多機能タイマのユニット2(3つ目のユニット)が機能しない。富士通のデータシート等を見ると、MB9BF610Tシリーズの多機能タイマは3(最大)となっていて、ほかの資料も最大3ユニット、「ほんとは2ユニット、1ユニット??」という気になる。
また、多機能タイマのコーディングでは、しばらく、ユニットと、チャネルとを取り違えるミスをしていて気が付かなかった。凡ミスでユニット2が機能しないだけのことかもしれません。
=======デュアルタイマ main.c ========
#include "mcu.h"
static volatile uint16_t int_count;
void DT_Handler(void)
{
/* Clear Interrupt */
FM3_DTIM->TIMER1INTCLR = 0xffffffffU;
int_count++;
int_count &= 0x7fff;
FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0100) >>8;
}
int32_t main(void)
{
int i;
int_count = 0;
// for LED1
bFM3_GPIO_DDRF_P3=1;
// Test Output Port (LED_A LED_B LED_C)
bFM3_GPIO_DDR5_P0=1;
bFM3_GPIO_DDR5_P1=1;
bFM3_GPIO_DDR5_P2=1;
// Configuration ( Dual Timer )
/* Clear Interrupt */
FM3_DTIM->TIMER1INTCLR = 0xFFFFFFFFU;
FM3_DTIM->TIMER1CONTROL =0x00000000U;
FM3_DTIM->TIMER1CONTROL_f.ONESHOT =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERMODE =1;
FM3_DTIM->TIMER1CONTROL_f.TIMERPRE0 =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERPRE1 =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERSIZE =1;
FM3_DTIM->TIMER1CONTROL_f.INTENABLE =1;
FM3_DTIM->TIMER1LOAD = 0xFFFFFFFFU;
/* enable interrupt */
NVIC_EnableIRQ(DTIM_QDU_IRQn);
//Set the count cycle
FM3_DTIM->TIMER1LOAD = 0x00020000;
FM3_DTIM->TIMER1CONTROL_f.TIMEREN =1;
while(1){
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =1;
}
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =0;
}
}
}
=======多機能タイマ main.c ========
#include "mcu.h"
static volatile uint16_t int_count;
void MFT_FRT_IRQHandler(void)
{
/* Clear Interrupt */
FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
int_count++;
int_count &= 0x7fff;
FM3_GPIO->PDOR5_f.P0 = (int_count & 0x0020) >>5;
FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0080) >>7;
}
int32_t main(void)
{
int i;
int_count = 0;
// LED1
bFM3_GPIO_DDRF_P3=1;
// Test Output Port (LED_A LED_B LED_C)
bFM3_GPIO_DDR5_P0=1;
bFM3_GPIO_DDR5_P1=1;
bFM3_GPIO_DDR5_P2=1;
// Configuration ( // Configuration ( Multi-function Timer ))
FM3_MFT0_FRT->TCSA0 = 0x00;
FM3_MFT0_FRT->TCSA0_f.CLK0 = 0x01;
FM3_MFT0_FRT->TCSA0_f.CLK1 = 0x01;
FM3_MFT0_FRT->TCSA0_f.CLK2 = 0x00;
FM3_MFT0_FRT->TCSA0_f.CLK3 = 0x00;
FM3_MFT0_FRT->TCSA0_f.MODE = 0x00;
FM3_MFT0_FRT->TCSA0_f.SCLR = 0x00;
FM3_MFT0_FRT->TCSA0_f.STOP = 0x01;
FM3_MFT0_FRT->TCSA0_f.BFE = 0x00;
FM3_MFT0_FRT->TCSA0_f.ICRE = 0x01;
FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
FM3_MFT0_FRT->TCSA0_f.IRQZE = 0x00;
FM3_MFT0_FRT->TCSA0_f.IRQZF = 0x00;
FM3_MFT0_FRT->TCSA0_f.ECKE = 0x00;
FM3_MFT0_FRT->TCSB0 = 0x00000000;
FM3_MFT0_FRT->TCDT0 = 0x0000;
NVIC_EnableIRQ(FRTIM_IRQn);
FM3_MFT0_FRT->TCSA0_f.SCLR = 0x01;
//Set the count cycle
FM3_MFT0_FRT->TCCP0 = 0x1000;
FM3_MFT0_FRT->TCSA0_f.STOP = 0x0;
while(1){
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =1;
}
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =0;
}
}
}
苦戦1週間余り、富士通からダウンロードしたサンプルプログラム(mb9bf51xt_dualtimer-v10)を幾度も見直すのですが、これが難解、ただ単に、ただ単に3つのレジスタを設定するだけでタイマを使えるようになるはず、と思いながら、解読。
レジスタおよび、レジスタの項目ごとの設定順をああでもない、こうでもないと。
実際にタイマが機能し始めたとき、このプログラムは何度か試したと思い。なんでこんな簡単なプログラムに手間取ったのか、少々じくじたる思い。
以下にそのプログラムソースを記します。(最も簡単なタイマ割り込みプログラム。
◎多機能タイマについて。
多機能タイマのユニット2(3つ目のユニット)が機能しない。富士通のデータシート等を見ると、MB9BF610Tシリーズの多機能タイマは3(最大)となっていて、ほかの資料も最大3ユニット、「ほんとは2ユニット、1ユニット??」という気になる。
また、多機能タイマのコーディングでは、しばらく、ユニットと、チャネルとを取り違えるミスをしていて気が付かなかった。凡ミスでユニット2が機能しないだけのことかもしれません。
=======デュアルタイマ main.c ========
#include "mcu.h"
static volatile uint16_t int_count;
void DT_Handler(void)
{
/* Clear Interrupt */
FM3_DTIM->TIMER1INTCLR = 0xffffffffU;
int_count++;
int_count &= 0x7fff;
FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0100) >>8;
}
int32_t main(void)
{
int i;
int_count = 0;
// for LED1
bFM3_GPIO_DDRF_P3=1;
// Test Output Port (LED_A LED_B LED_C)
bFM3_GPIO_DDR5_P0=1;
bFM3_GPIO_DDR5_P1=1;
bFM3_GPIO_DDR5_P2=1;
// Configuration ( Dual Timer )
/* Clear Interrupt */
FM3_DTIM->TIMER1INTCLR = 0xFFFFFFFFU;
FM3_DTIM->TIMER1CONTROL =0x00000000U;
FM3_DTIM->TIMER1CONTROL_f.ONESHOT =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERMODE =1;
FM3_DTIM->TIMER1CONTROL_f.TIMERPRE0 =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERPRE1 =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERSIZE =1;
FM3_DTIM->TIMER1CONTROL_f.INTENABLE =1;
FM3_DTIM->TIMER1LOAD = 0xFFFFFFFFU;
/* enable interrupt */
NVIC_EnableIRQ(DTIM_QDU_IRQn);
//Set the count cycle
FM3_DTIM->TIMER1LOAD = 0x00020000;
FM3_DTIM->TIMER1CONTROL_f.TIMEREN =1;
while(1){
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =1;
}
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =0;
}
}
}
=======多機能タイマ main.c ========
#include "mcu.h"
static volatile uint16_t int_count;
void MFT_FRT_IRQHandler(void)
{
/* Clear Interrupt */
FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
int_count++;
int_count &= 0x7fff;
FM3_GPIO->PDOR5_f.P0 = (int_count & 0x0020) >>5;
FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0080) >>7;
}
int32_t main(void)
{
int i;
int_count = 0;
// LED1
bFM3_GPIO_DDRF_P3=1;
// Test Output Port (LED_A LED_B LED_C)
bFM3_GPIO_DDR5_P0=1;
bFM3_GPIO_DDR5_P1=1;
bFM3_GPIO_DDR5_P2=1;
// Configuration ( // Configuration ( Multi-function Timer ))
FM3_MFT0_FRT->TCSA0 = 0x00;
FM3_MFT0_FRT->TCSA0_f.CLK0 = 0x01;
FM3_MFT0_FRT->TCSA0_f.CLK1 = 0x01;
FM3_MFT0_FRT->TCSA0_f.CLK2 = 0x00;
FM3_MFT0_FRT->TCSA0_f.CLK3 = 0x00;
FM3_MFT0_FRT->TCSA0_f.MODE = 0x00;
FM3_MFT0_FRT->TCSA0_f.SCLR = 0x00;
FM3_MFT0_FRT->TCSA0_f.STOP = 0x01;
FM3_MFT0_FRT->TCSA0_f.BFE = 0x00;
FM3_MFT0_FRT->TCSA0_f.ICRE = 0x01;
FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
FM3_MFT0_FRT->TCSA0_f.IRQZE = 0x00;
FM3_MFT0_FRT->TCSA0_f.IRQZF = 0x00;
FM3_MFT0_FRT->TCSA0_f.ECKE = 0x00;
FM3_MFT0_FRT->TCSB0 = 0x00000000;
FM3_MFT0_FRT->TCDT0 = 0x0000;
NVIC_EnableIRQ(FRTIM_IRQn);
FM3_MFT0_FRT->TCSA0_f.SCLR = 0x01;
//Set the count cycle
FM3_MFT0_FRT->TCCP0 = 0x1000;
FM3_MFT0_FRT->TCSA0_f.STOP = 0x0;
while(1){
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =1;
}
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =0;
}
}
}
2012年5月7日月曜日
付属FM3基板 第二歩 タイマ割り込み。(苦戦中)
Interface誌 付属FM3基板 で タイマ割り込みにトライしています。必要とするタイマの機能は、インターバルの設定と割り込みによる関数こ呼び出しといった、ごく基本的な機能から試しています。
ペリフェラルマニュアルでは、デュアルタイマと、多機能タイマの2種類のタイマの記載があり、先日富士通サイトからダウンロードしたサンプルコードのうち、「mb9bf51xt_dualtimer-v10」を修正し、一応
の動作を確認しました。
●修正点
[smpl_dtim.c] / dtim_callback の if (int_flag < 30000 ){の処理に
FM3_GPIO->PDOR5_f.P0 = (int_flag & 0x0040) >>6;を追加
( bFM3_GPIO_DDR5_P0=1;を適宜に追加 ・・・GPIO出力設定 )
=>タイマ割り込み64回毎に点滅
次に、サンプルコード「mb9bf51xt_dualtimer-v10」のsample_main.c smple_dtm.c DtimDev.h DtimDev_FM3.c DtimDev_FM3.h のソース、ヘッダー
別のサンプルコード「mb9bf61xt_template-v13」 のmb9b610t.h system_mb9bf61x.c system_mb9bf61x.h のソース、ヘッダー
を使って、KEILの新規プロジェクトを作成しました。ただ、サンプルコードの”mb9bf51”が気になっただけのことですが。
●KEIL新規プロジェクト作成について、
ターゲットの実デバイス 「mb9b618t」はDataBaseに追加されたようでこれを指定しました。
=> startup_mb9bf61x.s が生成されました。
ここまでは、比較的容易にたどりつけました。
現在過去のV850~SH2Aで使い続けたプログラムへの対応を行っています。今回使用のサンプルコードは、結構ややこしく組まれています。サンプルコードの解析結果やマニュアルに基づいて、一旦出来るだけ単純化したものにしようとしています。
まだ、タイマ割り込みが実現できず、2日ほどもがいています。
================================
今回、Cortex-M3としては、3つ目のmcu(STM32、LM3S、FM3)になるのですが、初めて気付いた点がありました。
◎メモリ上のレジスタの領域が2つある、ビットバンド領域とエイリアス領域
サンプルコードのmb9b610t.hで同じレジスタの項目が定義される箇所が2か所あり、別のアドレスが割り当てられていて、最初は何だこれは!理解不能!という感じでした。
いくつかのサンプルコードをじっくり調べると、どうも、レジスタの1ビットが1ワード(32ビット)に展開されていることが解ってきました。
このような機能が、マニュアル(一部表記に誤り?)でビットバンド領域なる言葉があり、Cortex-M3の機能であることに初めて気づきました。
FM3のコーディングでは、ビットバンド領域への書き込みでレジスタを設定するのがよいのか、エイリアス領域への書き込みでレジスタを設定するのがよいのか、、、
いずれにせよ、無秩序に混在したコーディングは避けた方が無難だと言えます。
(ただ、エイリアス領域を使う利点をまだ認識していないだけなのですが。。。)
ペリフェラルマニュアルでは、デュアルタイマと、多機能タイマの2種類のタイマの記載があり、先日富士通サイトからダウンロードしたサンプルコードのうち、「mb9bf51xt_dualtimer-v10」を修正し、一応
の動作を確認しました。
●修正点
[smpl_dtim.c] / dtim_callback の if (int_flag < 30000 ){の処理に
FM3_GPIO->PDOR5_f.P0 = (int_flag & 0x0040) >>6;を追加
( bFM3_GPIO_DDR5_P0=1;を適宜に追加 ・・・GPIO出力設定 )
=>タイマ割り込み64回毎に点滅
次に、サンプルコード「mb9bf51xt_dualtimer-v10」のsample_main.c smple_dtm.c DtimDev.h DtimDev_FM3.c DtimDev_FM3.h のソース、ヘッダー
別のサンプルコード「mb9bf61xt_template-v13」 のmb9b610t.h system_mb9bf61x.c system_mb9bf61x.h のソース、ヘッダー
を使って、KEILの新規プロジェクトを作成しました。ただ、サンプルコードの”mb9bf51”が気になっただけのことですが。
●KEIL新規プロジェクト作成について、
ターゲットの実デバイス 「mb9b618t」はDataBaseに追加されたようでこれを指定しました。
=> startup_mb9bf61x.s が生成されました。
ここまでは、比較的容易にたどりつけました。
現在過去のV850~SH2Aで使い続けたプログラムへの対応を行っています。今回使用のサンプルコードは、結構ややこしく組まれています。サンプルコードの解析結果やマニュアルに基づいて、一旦出来るだけ単純化したものにしようとしています。
まだ、タイマ割り込みが実現できず、2日ほどもがいています。
================================
今回、Cortex-M3としては、3つ目のmcu(STM32、LM3S、FM3)になるのですが、初めて気付いた点がありました。
◎メモリ上のレジスタの領域が2つある、ビットバンド領域とエイリアス領域
サンプルコードのmb9b610t.hで同じレジスタの項目が定義される箇所が2か所あり、別のアドレスが割り当てられていて、最初は何だこれは!理解不能!という感じでした。
いくつかのサンプルコードをじっくり調べると、どうも、レジスタの1ビットが1ワード(32ビット)に展開されていることが解ってきました。このような機能が、マニュアル(一部表記に誤り?)でビットバンド領域なる言葉があり、Cortex-M3の機能であることに初めて気づきました。
FM3のコーディングでは、ビットバンド領域への書き込みでレジスタを設定するのがよいのか、エイリアス領域への書き込みでレジスタを設定するのがよいのか、、、
いずれにせよ、無秩序に混在したコーディングは避けた方が無難だと言えます。(ただ、エイリアス領域を使う利点をまだ認識していないだけなのですが。。。)
2012年5月2日水曜日
付属FM3基板 第一歩(GPIO 出力)
Interface誌 付属FM3基板 購入よりほぼ、1週間、暇を見つけながら、ようやく開発の端緒に辿りつけました。
1.USB DIRECT Programmerのインストール
富士通のサイトからダウンロード(usbdirect-v01l06.zip)
特に問題なくインストール(USBデバイスデバイスドライバは後回し)
2.サンプルプログラムをダウンロード
ダウンロードファイル mb9b610t-files.zip
最も初歩のサンプル mb9b610t-files / mb9b610t-series-201204.zip / mb9b610t-series-201204 / mb9bf61xt_template-v13
main.cの気になる点。
bFM3_GPIO_DDR3_PC=1; と bFM3_GPIO_PDOR3_PC=1;。。。
GPIO P3C を High / Low 出力 付属FM3基板のLED1は GPIO PF3 の出力のはず。。。。
3.はんだ付け作業
過去の付属基板(SH2Aなど)と同様にCN2を基本に、CN3を拡張ように振り分けはんだ付け作業をおこないました。
4.KEIL MDK-ARMのインストール
http://www.keil.com/fujitsu/ より 「MDK450.EXE」をダウンロードし、MDK-ARMのインストール
プログラム本体のインストール終了後、「File installation completed」画面が表示 少し戸惑う。
かまわず、進める。 コマンドプロンプト(DOS窓)でのインストールが進む。で、デバイスドライバ(KEIL Tools By ARM ユニバーサルシリアル。。。。)のインストール が完了
5.付属FM3基板をつなぐ(デバイスドライバのインストール)
とりあえず、付属FM3基板をPCにつなぎました。(JPP1はオープン)、何も起こらない。。。。
デモプログラムは書き込まれていないようです。JPP1をショート、JPP2でリセットを行う。PCは新規デバイスを検出しました。
使用するPCがWindows Vista なのか、デバイスドライバのインストールはすんなりいかず、付属基板は不明なデバイスとなっていました。
そこでつなぎ直し(JPP1はショート)、改めてデバイスドライバのインストールを行いました。
デバイスドライバの参照先
Program Files / Fujitsu / FUJITSU USB DIRECT Programmer / driver / WinXP
6.サンプルプログラムのビルドおよび書き込み
2.で取得したサンプルプログラムをKEIL MDK-ARMでビルド 、USB DIRECT Programmerで付属基板に書き込みました。
しかし JPP1 オープン(ユーザーモード)で LED1は点滅せず。前記の危惧に基づき、main.cを修正しました。
操作するGPIOを変更
bFM3_GPIO_DDR3_PC => bFM3_GPIO_DDRF_P3
bFM3_GPIO_PDOR3_PC => bFM3_GPIO_PDORF_P3
再度、プログラムをビルド、付属基板書き込み、ようやく LED1の点滅を実現
7.その他 GPIO
今回、作成した自作ボードはモノクロLCD(SG12864)の表示を行うため GPIOでP2、P5、PBのポートを使用します。
特にPBポートとP22は、ADC端子と共用で、GPIOとして使用するためADEレジスタの設定が必要になります。
例
PB0の場合 bFM3_GPIO_ADE_AN16=0;
FM3はGPIOを使うための設定が、ポート単位ではなくピン単位で異なります。この点は結構マイナスに感じます。 GPIOのピンを変更する場合、ドキュメントを見て、共用となる端子を一々確認する必要がありそうです。 (慣れれば問題無いのかも知れませんが。)
1.USB DIRECT Programmerのインストール
富士通のサイトからダウンロード(usbdirect-v01l06.zip)
特に問題なくインストール(USBデバイスデバイスドライバは後回し)
2.サンプルプログラムをダウンロード
ダウンロードファイル mb9b610t-files.zip
最も初歩のサンプル mb9b610t-files / mb9b610t-series-201204.zip / mb9b610t-series-201204 / mb9bf61xt_template-v13
main.cの気になる点。
bFM3_GPIO_DDR3_PC=1; と bFM3_GPIO_PDOR3_PC=1;。。。
GPIO P3C を High / Low 出力 付属FM3基板のLED1は GPIO PF3 の出力のはず。。。。
3.はんだ付け作業
過去の付属基板(SH2Aなど)と同様にCN2を基本に、CN3を拡張ように振り分けはんだ付け作業をおこないました。
4.KEIL MDK-ARMのインストール
http://www.keil.com/fujitsu/ より 「MDK450.EXE」をダウンロードし、MDK-ARMのインストール
プログラム本体のインストール終了後、「File installation completed」画面が表示 少し戸惑う。
かまわず、進める。 コマンドプロンプト(DOS窓)でのインストールが進む。で、デバイスドライバ(KEIL Tools By ARM ユニバーサルシリアル。。。。)のインストール が完了
5.付属FM3基板をつなぐ(デバイスドライバのインストール)
とりあえず、付属FM3基板をPCにつなぎました。(JPP1はオープン)、何も起こらない。。。。
デモプログラムは書き込まれていないようです。JPP1をショート、JPP2でリセットを行う。PCは新規デバイスを検出しました。
使用するPCがWindows Vista なのか、デバイスドライバのインストールはすんなりいかず、付属基板は不明なデバイスとなっていました。
そこでつなぎ直し(JPP1はショート)、改めてデバイスドライバのインストールを行いました。
デバイスドライバの参照先
Program Files / Fujitsu / FUJITSU USB DIRECT Programmer / driver / WinXP
6.サンプルプログラムのビルドおよび書き込み
2.で取得したサンプルプログラムをKEIL MDK-ARMでビルド 、USB DIRECT Programmerで付属基板に書き込みました。
しかし JPP1 オープン(ユーザーモード)で LED1は点滅せず。前記の危惧に基づき、main.cを修正しました。
操作するGPIOを変更
bFM3_GPIO_DDR3_PC => bFM3_GPIO_DDRF_P3
bFM3_GPIO_PDOR3_PC => bFM3_GPIO_PDORF_P3
再度、プログラムをビルド、付属基板書き込み、ようやく LED1の点滅を実現
7.その他 GPIO
今回、作成した自作ボードはモノクロLCD(SG12864)の表示を行うため GPIOでP2、P5、PBのポートを使用します。
特にPBポートとP22は、ADC端子と共用で、GPIOとして使用するためADEレジスタの設定が必要になります。
例
PB0の場合 bFM3_GPIO_ADE_AN16=0;
FM3はGPIOを使うための設定が、ポート単位ではなくピン単位で異なります。この点は結構マイナスに感じます。 GPIOのピンを変更する場合、ドキュメントを見て、共用となる端子を一々確認する必要がありそうです。 (慣れれば問題無いのかも知れませんが。)
2012年4月26日木曜日
Interface誌 付属FM3基板 追加部品について
先日(4月23日)、定期購読のInterface誌 2012年6月号が届きました、早速、付属基板を開封、眺めてみると、未実装のパターンが目につきました、
追加部品が必要??、今年は、追加部品を購入しなければいけないのかと、少々落胆しながら、本誌の関連記事をチェックしました。
気になった追加部品 インダクタ(L1 2.2μH)、水晶発振子(X2 4MHz)、リセットIC(IC4)
これらの部品は、本誌の記事で必須でないことが解りました。
インダクタ(L1): 300mAを超える電流が必要な場合必要 とりあえず不要
FM3基板は、電源回路にDC-DCコンバータ(MB39C022G)を使用しています。このDC-DCコンバータ、本来のDC-DCコンバータのほか、LDOレギュレータを搭載しています。FM3基板はLDOレギュレータの機能を使っています。300mAを超える電流が必要な場合、DC-DCコンバータの機能に切り替える必要があり、インダクタ(L1)が必要になります。
水晶発振子(X2) とりあえず不要
FM3基板上にすでにシリコン発振器(X1 外部クロック)があります。本誌の記事で最近のシリコン発振器は通常使うのに充分の精度があるとのこと。
IC(IC4) リセットIC とりあえず不要
FM3のINITX 端子に接続 リセットICのLow出力でFM3はリセットされます。リセットICは電源が安定するまでLowを出力します。複数のマイコンを組み合わせた場合など、リセットのタイミングを揃える必要がある場合に必要になります。
その他
本誌、コネクタ・ピン配置 CN1-20のGPIO P20 は P90では??
CN1~3への引き出しについて、GPIOのまとまりが若干悪いように思います。
8ビット纏まって使えそうなポートは P7、PB、で P1、PC等は使い勝手が悪そう。
FM3自体のピン配置自体の制約を受けるので仕方が無いように思います。
万人受けのよい配置は至難の業と言うことでしょう。
過去の付属SH2A基板のように、使い慣れるほど、使い勝手のよい基板になることを期待。
2012年3月13日火曜日
GNU GCC 開発環境整備 再び (for ARM Cortex-M3)
CQ出版 Interface誌 恒例の付属基板 本年(2012年)は 富士通「FM3マイコン」のようです。このマイコンはARM Cortex-M3マイコンで、今は亡きDesign Wave誌 2008年5月号付属の基板CQ-STARMと同じコアです。
そこでほぼ4年前の基板CQ-STARMを引っ張り出し、電源ON、するとその当時組んだプログラムが動きだしました。「お久しぶり」といった感じでした。
この基板に搭載されたMCUはSTM32F103で
動作クロック72MHz、RAM 20KB、フラッシュROM 128KB
本年の「FM3マイコン基板」に搭載されるMCUはMB9BF618T(予定)で、
動作クロック144MHz、RAM 128KB、フラッシュROM 1MB
かなりのスペックです。 今年は本腰を入れていろいろ遊びたいと思います。
さて、STM32基板ですが、若干物足りないスペック、開発環境はIARのWorkbench(使用制限)、追加部品の水晶発振子の入手性 等で、その当時、動作確認程度の開発にとどめていました。
そのような扱いのSTM32基板、稼働したプログラムのプログラムソースをビルドすると、案の定、ビルドエラーが発生しました。他のARM基板(LPC2388、LM3S8962)での開発でGNU GCCの開発環境(GCC ver.3.4. => ver.4.3 )を組み直したのが原因だと思われます。
今年のFM3基板の準備として、GNU GCCの開発環境の組み直しを行いました。
1.GNU GCC 開発環境について
◎GCCは、ARM対応版を整備する。
ARM7TDMI、Cortex-M3、、、、各MCUコア共通
◎コードセットはThumb
GNU GCC はThumb-2に非対応 GCC Vre4.6.3のインストールで Thumb-2のコードセットがインストールされることを秘かに期待していたのですが残念、、、、Thumb-2は2003年の発表で、そろそろGNU GCCでThumb-2の対応があっても良いのではと思います。
Interface編集部、ARM社、富士通、、、、どこでも良いから、GNU GCCのThumb-2対応版をリリースしてほしいものです。
◎FPU (Floating Poing Unit; 浮動小数点演算ユニット)無しで整備する。
GNU GCCでビルドすると。「…m-elf/4.6.3/thumb/lib**.a(_******.o) uses hardware FP, whereas main uses software FP」のビルドエラー発生 安直にコンパイルオプション -mhard-float を付加、これはCortex-M3ではNG。
そこで、binutils、gcc、newlibでconfigureオプション --with-float=soft を指定して再インストールしました。
2.GNU GCC(Vre4.6.3) 開発環境整備 手順
1)Cygwinのインストール
gccに加え、binutils、(libiconv)等のパッケージをインストールする。
※出来るだけGNU GCCの開発環境(Cygwin上で動くソフトウエアを開発する環境)を整えてしまう。
2)gccビルド準備( 1)の補足 )
gccビルド用に以下のパッケージをインストールする。
①gmpのインストール
②mpfrのインストール
③mpcのインストール
④libiconvのインストール
※今回はCygwinのインストールでは組み込まず、ここでインストール
3)gccビルド
ここでビルドするgccは、Cygwin上で稼働し、ARM MCUで動くソフトウエアを出力する。
①binutilsのインストール
binutils ver.2.22ではインストール失敗(初回)、ver.2.21.1で成功
一旦GNU GCCをインストール後再度 ver.2.22をインストールで成功
②gccのインストール
③newlibのインストール
newlib ver.1.20.0ではインストール失敗(初回)、ver.1.18.0で成功
その後、ver.1.19.0をインストール 成功
その後、ver.1.20.0をインストール 成功
③gccのインストール
configureでオプション --with-newlib を追加して再インストール
メモ
※configureオプション --with-float=
--with-float=soft 浮動小数点演算をライブラリを使って実行
--with-float=hard 浮動小数点演算をFPUを使って実行
※Cortex-M3では Thumb の一部の命令がサポートされていない。コンパイル オプション -mcpu=cortex-m3 指定がこの問題に対応してくれると良いのですが。後々手こずることになりそうです。
そこでほぼ4年前の基板CQ-STARMを引っ張り出し、電源ON、するとその当時組んだプログラムが動きだしました。「お久しぶり」といった感じでした。
この基板に搭載されたMCUはSTM32F103で
動作クロック72MHz、RAM 20KB、フラッシュROM 128KB
本年の「FM3マイコン基板」に搭載されるMCUはMB9BF618T(予定)で、
動作クロック144MHz、RAM 128KB、フラッシュROM 1MB
かなりのスペックです。 今年は本腰を入れていろいろ遊びたいと思います。
さて、STM32基板ですが、若干物足りないスペック、開発環境はIARのWorkbench(使用制限)、追加部品の水晶発振子の入手性 等で、その当時、動作確認程度の開発にとどめていました。
そのような扱いのSTM32基板、稼働したプログラムのプログラムソースをビルドすると、案の定、ビルドエラーが発生しました。他のARM基板(LPC2388、LM3S8962)での開発でGNU GCCの開発環境(GCC ver.3.4. => ver.4.3 )を組み直したのが原因だと思われます。
今年のFM3基板の準備として、GNU GCCの開発環境の組み直しを行いました。
1.GNU GCC 開発環境について
◎GCCは、ARM対応版を整備する。
ARM7TDMI、Cortex-M3、、、、各MCUコア共通
◎コードセットはThumb
GNU GCC はThumb-2に非対応 GCC Vre4.6.3のインストールで Thumb-2のコードセットがインストールされることを秘かに期待していたのですが残念、、、、Thumb-2は2003年の発表で、そろそろGNU GCCでThumb-2の対応があっても良いのではと思います。
Interface編集部、ARM社、富士通、、、、どこでも良いから、GNU GCCのThumb-2対応版をリリースしてほしいものです。
◎FPU (Floating Poing Unit; 浮動小数点演算ユニット)無しで整備する。
GNU GCCでビルドすると。「…m-elf/4.6.3/thumb/lib**.a(_******.o) uses hardware FP, whereas main uses software FP」のビルドエラー発生 安直にコンパイルオプション -mhard-float を付加、これはCortex-M3ではNG。
そこで、binutils、gcc、newlibでconfigureオプション --with-float=soft を指定して再インストールしました。
2.GNU GCC(Vre4.6.3) 開発環境整備 手順
1)Cygwinのインストール
gccに加え、binutils、(libiconv)等のパッケージをインストールする。
※出来るだけGNU GCCの開発環境(Cygwin上で動くソフトウエアを開発する環境)を整えてしまう。
2)gccビルド準備( 1)の補足 )
gccビルド用に以下のパッケージをインストールする。
①gmpのインストール
②mpfrのインストール
③mpcのインストール
④libiconvのインストール
※今回はCygwinのインストールでは組み込まず、ここでインストール
3)gccビルド
ここでビルドするgccは、Cygwin上で稼働し、ARM MCUで動くソフトウエアを出力する。
①binutilsのインストール
binutils ver.2.22ではインストール失敗(初回)、ver.2.21.1で成功
一旦GNU GCCをインストール後再度 ver.2.22をインストールで成功
②gccのインストール
③newlibのインストール
newlib ver.1.20.0ではインストール失敗(初回)、ver.1.18.0で成功
その後、ver.1.19.0をインストール 成功
その後、ver.1.20.0をインストール 成功
③gccのインストール
configureでオプション --with-newlib を追加して再インストール
※ST32F103 LCD出力プログラム
メモ
※configureオプション --with-float=
--with-float=soft 浮動小数点演算をライブラリを使って実行
--with-float=hard 浮動小数点演算をFPUを使って実行
※Cortex-M3では Thumb の一部の命令がサポートされていない。コンパイル オプション -mcpu=cortex-m3 指定がこの問題に対応してくれると良いのですが。後々手こずることになりそうです。
2012年3月3日土曜日
MSP430 温度計
Texas Instruments MSP430 を使って温度計を作成しました。
LaunchPadで実装されているデモプログラムに手を入ただけのものですが、結構よい暇潰しになりました。
1年前は、デモプログラムの通信機能を中心に色々試してみましたが、今回はADCについて機能を検証しました。
1.ADC10コンフィグレーション
1)入力レンジの設定
・GND~Vcc 0V~3.3V
・GND~Vref 0V~(1.5V or 2.5V) ※デモプログラム設定
・その他
2)チャネル 選択
・A0~A7
・Temperature Sensor ※デモプログラム設定
3)参照電圧(Vref)選択 Reference-generator voltage
・1.5V ※デフォルト
・2.5V
4)参照電圧生成 Reference-generator
5)サンプリング周期設定 Sample and hold time
64xADC10CLKs
6)割り込み許可 Interrupt enable
7)ADC ON
2.ADC分解能
ADC分解能 = 1500mv ÷ 1024(10bit) = 1.4648mv/div
3.温度計算(内蔵温度センサ)
MSP430G2x52に内蔵された温度センサを利用した温度計
(ADC10 チャネル選択で温度センサ指定)
・温度センサ仕様 3.55mV/℃
ADC値(1単位)あたりの温度= 1.4648mv/div ÷ 3.55mV/℃ = 0.41263℃
0℃でのADC値 = 673
計測温度 = (ADC値 - 673) × 0.41263
4.温度計算(外装温度センサ LM61BIZ)
ADC10のチャネル A0に 温度センサを繋げた温度計
・温度センサ仕様 0℃での出力電圧 600mV、 10mV/℃
ADC値(1単位)あたりの温度. = 0.14648 ℃/div.
0℃でのADC値 = 600mV÷1.46484375mv/div = 409.6
計測温度(℃)=(ADC10の出力値 - 409.6)×0.14648
5.その他
ADCの出力値はサンプリング毎に結構ぶれるので、サンプルプログラムでは8回のサンプリングの移動平均をとり、この値から温度計算を行っています。
今回の温度表示は、MSP430内蔵温度センサと外装温度センサでは、最大で1.5℃のずれがありました。また、部屋にあった寒暖計とも2~5℃ずれていました。
LaunchPadで実装されているデモプログラムに手を入ただけのものですが、結構よい暇潰しになりました。
1年前は、デモプログラムの通信機能を中心に色々試してみましたが、今回はADCについて機能を検証しました。
1.ADC10コンフィグレーション
1)入力レンジの設定
・GND~Vcc 0V~3.3V
・GND~Vref 0V~(1.5V or 2.5V) ※デモプログラム設定
・その他
2)チャネル 選択
・A0~A7
・Temperature Sensor ※デモプログラム設定
3)参照電圧(Vref)選択 Reference-generator voltage
・1.5V ※デフォルト
・2.5V
4)参照電圧生成 Reference-generator
5)サンプリング周期設定 Sample and hold time
64xADC10CLKs
6)割り込み許可 Interrupt enable
7)ADC ON
2.ADC分解能
ADC分解能 = 1500mv ÷ 1024(10bit) = 1.4648mv/div
3.温度計算(内蔵温度センサ)
MSP430G2x52に内蔵された温度センサを利用した温度計
(ADC10 チャネル選択で温度センサ指定)
・温度センサ仕様 3.55mV/℃
ADC値(1単位)あたりの温度= 1.4648mv/div ÷ 3.55mV/℃ = 0.41263℃
0℃でのADC値 = 673
計測温度 = (ADC値 - 673) × 0.41263
4.温度計算(外装温度センサ LM61BIZ)
ADC10のチャネル A0に 温度センサを繋げた温度計
・温度センサ仕様 0℃での出力電圧 600mV、 10mV/℃
ADC値(1単位)あたりの温度. = 0.14648 ℃/div.
0℃でのADC値 = 600mV÷1.46484375mv/div = 409.6
計測温度(℃)=(ADC10の出力値 - 409.6)×0.14648
5.その他
ADCの出力値はサンプリング毎に結構ぶれるので、サンプルプログラムでは8回のサンプリングの移動平均をとり、この値から温度計算を行っています。
今回の温度表示は、MSP430内蔵温度センサと外装温度センサでは、最大で1.5℃のずれがありました。また、部屋にあった寒暖計とも2~5℃ずれていました。
2011年3月21日月曜日
MSP430 LaunchPad デモプロジェクト(温度センサー)の検証 その2

1.解析
Processingソース:LaunchPad_Temp_GUI.pdeより
1)シリアル通信の仕様
①Baud Rateは 2400
②LaunchPad => PC 1バイト アスキーコード送信
”A”:65°”B”:66° :華氏の温度表示
ちょっと修正(デモプロジェクト改修 その1)
・Processing(GUI)ソースの修正
dataRead = (dataRead-32)*5/9; 華氏=>摂氏変換コード追加
2)シリアル通信の構成
タイマ割り込み、タイマ出力を使い1ビットづつの送信を実現しているようです。
①システムクロック設定
・ベースクロック(DCO):1MHz 1048576Hz 訂正(3/26) => 1,000,000Hz
・サブシステムマスタクロック(SMCLK) : ベースクロック1/8 : 128KHz 131072Hz
訂正(3/26) =>125KHz 125,000Hz
②タイマカウンタ
・クロックにSMCLK選択
・タイマカウンタCompare設定値(TACCR0)に13*4を設定
1/131072*13*4 = 0.0003967285 ・・・ タイマ周期 0.3967285mS ==> 2520bps ≒2400bps
訂正(3/26) => 1/125000*13*4 = 0.000416 ・・・ タイマ周期 0.416mS ==> 2403.846bps ≒2400bps
(2400bpsとの誤差5%は少々気になります。20ビット送信で1ビットのずれが発生。)
訂正(3/26) => 2400bpsとの誤差0.16%は、624ビットで1ビットのずれ。30バイト程度の文字列の送受信は問題ないと思います。
ちょっと修正(デモプロジェクト改修 その2)
・CCSプロジェクトの修正
データ送信用のバッファを設け、そのデータを1バイトづつ、スタートビット、ストップビットを付加して送信
温度センサに関する機能は削除
2.課題
①現状でなんとかMSP430からPCへのデータ送信(TX)は実現できました。あとは、PCからMSPへのコマンドの送信(RX)の実現を考慮中です。
②現在、デジキーに発注したMSP430G2452IN20(20ピン)の到着を待っています。たしか、リードタイムは3/31だったような記憶があるのですが、現在、未定となってしまいました。到着しだい、LCD(キャラクタ)の表示に挑戦してみたいと思います。
MSP430はとにかく使い勝手が良いのが魅力です。
(ユニバーサル基板上に、3端子レギュレータを使った電源回路+MSP430+その他電子パーツで自作のマイコン基板が手軽に組めてしまいます。)
MSP430の能力をフルに使った場合、どこまでプログラムが組めるのか。その限界を試してみたいと思います。
そろそろ、インターフェース誌の付属基板が発売されます。今度はRXマイコンで、昨年のSHマイコン程の期待は無いものの、使い勝手が良いものであってほしいと思います。今年は、TIのMSP430と並行していじっていきたいと思います。
2011年3月3日木曜日
MSP430 LaunchPad デモプロジェクト(温度センサー)の検証 その1

TIが提供している MSP430 LaunchPad のデモプロジェクトについて、最初単にLEDの点滅のみの簡単なデモプロジェクトと思っていました。しかし、Webサイトや、展示会等でこのデモプロジェクトが温度センサで結構機能豊富なものであることがわかりました。
そこで、このデモプロジェクトに興味を持ち検証を行います。まず、以下に動作検証までを記します。
1.デモプロジェクトのダウンロード
MSP430 LaunchPad のWebサイト(http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_%28MSP-EXP430G2%29_JP)からデモプロジェクトのファイル(slac435.zip)をダウンロードし解凍する。
2.デモプロジェクト開発
1)CCSワークスペースフォルダを作成する。
2)slac435.zipを解凍して得られる フォルダMSP-EXP430G2-Launchpadを1)のフォルダに移動する。
3)CCSを起動し 1)のフォルダを指定する。
・Welcomeウインドを閉じる。
4)デモプロジェクトを取り込む。
・Flie/Import => Import ダイアログボックス
①Selectで Import typeは General/Existing Project into Workspase を選択
②Imort Projectで Select root directory に フォルダMSP-EXP430G2-Launchpadを指定
5)デモプロジェクトのビルドを試す。
・Project/Build Active Project を実行 =>成功
6)MSP430にデモプログラムを書き込む。
・Target/Debug Active Project を実行 =>成功
・Target/Runを実行 => LaunchPadのLED1、LED2の交互点滅が始まる。
3.デモプログラムの動作
1)LaunchPadの SW1(S1)を押すと、LED1,LED2の点滅がとまる。(消灯)
2)LaunchPadの SW1(S1)を数度押すと、LED1がうす暗く点滅する。
3)PCターミナルでLaunchPadにシリアル接続する。シリアル接続の設定はデフォルト
シリアル接続 ”COM4:MSP Application UART(COM4)”
・MSP430 起動時/リセット時、PCターミナルは沈黙
・SW1(S1)を押すと、PCターミナルは文字化けを起こしながらカーソルが進む。
一応の動作は確認できました。
4.Processingのインストール
※Processing:GUIに特化したプログラミング言語
1)ProcessingのWebサイト(http://processing.org/)より processing-1.2.1.zip をダウンロードし、解凍する。
Download Processing / ↓Windows
2)解凍したファイル Processing.exe で Processingが起動する。
5.GUI source filesのダウンロード
1) MSP430 LaunchPad のWebサイト(英文)で GUI source files (LaunchPad_Temp_GUI.zip)をダウンロードし、解凍する。
・LaunchPad はPCに接続、LED1,LED2が交互点滅した状態
2)解凍したファイル LaunchPad_Temp_GUI.pde を Processingで開き、RUN。
・Processing表示 Please,select the COM port that your LaunchPad is connected to,
[0] COM4
3)ProcessingでEnterキー入力、LauchPadのSW1(S1)を押すと Processingは温度表示を始める。
・Processing表示 Current Temperature: 63°
・MSP430を指で触って暖めると 温度表示の上昇が確認できました。また温度によるLED1,LED2の輝度の変化も確認できました。
2011年2月28日月曜日
TI MSP430開発メモ

昨日、ルネサス エレクトロニクスより、ルネサスRX62Nプロモーションボードプレゼントキャンペーン「落選」のメールが届きました。
恒例のCQ出版Interface誌付属基板の下調べ用に、密かに期待していたのですが、残念な結果になりました。
さて、気を取り直して
同誌5月号の発売までの暇つぶしとして しばらくの間 昨年購入した、テキサス・インスツルメンツ MSP430 LaunchPad および、MSP430の使い勝手を試してみたいと思います。
まず、
以下に、開発環境の整備について書き留めます。
1.MSP430 LaunchPad バリュー・ライン開発キット
・MSP430 LaunchPad開発ボード本体
・MSP430(Flush 2K RAM 128B MSP430G2231:ADC,SPI,I2C、MSP430G2211:-,-,-)
・10 ピン コネクタ(オス x 2、メス x 2)
・水晶発振子 32.768kHz ・・・ 他
2.ソフトウェア・デバッガとコンパイラをダウンロード
1)My.TI アカウント登録
・TEXAS INSTRUMENTS ホームページ => my.TIログイン => 新規登録
2)Quick Start Guide記載の http://www.ti.com/launchpadwikiにアクセス
(日本語サイトへ移動 「MSP430 LaunchPad (MSP-EXP430G2) JP」)
3)Code Composer Studio (CCS)を ダウンロード
・Code Composer Studio (CCS)」 今すぐダウンロード (TI へのログインが必要)」をクリック
・U.S. Government export approval(米国輸出承認)ページでプロフィールを入力
(Webサイトは N/A を入力 以前はブログのURLを入力)
=>「I CERTIFY ALL THE ABOVE IS TRUE:」で Yes 選択 「Submit」ボタンをクリック
・TI Softwareページ 「Download」ボタンをクリック
・メール「TI SOFTWARE DOWNLOAD: APPROVED - setup_CCS_MC_Core.zip」が届く
・同メールのリンクをクリック=>setup_CCS_MC_Core.zipをダウンロード(保存)
・setup_CCS_MC_Core.zipを解凍する。
・解凍されたファイルのうち setup_CCS_MC_Core_4.2.1.00004を起動
4)Code Composer Studio (CCS)をセットアップ
・Choose Installation Locationはデフォルトのまま
・Product Configurationで MSP430-only Core Toolsを選択
5)Code Composer Studio (CCS)を起動
・すべてのプログラム/Texas Instruments/Code Composer Studio v4 Core Editionで起動確認
2.サンプルコードの入手
・Code Composer Studio (CCS)のダウンロードを開始したWebサイト 「MSP430 LaunchPad (MSP-EXP430G2) JP」の MSP430G2xx サンプル・コードを全てダウンロード クリック
・ファイル slac080i.zipをダウンロード、解凍
3.MSP430ワークスペース、プロジェクトの作成
1)ワークスペースの作成
・Code Composer Studio (CCS) 起動後のWorkspace Launcher で 「Browse...」をクリック
・Select Workspace Directoryで ワークスペースを置くディレクトリを選び 「新しいフォルダの作成」でワークスペースを作成する。
※ワークスペースの新規作成時に、Welcome to Code Composer Studio v4 ウインドウが表示される。
[Getting Start][Examples][What's New & Updates][Device Information]の画面展開がある。
2)プロジェクトの作成 MSP430G2231用
・File/New/CCS Project =>[New CCS Project]が表示
・CCS Project でプロジェクト名を入力する。
・Select a type of project で MSP430を選択(今回はそのまま)
・Project Setting で
Device Variant: MSP430Gxxx Family MSP430G2231
・Project Templates で Empty Projectを選び 「Finish」ボタンをクリック
3)プログラムソースの追加
・プロジェクトを選択した状態で右クリック New/Source File で ソースファイルを作成する。ファイル名は main.c にしました。
・main.cをにプログラムをコーディングする。
4)プロジェクトのビルド
・Project / Build Active Project
4.MSP430への書き込み
・Target / Debug Active Projectで書き込む
・Target / Load Program... で書き込む の2つの手法で書き込める。
Debug/プロジェクト名.out Release/プロジェクト名.outを指定
※Debug中 Load Program は失敗する。Target / Resetを実行する必要がある。
※Debug、Releaseの切り替えは Project / Active Build Configration で行う。
※Targetのプルダウンメニューに Load Program.. の表示がない場合がある。一旦 Debug Active Project を行うと、メニューに Load Programが復帰表示される。
(Releaseでビルドしたのに、Debug Active Project を行うことには若干の矛盾を感じます。)
5.MSP430搭載ボードの作成
LaunchPad開発ボードで書き込んだMSP430を動作させるために、ユニバーサル基板に3端子レギュレーターを使用した電源回路、表示用に3LED、操作用に3タクトスイッチを搭載した、簡単なボードを作成しました。
このボード用テストプログラムとして、スイッチや、タイマの割り込みでカウンタのカウントUPをし、その値を3つのLED で表現するプログラムを作成しました。
最近 MSP430G2xxバリュー・シリーズに新たに20ピンのMCUが加わりました。早速 MSP430G2452(20PDIP) をDigiKeyで発注しましたが現在在庫なしで納期未定です。届き次第、「Hello World」のキャラクタLCD表示に挑戦したいと思います。
2010年12月3日金曜日
ET2010散歩

今年も12/1から開かれた、パシフィコ横浜で開かれている。Embedded Technology 2010に行ってきました。
過去のETでは、より高性能なマイコンに興味が向かっていたのですが、最近、8ビット、16ビットの小さなマイコン(SHやARMなどに比べ)を使っているせいか、自然とローエンドのマイコンが目に留まりました。
以下に訪れたブースの内容を記します。
◎アーム
◎STマイクロエレクトロニクス
STM8Lの説明を受けた。さらに「STM8L-Discovery」をいただきました。
◎富士通セミコンダクター
◎横川ディジタルコンピュータ
昨年の横川ブースとは一変、計測器の展示は無かった。
◎アジレントテクノロジー
ローエンドのオシロスコープを見る。多彩な機能を見る。
◎インテル
・・・・
◎NEC
・年齢判断システムで、若干老けて判定され、少々ガックリ。。。10歳区切りで判定されるので、49歳の私が50~59歳と判定されると。。。
・C言語によるFPGAの開発環境が紹介
◎マイクロソフト
ほかの多くのブースで、.NET Micro Framework による開発が扱われていました。マイクロソフトのブースでこのことにあまりふれられていないようでした。
◎NXPセミコンダクター
今回、最も興味を覚えたブースです。開発環境「mbed」のデモは特にクラウド利用の、組込み開発の新しい形を提案しているようです。
Internet Explorerで mbed のWebサイトにアクセスし、提供されるアプレットでコンパイル・リンクを行い。作成されたバイナリファイルをダウンロードし。
このファイルをPCでUSBメモリと認識される「mbed NXP LPC1768」等に移すだけで、プログラムの書き込みが出来てしまいます。
PC側に開発環境を整える必要がなく。開発環境のアップデート等のメンテナンスも不要です。
サンプルプログラムにはHTTPサーバーやTwitterに直接書き込むプログラムもあり、NXPのサポートも充実しているようです。
・開発のプログラムソース群はmbedで保有されます。
(ローカルでプログラムソースを管理しようとすると、結構面倒なことになりそうです。)
・常に現行バージョンのコンパイラ・リンカーでバイナリ(プログラム)が作成されます。
(コンパイラのバージョンアップ等で、プログラムソースのビルドが通らなくなる可能性があるのでは。。)
◎ザイリンクス
RCカー(?)搭載の4方向カメラの画像で上空からの映像を合成して、駐車場の枠を表示したデモが行われていました。
PALTEKブースで同社のWebサイトで技術資料が公開されていて、FPGAの開発に役立つとのこと、私のような個人でも利用できるそうです。
◎タタ・エレクシー・リミッテッド
エンジニアリングの一般論を語り合いました。インド企業の自信を感じさせられました。
◎東芝
車載用のマイコンCoretex-M3、通常のタイマとはべつに独立したPWMのユニットが用意されている、車載用に特化されたマイコンを実感。
◎THOHOKUものづくりコリドー
◎日本アルテラ
20数年運用されている、MS-DOSやCPM上に構築されたシステムの維持に、FPGAで代替機のハードウエアを組み上げる事例が紹介されていました。
今までこのようなケースは、PC上に Virtual Machine を組み上げ対応するものと思っていました。この際問題になるのは周辺機器とのIFが実現できないことですが。
FPGAを使えばこれらのIFも実現できそうです。
◎日本テキサス・インスツルメンツ
今回 MSP430 Value Line LaunchPad Dev. を目当てにブースを訪れました。そこでいくつかの質問をしました。
・同包の注意書きの 電波法による使用制限について。
==>単なるミスプリント、RFデバイス製品の注意書きと混同したそうで 今後この注意書きはなくなるそうです。
・Value Line以外のMSP430の対応は?
==>JTAG系のピンアサインを変えて配線すれば使用可能
==>LaunchPadのJTAGによるプログラミングはSpy-Bi-Wireという二線式を使っているそうです。
Spy-Bi-Wireは SBWTCK(TEST)というクロック信号とSBWTDIO(RST)というInput/Output信号で構成
したがって、MSP430のうちLaunchPadでプログラムの書き込みが出来るのは MSP430G2xx バリューシリーズ と MSP430F5xx シリーズに限られそうです。
・デモプログラム(温度表示)について。
PCとのシリアル通信はどのように行っているのか質問したが、いまひとつ理解できなかった。
LaunchPad では MSP430G2231 の P1.1にTXD P1.2にRXDが割り当てられているように思うが、MSP430G2231にはUARTの機能が無いはず、なぜ、プログラムダウンロード用やシリアル通信用に P1.1、P1.2がつかわれているのか不明。
==>プログラムのダウンロードにはTXD、RXDは使われていないとのこと(前述のSpy-Bi-Wire方式)
==>デモプログラムはソフトUARTを使ってP1.1をTXD P1.2をRXDして使用してPCとのシリアル通信を実現しているそうです。
◎パナソニック
3Dの展示がありました。
◎ルネサスエレクトロニクス
NECエレクトロニクスとの経営統合で期待していたのですが、肩透かしを食った感がありました。例年楽しみしていた78Kのミニ実習コーナーが無く少々がっかり。

NXPセミコンダクターブースのmbedのデモで、キューブ(立方体)状にLEDを組み上げ、多彩な表現を実現したものがありました。思わず見入ってしまいました。
自分なりに考えると、XYZ毎に4本のIOを割り当て(汎用ポートの12ビットを使用)、各LEDはXYZ該当ビットのANDをとり点滅させているのでしょうか。
私が作るとすると大量のロジックICを使うか、FPGAを使うか結構大掛かりなものになってしまいそうです。
2010年8月1日日曜日
付属SH-2A基板 SD/MMCカード対応ブート・ローダを試す。(その2)

CQ出版Interface誌付属SH-2A基板「SD/MMCカード対応ブート・ローダ」がようやく実現できました。
弊ブログで以前に述べたように、I誌の「SD/MMCカード対応ブート・ローダ」で使われるSDメモリカード端子の一部(CS,WP,CD)を変更しました。
最初、今回のブートローダーは、SH7262の起動時に直ちに実行されるローダープログラムとして扱われものと思いシリアルフラッシュROMの先頭に書き込みました。試行錯誤のたび、本来のローダープログラムとHEWモニタプログラムの復旧を繰り返しました。これが結構な手間で、このブートローダーの実現がほど遠い困難なものと思えました。
I誌9月号で今回のブートローダーは単に1ユーザープログラムにすぎず、SDカード上のプログラムを従来のローダープログラムと同様な機能で起動させることを知りました。
そこで、「SDカード対応ブート・ローダ」をユーザープログラムとしてシリアルフラッシュROMに書き込み試したのですが、以前沈黙したままでした。
今回のブートローダー用に作成したドータボード(SDメモリカード(SPI0)用)の検証するため、同プログラムソースをテスト(デバッグ)プログラムに流用し、SDメモリカード関連の動作を確認しました。
その際、起こった不具合は、割り込み CMT、関数 memcpy の動作でした。この対処に代替関数を考えたのですが、その前に、「SDカード対応ブート・ローダ」を試しました。
すると、付属SH-2A基板上のLEDが点滅しているではありませんか。そこで、SDメモリーカードに以前 シリアルフラッシュROMの書き込み用に作成したプログラムをapp.binにリネームし書き込みました。
このSDメモリカードをコネクタにセットすると、書き込まれたプログラムが起動しました。
今回は、「SDカード対応ブート・ローダ」HEW版で行いました。なぜ、今まで稼動しなかったのか、なぜ今稼動しているのか、不明。
稼動していないときは、CMT割り込みや、関数memcpyが不調であったと考えられます。HEWに遊ばれてしまった感があります。
※SDメモリカードに書き込むプログラムapp.binは、シリアルフラッシュROMに書き込むプログラムと同じ。

今回のハードウエア構成は、本体(LCD等搭載)+ シリアル通信ドータボード +SDメモリカードドータボード(SPI0)です。
シリアル通信ドータボードは、デバッグ用に準備しました。ほかのドータボードが追加搭載出来ます。
SDメモリカードドータボードは、2つのシリアルフラッシュROMをSPI0、SPI1にそれぞれ接続し、ローダープログラムとHEWモニタプログラムの復旧に備えました。またSDメモリカードコネクタはSPI0に併設しました。
以前作成した SDメモリカードドータボードは、SDメモリカードコネクタをシリアルフラッシュROMとの競合をさけて、SPI1に接続しました。最初「SDカード対応ブート・ローダ」はSPI0でなくてはならないと思い、今回のSDメモリカードドータボード(SPI0)を作成したのですが、今思えば、以前のSDメモリカードドータボード(SPI1)でも可能でした。
*****************************************
関連動画(YouTube)
http://www.youtube.com/watch?v=2EyEyyvyArw
*****************************************
2010年7月21日水曜日
付属SH-2A基板 SD/MMCカード対応ブート・ローダを試す。(その1:失敗の顛末)
SQ出版 Interface誌 Webサイト「付属SH-2A基板特設ページ」で SD/MMCカード対応ブート・ローダが先行公開されました。
私、安直に、「これは、良い、今まで、外付けシリアルフラッシュで64(32)KByteオーバープログラムに対応していたのが、SDカードで置き換えられる。」と思い、早速試してみました。
結論から言えば、現時点でまだ、この素晴らしい、ブート方式の検証は出来ていません。失敗事例とし今回、投稿します。ご容赦願います。
[概要]
1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造ポイント
1)SDカードの端子変更
CS: PG20(33)=> PG16(24)
WP: PJ3(32) => PC6(27)
CD: PJ1(31) => PC7(28)
2)ff_loader.binの(ブート・ローダー)の扱い
外付けシリアルフラッシュROMの先頭(0x00000000)に書き込む。
=>外付けシリアルフラッシュROMの32KB以降(0x00008000)に書き込む。(訂正7/25)
2.稼動させたい、プログラム。
過去に、シリアルフラッシュROMに書き込んだプログラム。「付属SH-2A基板 2Chオシロスコープ(弊ブログ)」を、PCでSDカードに、”app.bin”というファイル名で書き込む。
3.試行
失敗
4.試行後
既存のブート・ローダーおよびHEWモニターが潰れたため、付属基盤は不能に。
5.リカバリー
「SH-2A基板用HEWモニタプログラムを外付けシリアル・フラッシュROMに書き込む。(弊ブログ)」で、元のブート・ローダーおよびHEWモニターを書き込み、復旧。
以降、今回の失敗の詳細を述べます。
1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造
1)SDカードの端子変更
①CS端子
CN3 33はSPI Ch1のMISOで使いたいので、CN3 24 (PG16)に変更
・ソース:mmc.c のCS制御を
#define CS_LOW() PORT.PGDR1.BIT.PG16DR = 0 /* MMC CS = L */
#define CS_HIGH() PORT.PGDR1.BIT.PG16DR = 1 /* MMC CS = H */
に変更。
・ソース:mmc.c のpower_on()内のCS 設定を
PORT.PGIOR1.WORD |= 0x0001; PORT.PGCR4.WORD &= 0xFFF0; /* MMC_CS */
に変更。(7/23追記)
②WP端子、CD端子
CN3 31,32は、LCD(モノクログラフィック)で使用のため、CN3 27,28 (PC6,PC7)に変更
・ソース:mmc.c のWP,CDのGPIOポート設定を
#define SOCKPORT PORT.PCPR0.WORD /* ソケット状態入力(PC) */
#define SOCKWP 0x0040 /* ライトプロテクト接点 (PC6) */
#define SOCKINS 0x0080 /* カード検出接点 (PC7) */
に変更
・ソース:mmc.c のpower_on()内のWP/CD 設定を
if (_USE_CD) {PORT.PCIOR0.WORD &= 0xFF7F; PORT.PCCR0.WORD &= 0x0FFF;} /* MMC_CD */
if (_USE_WP) {PORT.PCIOR0.WORD &= 0xFFBF; PORT.PCCR0.WORD &= 0xF0FF;} /* MMC_WP */
に変更。(7/23追記)
2)ff_loader.binの(ブート・ローダー)の扱い
現在、シリアルフラッシュROM(SPI Ch0)に、プログラムを書き込むプログラムを改造し、シリアルフラッシュROMの先頭(0x00000000)にブート・ローダーのみを書き込みプログラムを作成し、改造後の”ff_loader.bin”を書き込みました。
=>このブート・ローダーは、ユーザープログラムとして扱うようです。ユーザー・プログラムがさらに、別のユーザープログラムをロードすることで、SDカード上のプログラムを実行するようです。したがって、プログラム書き込み位置は、従来のユーザープログラムと同じ、シリアルフラッシュROMの32KB(0x00008000)以降になります。(7/25追記)
3.試行~5.リカバリー 上記のとおり、
6.疑問点
SH7262のローダープログラムのサイズは8KBだった記憶があります。今回のブート・ローダーのプログラムサイズは12KB、少々疑問を持っています。=>この疑問無効(7/25追記)
※今回の失敗で、SDカードコネクタ周りの配線チェックを予定しています。チェックの方法として、以前試していた、SDカード関連のプログラムを元のSPI Ch0に戻し再度動作確認を行いたいと思います。
SDカードからのブートが実現できれば、結構快適に、付属SH-2A基板のプログラム開発が行えると期待してます。
7.状況
7/23 I誌7月号第3章 「メモリカードとFATファイル・システムの実装」のプログラムの動作を実現し、SPI Ch0によるSDカードコネクタ周りの回路構成(配線等)を確認しました。
7/25 I誌9月号を読みながら、GCC版、HEW版いずれも試すが、SDカードプログラムの稼動は確認出来ず。
私、安直に、「これは、良い、今まで、外付けシリアルフラッシュで64(32)KByteオーバープログラムに対応していたのが、SDカードで置き換えられる。」と思い、早速試してみました。
結論から言えば、現時点でまだ、この素晴らしい、ブート方式の検証は出来ていません。失敗事例とし今回、投稿します。ご容赦願います。
[概要]
1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造ポイント
1)SDカードの端子変更
CS: PG20(33)=> PG16(24)
WP: PJ3(32) => PC6(27)
CD: PJ1(31) => PC7(28)
2)ff_loader.binの(ブート・ローダー)の扱い
外付けシリアルフラッシュROMの先頭(0x00000000)に書き込む。
=>外付けシリアルフラッシュROMの32KB以降(0x00008000)に書き込む。(訂正7/25)
2.稼動させたい、プログラム。
過去に、シリアルフラッシュROMに書き込んだプログラム。「付属SH-2A基板 2Chオシロスコープ(弊ブログ)」を、PCでSDカードに、”app.bin”というファイル名で書き込む。
3.試行
失敗
4.試行後
既存のブート・ローダーおよびHEWモニターが潰れたため、付属基盤は不能に。
5.リカバリー
「SH-2A基板用HEWモニタプログラムを外付けシリアル・フラッシュROMに書き込む。(弊ブログ)」で、元のブート・ローダーおよびHEWモニターを書き込み、復旧。
以降、今回の失敗の詳細を述べます。
1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造
1)SDカードの端子変更
①CS端子
CN3 33はSPI Ch1のMISOで使いたいので、CN3 24 (PG16)に変更
・ソース:mmc.c のCS制御を
#define CS_LOW() PORT.PGDR1.BIT.PG16DR = 0 /* MMC CS = L */
#define CS_HIGH() PORT.PGDR1.BIT.PG16DR = 1 /* MMC CS = H */
に変更。
・ソース:mmc.c のpower_on()内のCS 設定を
PORT.PGIOR1.WORD |= 0x0001; PORT.PGCR4.WORD &= 0xFFF0; /* MMC_CS */
に変更。(7/23追記)
②WP端子、CD端子
CN3 31,32は、LCD(モノクログラフィック)で使用のため、CN3 27,28 (PC6,PC7)に変更
・ソース:mmc.c のWP,CDのGPIOポート設定を
#define SOCKPORT PORT.PCPR0.WORD /* ソケット状態入力(PC) */
#define SOCKWP 0x0040 /* ライトプロテクト接点 (PC6) */
#define SOCKINS 0x0080 /* カード検出接点 (PC7) */
に変更
・ソース:mmc.c のpower_on()内のWP/CD 設定を
if (_USE_CD) {PORT.PCIOR0.WORD &= 0xFF7F; PORT.PCCR0.WORD &= 0x0FFF;} /* MMC_CD */
if (_USE_WP) {PORT.PCIOR0.WORD &= 0xFFBF; PORT.PCCR0.WORD &= 0xF0FF;} /* MMC_WP */
に変更。(7/23追記)
2)ff_loader.binの(ブート・ローダー)の扱い
現在、シリアルフラッシュROM(SPI Ch0)に、プログラムを書き込むプログラムを改造し、シリアルフラッシュROMの先頭(0x00000000)にブート・ローダーのみを書き込みプログラムを作成し、改造後の”ff_loader.bin”を書き込みました。
=>このブート・ローダーは、ユーザープログラムとして扱うようです。ユーザー・プログラムがさらに、別のユーザープログラムをロードすることで、SDカード上のプログラムを実行するようです。したがって、プログラム書き込み位置は、従来のユーザープログラムと同じ、シリアルフラッシュROMの32KB(0x00008000)以降になります。(7/25追記)
3.試行~5.リカバリー 上記のとおり、
6.疑問点
SH7262のローダープログラムのサイズは8KBだった記憶があります。今回のブート・ローダーのプログラムサイズは12KB、少々疑問を持っています。=>この疑問無効(7/25追記)
※今回の失敗で、SDカードコネクタ周りの配線チェックを予定しています。チェックの方法として、以前試していた、SDカード関連のプログラムを元のSPI Ch0に戻し再度動作確認を行いたいと思います。
SDカードからのブートが実現できれば、結構快適に、付属SH-2A基板のプログラム開発が行えると期待してます。
7.状況
7/23 I誌7月号第3章 「メモリカードとFATファイル・システムの実装」のプログラムの動作を実現し、SPI Ch0によるSDカードコネクタ周りの回路構成(配線等)を確認しました。
7/25 I誌9月号を読みながら、GCC版、HEW版いずれも試すが、SDカードプログラムの稼動は確認出来ず。
2010年7月11日日曜日
SH-2A GNU GCC 4.5.0のインストール
CQ出版Interface誌付属SH-2A基盤にについて、色々と試行錯誤を繰り返してきました。
HEWのライセンス切れで256KByteの制限が課せられ、TFTカラー液晶表示でのフォント表示、ファイルシステム(FAT)を利用したプログラムの開発が頓挫してしまいました。
そこで、昨年同様GNU GCCでの開発に切り替えようと悪あがきを続けています。
過去に述べたように、Interface誌Webサイト(GCC 4.4.0)、KPIT Webサイト(GCC 4.5.0)から入手したGNU GCCの開発環境でなかなか思い通りの動作が得られず独自にGNU GCCの環境の構築に挑戦しました。
[概要]
○パッケージ
GCC 4.5.0
binutils 2.20.1(失敗)=> 2.19.1
gmp 5.0.1
mpfr 3.0.0
mpc 0.8.2(GCC4.5.0から必須パッケージ)
newlib 1.18.0
○インストール後の動作
現時点で、Interface、KPIT 提供のGCC環境でのビルドと同じ動作。
今まで発生したビルドエラーは、Makefileの記述ミスに起因したものでした。
○割り込み
SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考にすると割り込み動作が初めて確認できました。
※これ以降の記述は、Interface誌Webサイト等で公開されているGNU GCC開発環境を使えば不要です。当初 Makefile等の不備でGNU開発環境の構築を始めたのですが、結果的に不要な苦労をしたようです。(結構時間をとられてしまいました。)
1.インストール
1)Cygwin 1.7.5 のインストール
・Archive Unzip
・Devel すべてインストール
・Libs すべてインストール
今回GNUの一連のインストールでは ビルド時にプログラム”XXX”が無い、ライブラリ”libXXX”が無いといったビルドエラーが多発しました。手っ取り早く、CygwinのDevel、Libsのパッケージをすべてインストールすることでこの種のビルドエラーは回避できました。
2)binutilsのインストール
(1) 2.20.1では tc-arm.c のコンパイルエラー
(メモ)binutils-2.20-2.20.1-patch ファイルの適用
binutilsのインストール失敗に対応しようとし、パッチファイルを適用しようとしたが失敗。どうも、このパッチファイルは、binutils-2.20をbinutils-2.20.1にバージョンアップを行うものと思われる。
(パッチの当て方 binutils-2.20.tar.gz を展開したディレクトリで「patch -p0 -d . < binutils-2.20-2.20.1-patch」を実行 )
(2) 2.19.1をインストール
・mkdir build_binutils
・cd build_binutils
・../binutils-2.19.1/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
・make
・make check
・make install
(3)CygwinのDevelの binutils をアンインストール
3)gmp、mpfrのインストール 過去の記述を参照
4)mpcのインストール
・mkdir build_mpc
・cd build_mpc
・../mpc-0.8.2/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools
・make
・make check
・make install
5)GCCのインストール
・mkdir build_gcc
・cd build_gcc
・../gcc-4.5.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
・make
(メモ)Cygwinのbinutillsパッケージでmakeすると「cannot compute suffix of object files」のエラー ==> 2)のbinutilsインストールで成功
・make check
「autogen: Command not found」のエラー
(メモ)autogen-5.10.2を入手しインストールを試みると、Configureで「Cannot find libguile」のエラー発生(CygwinのLibsはインストールはデフォルト(このときはすべてではなかった)=> 1)Cygwinのインストールに反映)
・make install(make chekuエラーは無視)
6)newlibのインストール
・mkdir build_newlib
・cd build_newlib
・../newlib-1.18.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
・make
・make check
・make install
7)GCCのインストール その2
・cd build_gcc
・make all
・make install
※GNUの各パッケージのインストールは、ARM7TDMIとSH-2Aを並行して行いました。パッケージのビルドでtarget=arm-elf/target=sh-elfの差異がわからなかったので、各パッケージのインストール先はarm-tools/sh-toolsにしました。
また、各パッケージのインストール作業はビルドエラーを頻発しながら、繰り返しインストール作業を重ねました。
2.サンプルプログラム 動作確認
1)gccのサンプルプログラム
「第3章 メモリ・カードとFATファイル・システムの実装」の gcc用サンプル・プログラムを使用
2)サンプルプログラムのビルド
(1)asmfunc.sのエラー
SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考に修正する。
・asmfunc.sの修正
「メモリ・カード...」と「SD/MMCカード...」差異を調べSetImask()の後半に
.global _set_sp
_set_sp:
MOV R4, R15
RTS
NOP
を追加。
(「メモリ・カード...」のasmfunc.sではコンパイルエラーが発生。)
(2)main.cの修正
・割り込みハンドラー関数 Isr_CMI0() はLEDの点滅のみの動作に修正
・delay_ms()、SetCCR1(x)、IoInit()、 main ()以外の関数は削除
・main()は、
int main (void)
{
IoInit(); /* 内蔵周辺モジュールの初期化 */
/* 起動メッセージ */
delay_ms(10);
while(1) {}
}
に削り込みました。
(3)Makefileの修正
・TARGET = cmt0_test
・CSRC = main.c
ファイルシステム関連のソースファイルを削りました。
・LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.5.0/m2a
ライブラリ参照を m2 => m2a に変更
・CFLAGS = -Wall -g$(DEBUG) -m2a $(OPTIMIZE) $(DEFS)
コンパイルオプション -m2 => -m2aに変更
※m2では割り込みは動作せず、m2aに変更して、割り込み動作を確認できました。
(偶然、m2aにしたタイミングで、割り込みが機能しただけかも知れません。)
※今回構築したGNU GCCの開発環境ですが、ビルド時(make check)のエラーを無視しています。作成したプログラムの動作が確認出来た状況です。
感想として、GNU GCCの開発環境の構築は私にとって、かなり困難になってきたように思います。
GNUの各パッケージについて、リリース毎にインストール手順の説明があったらと思いました。(私が、その情報に辿り着けなかっただけかも知れません。)
※やはり、SHの開発はHEWを使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。
HEWのライセンス切れで256KByteの制限が課せられ、TFTカラー液晶表示でのフォント表示、ファイルシステム(FAT)を利用したプログラムの開発が頓挫してしまいました。
そこで、昨年同様GNU GCCでの開発に切り替えようと悪あがきを続けています。
過去に述べたように、Interface誌Webサイト(GCC 4.4.0)、KPIT Webサイト(GCC 4.5.0)から入手したGNU GCCの開発環境でなかなか思い通りの動作が得られず独自にGNU GCCの環境の構築に挑戦しました。
[概要]
○パッケージ
GCC 4.5.0
binutils 2.20.1(失敗)=> 2.19.1
gmp 5.0.1
mpfr 3.0.0
mpc 0.8.2(GCC4.5.0から必須パッケージ)
newlib 1.18.0
○インストール後の動作
現時点で、Interface、KPIT 提供のGCC環境でのビルドと同じ動作。
今まで発生したビルドエラーは、Makefileの記述ミスに起因したものでした。
○割り込み
SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考にすると割り込み動作が初めて確認できました。
※これ以降の記述は、Interface誌Webサイト等で公開されているGNU GCC開発環境を使えば不要です。当初 Makefile等の不備でGNU開発環境の構築を始めたのですが、結果的に不要な苦労をしたようです。(結構時間をとられてしまいました。)
1.インストール
1)Cygwin 1.7.5 のインストール
・Archive Unzip
・Devel すべてインストール
・Libs すべてインストール
今回GNUの一連のインストールでは ビルド時にプログラム”XXX”が無い、ライブラリ”libXXX”が無いといったビルドエラーが多発しました。手っ取り早く、CygwinのDevel、Libsのパッケージをすべてインストールすることでこの種のビルドエラーは回避できました。
2)binutilsのインストール
(1) 2.20.1では tc-arm.c のコンパイルエラー
(メモ)binutils-2.20-2.20.1-patch ファイルの適用
binutilsのインストール失敗に対応しようとし、パッチファイルを適用しようとしたが失敗。どうも、このパッチファイルは、binutils-2.20をbinutils-2.20.1にバージョンアップを行うものと思われる。
(パッチの当て方 binutils-2.20.tar.gz を展開したディレクトリで「patch -p0 -d . < binutils-2.20-2.20.1-patch」を実行 )
(2) 2.19.1をインストール
・mkdir build_binutils
・cd build_binutils
・../binutils-2.19.1/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
・make
・make check
・make install
(3)CygwinのDevelの binutils をアンインストール
3)gmp、mpfrのインストール 過去の記述を参照
4)mpcのインストール
・mkdir build_mpc
・cd build_mpc
・../mpc-0.8.2/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools
・make
・make check
・make install
5)GCCのインストール
・mkdir build_gcc
・cd build_gcc
・../gcc-4.5.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
・make
(メモ)Cygwinのbinutillsパッケージでmakeすると「cannot compute suffix of object files」のエラー ==> 2)のbinutilsインストールで成功
・make check
「autogen: Command not found」のエラー
(メモ)autogen-5.10.2を入手しインストールを試みると、Configureで「Cannot find libguile」のエラー発生(CygwinのLibsはインストールはデフォルト(このときはすべてではなかった)=> 1)Cygwinのインストールに反映)
・make install(make chekuエラーは無視)
6)newlibのインストール
・mkdir build_newlib
・cd build_newlib
・../newlib-1.18.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
・make
・make check
・make install
7)GCCのインストール その2
・cd build_gcc
・make all
・make install
※GNUの各パッケージのインストールは、ARM7TDMIとSH-2Aを並行して行いました。パッケージのビルドでtarget=arm-elf/target=sh-elfの差異がわからなかったので、各パッケージのインストール先はarm-tools/sh-toolsにしました。
また、各パッケージのインストール作業はビルドエラーを頻発しながら、繰り返しインストール作業を重ねました。
2.サンプルプログラム 動作確認
1)gccのサンプルプログラム
「第3章 メモリ・カードとFATファイル・システムの実装」の gcc用サンプル・プログラムを使用
2)サンプルプログラムのビルド
(1)asmfunc.sのエラー
SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考に修正する。
・asmfunc.sの修正
「メモリ・カード...」と「SD/MMCカード...」差異を調べSetImask()の後半に
.global _set_sp
_set_sp:
MOV R4, R15
RTS
NOP
を追加。
(「メモリ・カード...」のasmfunc.sではコンパイルエラーが発生。)
(2)main.cの修正
・割り込みハンドラー関数 Isr_CMI0() はLEDの点滅のみの動作に修正
・delay_ms()、SetCCR1(x)、IoInit()、 main ()以外の関数は削除
・main()は、
int main (void)
{
IoInit(); /* 内蔵周辺モジュールの初期化 */
/* 起動メッセージ */
delay_ms(10);
while(1) {}
}
に削り込みました。
(3)Makefileの修正
・TARGET = cmt0_test
・CSRC = main.c
ファイルシステム関連のソースファイルを削りました。
・LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.5.0/m2a
ライブラリ参照を m2 => m2a に変更
・CFLAGS = -Wall -g$(DEBUG) -m2a $(OPTIMIZE) $(DEFS)
コンパイルオプション -m2 => -m2aに変更
※m2では割り込みは動作せず、m2aに変更して、割り込み動作を確認できました。
(偶然、m2aにしたタイミングで、割り込みが機能しただけかも知れません。)
※今回構築したGNU GCCの開発環境ですが、ビルド時(make check)のエラーを無視しています。作成したプログラムの動作が確認出来た状況です。
感想として、GNU GCCの開発環境の構築は私にとって、かなり困難になってきたように思います。
GNUの各パッケージについて、リリース毎にインストール手順の説明があったらと思いました。(私が、その情報に辿り着けなかっただけかも知れません。)
※やはり、SHの開発はHEWを使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。
登録:
投稿 (Atom)























