ユニバーサル基板に前回のSTM32F217ZGT6を載せた変換基板をハンダ付けし、とりあえず正常に動作するか確認するために最小限の部品をくっつけてJTAGとUSARTの信号線をコネクタまで引出しました。
早まる気持ちを抑えながら配線ミスがないか2重3重とチェックし、電源を入れてみる。
チップから白煙があがったりしてないし、触診しても熱がないようなのでとりあえず配線ミスはしてない模様。(いい加減)
JTAGケーブルを挿してOpenOCDで試してみる。
gitで入手できる最新(0.5.0)のOpenOCDはSTM32F2に対応しているようで、
コンフィグファイルの中身を書換える(http://www.mail-archive.com/openocd-development@lists.berlios.de/msg16724.html)とJTAGデバッグができるそうなので早速試してみた。 P.S. 最新のOpenOCDをインストールするとSTM32F2用のコンフィグファイル(stm32f2xxx.cfg)も一緒に付属されておりました。
反応がない・・・・(^ω^;)
まあこういうモノは一発でうまくいった試しがないので慣れっこです。
原因はどこかなーと基板に穴が開くんじゃないかってくらい(ユニバーサル基板だからもう穴だらけ)凝視しながら接触不良を疑ったり、部品の値を変えてトライアンドエラー的なことを繰り返しましたが一向に反応がない。。
あーこれは完全にハマったパターンかなぁーっと途方に暮れかけながらも評価ボードの回路図を眺めているとアナログ電源のVDDAを放置していたことを思い出し、とりあえず3.3Vにつないでみる。
電源を入れてチップを触ふれると熱くなったのでビビリながらもOpenOCDで反応をみる。
反応がない・・・・(^ω^#)
やばい。。壊しちゃったかも><;と生きた心地がしない悲壮感を味わうことに。さすがに3.3V直づけはまずかったらしく、回路図にある通り手持ちのマイクロインダクタ(47μH)を挿入してみた。
結果。
反応した!!!!!(^ω^*)
おおー、やっぱり端折ったらダメな部分だったんだ。こういう失敗は今回で何度目だ(汗
↑TAPのIDは0x4ba00477と表示されてます。
さっそくtelnetでローカルホストにログインしてFLASHの内容を読んでみた。
↑フラッシュ全容量1MByteでリファレンスマニュアルのとおり12個のセクタに分かれてました。
次はちゃんとプログラムが動作するか検証すべく、STM32F2のUSARTからお決まりのHello World!を出力させることにしました。
STM32F2用のペリフェラルライブラリをSTmicroの公式サイトから入手し、ライブラリをコンパイルしました。
STM32F2xx_StdPeriph_Lib_V1.0.0
http://www.st.com/stonline/stappl/resourceSelector/app?page=resourceSelector&doctype=FIRMWARE&ClassID=1734
スタートアップコードは./CMSIS/CM3/DeviceSupport/ST/STM32F2xx/startup/gcc_ride7にあるstartup_stm32f2xx.sを使いました。
ここからsystem_stm32f2xx.cのSystemInit()関数を呼び、外部クロック25MHzをPLLで逓倍してCPUのクロック周波数120MHzで動作させているようです。
リンカスクリプトは./Project/STM32F2xx_StdPeriph_Examples/NVIC/VectorTable_Relocation/linker/RIDEのstm32f2xx_flash_offset.ldを使いました。
フラッシュメモリの0番セクタをブートローダとして使うためか、0x4000だけオフセットされて記述されているので下のようにフラッシュの先頭から配置するように修正しました。
MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K /* FLASH (rx) : ORIGIN = 0x8004000, LENGTH = 1024K-0x4000 */ FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0 }これでライブラリの準備は完了。
USARTでHello World!を出力するプログラムをつくってみたけど、GPIOピンの記述等が若干変更されている箇所がありました。
たとえばGPIOをAF(オルタネートファンクション)として使う場合、マルチプレクスされたファンクションのどれを使うか最初に明示する必要があります。
例)PG14ピンをUSART6_TXとして使う場合、
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_USART6);
というように記述してPG14ピンをUSART6に接続させます。
リマップに似てますが、1ピン毎にAFを切り替えられるあたりが斬新です。
それとGPIO_InitTypeDefの構造体も少し変更されてます。
下記のようにGPIO_OType(出力タイプ)とGPIO_PuPd(プルアップ/プルダウン)が追加されています。
typedef struct
{
uint32_t GPIO_Pin;
GPIOMode_TypeDef GPIO_Mode;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOOType_TypeDef GPIO_OType;
GPIOPuPd_TypeDef GPIO_PuPd;
}GPIO_InitTypeDef;
いくつかの修正を経てようやくHello World!が表示できました(^ω^)
これでSTM32F2の開発環境が一応整いました。いろいろと堪能できそうです。
まだボードは半分も完成してないけど楽しみ(´^ω^`)