わいずふぁくとりいがプログラムの話題をウィキします。

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);
    }
  }
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます