最終更新: llysfactoryll 2015年02月15日(日) 19:41:56履歴
STM32F4DISCOVERY (STM32F407)
CoIDE v.1.7.8
Windows Vista
STM32F4DISCOVERY(STM32F407)のマイクロUSBポートを、CDC−ACMクラスを用いて、仮想COMポートとしてつないでみたいと思う。
CDC (Communications Device Class) ACM (Abstract Control Model)
http://en.wikipedia.org/wiki/USB_communications_de...
CDC−ACMクラスとは、(ホスト側から見て)USB接続された機器を、(アプリケーションプログラムから見れば)RS−232Cポートと同じように見えるする、USBで規定されているクラスである。
USBで規定されているクラスであれば、一般的に、ホストマシーン(パソコン)に、特別なデバイスドライバーをインストールすることなく、使用することができる。
・・の、はずであるのだが、どうも仮想COMポートは、個別のドライバーが必要なようである(後述)。
プロジェクトを新規作成する際、CooCoxの中に、STM32F4DISCOVERYを見つけた(今までは、stm32ばかりを見ていた)。
今回は、CooCoxのを使ってみる。
リポジトリーを見ていると、Othersに、
STM_UB_USB_CDC USB-Device Driver for CDC function on STM32F4
というのを見つけた。 これを使ってみようと思う。
http://mikrocontroller.bplaced.net/wordpress/
チェックを入れると、自動的に必要なものが全部組み込まれる。
CMS BOOTなども自動的に組み込まれている。
おまけに、右側のヘルプウィンドウに、「Exsample」まで表示されている。
早速この「Exsample」を、main()にコピーしてきて、ビルドしてみる。
・・と思ったら、セリアで買ったマイクロUSBケーブルが見当たらない。こんなこともあろうかと思い、できるだけ目立つ紫色を選んだのだけれど・・
ビルドして早速、パソコンにつないでみたが、うまく認識できなかった。
あっ! あまりのも簡単にできてしまったので? クロックの変更を忘れていた。
cmsis_boot\system_stm32f4xx.c: // for STM32F4DISCOVERY (STM32F407) //#define PLL_M 25 #define PLL_M 8 cmsis_boot\stm32f4xx.h: // for STM32F4DISCOVERY (STM32F$04) //#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
今度は自動で、デバイスドライバーがインストールされた。 と、思いきや、まだダメであった。
何とかWindows標準の状態で何とかならないかと思ったが、どうしても、個別のドライバーが必要らしい。
私の環境が、Vistaだから、なのだろうか?
あきらめて、 STM32 Virtual COM Port Driver をインストールする。
〔ダウンロード〕
STSW-STM32102
http://www.st-japan.co.jp/web/jp/catalog/tools/PF2...
stsw-stm32102.zip
VCP_V1.4.0_Setup.exe
〔インストール〕
exeファイルを実行する。
STM32 Virtual COM Port Driverをインストールしただけでは、最初、ダメであった。
STM32 Virtual COM Port Driverをインストールする前にデバイスを接続してしまったために、中途半端に標準的なドライバーが、インストールされてしまって、いたようである。
デバイスマネージャで黄色く表示されて、何度探させても、うまく行かなかった。
結果、接続別に表示させて、黄色くなっていた、ひとつ上の階層のデバイスに対して、ドライバーの更新を行なえば、うまく行くようになった。
でも、結局使われているのは、マイクロソフト標準の「useser.sys」のようである。
よく分からない? 自動で探し出す力が無いだけなのだろうか・・
先に述べた 「Exsample」に示されているサンプルは、気持ちは分かるが、使い物にならない。
プログラムが走り出した瞬間にUSBが接続されていないと、「Test」という文字列を送信しない。
プログラムが走り出さないと、USBポートとして存在できないのに、走り出した瞬間に接続されているなんてことはありえない。
ステータスを見にいくところでブレークすればと思ったが、プログラムを止めていると、USBデバイスとして機能を果たしていない。
これはなかなかデバッグの、厄介な、くせものある。
動作確認には、せめて、これくらいにはしようよ!
これで、約10秒間隔で、接続していれば、「Test」を送信する。
int main(void) { SystemInit(); UB_USB_CDC_Init(); // init while(1) { int i; for( i=0; i<0x10000000; ++i) ; // check if USB connected if(UB_USB_CDC_GetStatus()==USB_CDC_CONNECTED) { // send String to USB (+CarriageReturn+LineFeed) UB_USB_CDC_SendString("Test", CRLF); } } }
コメントをかく