TrueSTUDIO 用 F4D_VCP の説明 V001 2014/07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです 無料の試用版開発ツール Atollic TrueSTUDIO for ARM Lite で作成したプロジェクトです ビルド可能なプログラムのコードサイズが 32Kbyte 以内の制限があります プログラムの開始番地は 0x08000000 です デバッグが可能です 目次 1. USB の VCP( 仮想 COM ポート ) について... 2 2. USB の VCP( 仮想 COM ポート ) による接続... 2 3. プログラム実行時の動作... 3 4. VCP 通信の動作確認... 4 4.1. アプリケーション Access_VCP のインストール... 4 4.2. Access_VCP アプリケーションの起動... 6 4.3. COM ポートの選択... 7 4.4. 送信データのエコーバック... 8 4.5. LD6( 青 ) 点灯コマンドのセット... 9 5. プロジェクトの構成... 11 5.1. プロジェクト F4D_VCP の起動画面... 11 5.2. 追加したソース フォルダとファイル... 11 6. 主なモジュールの説明... 13 6.1. ソース フォルダ src 内のファイル... 13 6.2. HandleTIM... 14 6.3. UserPrograms... 15 6.4. Communicate_VCP... 17 1
1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート ) を使用するための VCP ドライバのインストールについては インストール のページの [ 1. VCP(Virtual COM Port : 仮想 COM ポート ) ドライバ のインストール ] の部分をご覧ください 2. USB の VCP( 仮想 COM ポート ) による接続 USB の VCP( 仮想 COM ポート ) による PC と STM32F4 Discovery との接続は以下のようになります USB ケーブル : A - MiniB : 電源供給および ST-LINK のため Mini B PC A USB ポート A STM32F4 Discovery Micro B USB ケーブル : A - MicroB : VCP( 仮想 COM ポート ) による非同期シリアル通信のため 図 2. 2
3. プログラム実行時の動作 1) F4D_VCP プログラムを実行すると基板上の LED LD4( 緑 ) が 1 秒点灯 2 秒消灯で点滅します 2) データを受信するとそのデータをそのまま送信します ( エコーバック ) 3) 受信データが LED ON/OFF のコマンドであった場合 以下のように動作します 番号 受信コマンド 動作 1 LD3 ON\0 LD3( 橙 ) 点灯 2 LD3 OFF\0 LD3( 橙 ) 消灯 3 LD5 ON\0 LD5( 赤 ) 点灯 4 LD5 OFF\0 LD5( 赤 ) 消灯 5 LD6 ON\0 LD6( 青 ) 点灯 6 LD6 OFF\0 LD6( 青 ) 消灯 表中の \0 は 0x00 です 次ページに続く 3
4. VCP 通信の動作確認 USB の VCP( 仮想 COM ポート ) 用のアプリケーション Access_VCP を使用して STM32F4 Discovery の送受信の確認 およびコマンド文字列を送信して基板上の LED の点灯 / 消灯を行います 4.1. アプリケーション Access_VCP のインストール Access_VCP はりばいぶが 飛石伝ひ のページで提供している Windows7 PC 用のアプリケーションです Access_VCP_Install.zip をダウンロードして解凍すると 次ページのようにフォルダ Access_VCP_Install の下にインストールのためのファイルが格納されています setup.exe をダブルクリックすると次の警告のダイアログが開きます [ インストール (I)] ボタンをクリックしてインストールしてください アプリケーションがインストールされて自動的に Access_VCP が実行されて次ページのフォームが表示されます 4
アプリケーション Access_VCP のインストールはこれで終了です STM32F4 Discovery でプロジェクト STM32F4_VCP が実行されていて PC と STM32F4 Discovery とが USB ケーブル (A MicroB) で VCP 接続されている場合 上記のように COM( シリアルポート ) を検索しました とメッセージが表示されます 通常は スタートメニューの { Access_VCP } をクリックするとアプリケーションを起動されて上記のフォームが表示されます 5
4.2. Access_VCP アプリケーションの起動まず PC と STM32F4 Discovery の CN5 とを USB ケーブル (A MicroB) で接続してください スタートメニューの { Access_VCP } をクリックするとアプリケーション Accsess_VCP が起動して次のフォームが表示されます 6
4.3. COM ポートの選択 COM 選択の ComboBox で COM を選択します 確認のメッセージが表示されるので よい場合は [ はい (Y)] ボタンをクリックします 次ページに続く 7
この例では COM3 に設定しました とメッセージが表示されています 4.4. 送信データのエコーバック送信データの TextBox に ASCII 文字列を入力して [ 送信 ] ボタンをクリックすると CPU 基板にデータが送信されます CPU 基板はデータを受信して そのデータをそのまま PC に送信します このプログラムでは ASCII 文字のみ入力可能です PC が受信したデータは受信データの部分に表示されます 上記の例では 送信データに How are you? と入力して [ 送信 ] ボタンをクリックした結果 エコーバックのデータが受信データの欄に表示されています 8
4.5. LD6( 青 ) 点灯コマンドのセット LD6( 青 ) の点灯コマンド LD6 ON&00 とセットします 0x20 未満 0x7F 以上のコードは &xx の形で入力します &00 は 0x00 です <CR> の 0x0D なら &0D とします & 自体を入力する場合は &26 と入力してください [ 送信 ] ボタンをクリックしたとき送信データが送信されます 受信データの部分にエコーバックされたデータ LD6 ON&00 が表示されています STM32F4 Discovery 側では LD6 ON&00 を受信して LD6( 青 ) を点灯して LD6 ON&00 をエコーバックしました 9
LD3( 橙 ) LD5( 赤 ) に対しても同様に点灯 / 消灯を行うことができます 試してみてください プロジェクト F4D_VCP のコマンドに対する動作は以下の通りです Access_VCP の送信データ入力では \0 (0x00) のデータは &00 と入力してください F4D_VCP の受信コマンドに対する動作 番号 受信コマンド 動作 1 LD3 ON\0 LD3( 橙 ) 点灯 2 LD3 OFF\0 LD3( 橙 ) 消灯 3 LD5 ON\0 LD5( 赤 ) 点灯 4 LD5 OFF\0 LD5( 赤 ) 消灯 5 LD6 ON\0 LD6( 青 ) 点灯 6 LD6 OFF\0 LD6( 青 ) 消灯 10
5. プロジェクトの構成 5.1. プロジェクト F4D_VCP の起動画面 TrueSTUDIO で作成したプロジェクト F4D_VCP を開いた状態を以下に示します 左側のプロジェクト エクスプローラーの F4D_VCP を展開した状態です 5.2. 追加したソース フォルダとファイル追加したソース フォルダとファイルについて簡単に説明します 1) Communicate_VCP ( ソース フォルダ ) a) Communicate_VCP.h Communicate_VCP.c ( ファイル ) 接続相手との通信処理を記述しています データを受信して 受信データをそのまま送信します ( エコーバック ) 受信データを判定して LD3( 橙 ) LD5( 赤 ) LD6( 青 ) の点灯 / 消灯を行います 2) Driver_USB ( ソース フォルダ ) Driver_USB の下にフォルダ STM32_USB_Device_Library と STM32_USB_OTG_Driver があります STMicroelectronics 社が提供している USB のドライバです 11
3) Handles ( ソース フォルダ ) Peripheral の設定などを行っています a) HandleGPIO.h HandleGPIO.c ( ファイル ) GPIO 入出力の初期設定を記述しています b) HandleTIM.h HandleTIM.c ( ファイル ) タイマ割り込みを使用するために タイマの初期設定を記述しています 1mSec ごとにタイマ割り込みが発生するように設定しています 4) UserPrograms ( ソース フォルダ ) LED のための処理を記述しています a) UserPrograms.h UserPrograms.c ( ファイル ) Status LED : LD4( 緑 ) に使用している GPIO の初期設定と点滅処理を記述しています LD3( 橙 ) LD5( 赤 ) LD6( 青 ) に使用している GPIO の初期設定を記述しています 5) VCP ( ソース フォルダ ) VCP の下にフォルダ inc と src があります VCP( 仮想 COM ポート ) 通信のためのドライバです 12
6. 主なモジュールの説明 6.1. ソース フォルダ src 内のファイルソース フォルダ src 内のファイルでプログラムを追加した主なファイルについて簡単に説明します 1) main.c a) main 関数プログラムはここから開始します 主に初期化処理関数を呼び出しています int main(void) b) 使用するクロックの初期化 void RCC_Configuration(void); c) GPIO の初期化 void Init_GPIOs(void); 2) stm32f4xx_it.h stm32f4xx_it.c このファイルに割り込み処理を記述します 本プロジェクトサンプルでは TIM13 と TIM14 のタイマ割り込み処理および USB の割り込み処理を記述しています 13
6.2. HandleTIM 1) TIM13 と TIM14 の初期化タイマ割り込みのために TIM13 と TIM14 を初期化してインターバルをセットします 1mSec ごとに割り込みがかかるように設定しています 以下の関数の引数に TIM13 または TIM14 用のパラメータを指定して TIM13 または TIM14 を初期化します -------------- // TIMxx 初期化 -------------- // 引数 : // TIM_TypeDef *TIMxx : TIM 選択 // uint32_t RCC_APB1Periph_TIMxx : specifies the APB1 peripheral to gates its clock. // uint16_t uint16_timxx_ccr1 : TiMxx CH1 のインターバル -------------- void InitializeTIMxx(TIM_TypeDef *TIMxx, uint32_t RCC_APB1Periph_TIMxx, uint16_t uint16_timxx_ccr1); 2) タイマ割り込み許可以下の関数の引数に希望する TIMxx 用のパラメータを指定して割り込みを許可します ------------------- // TIMxx 割り込み許可 ------------------- // 引数 : // uint32_t RCC_APB1Periph_TIMxx : specifies the APB1 peripheral to gates its clock. // uint8_t TIMxx_IRQn : STM32 specific Interrupt Numbers ------------------- void EnableIrqTIMxx(uint32_t RCC_APB1Periph_TIMxx, uint8_t TIMxx_IRQn); 14
6.3. UserPrograms UserPrograms.h には LED に使用する GPIO に対する定義を記述してあります 以下に UaerPrograms.c に記述している関数の説明を記します 1) LED に使用する GPIO の初期化 ( 共通処理 ) GPIO 番号とピン番号を指定して I/O を初期化します // LED ポート初期化 // 引数 : // GPIO_TypeDef *GPIOx : GPIO ポート指定 // uint16_t GPIO_Pin_x : GPIO ピン指定 void InitializePortLED(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin_x); 2) LED の点滅処理 ( 共通処理 ) GPIO 番号とピン番号などを指定して希望の LED の点滅処理を行います // LED 点滅 : 点灯 / 消灯切り替え // 点灯 / 消灯を切り替えると同時に点灯時間 / 消灯時間をセットする // 引数 : // GPIO_TypeDef *GPIOx : GPIO ポート指定 // uint16_t GPIO_Pin_x : GPIO ピン指定 // int16_t *pint16_onoff : ON/OFF 状態 // 0 : OFF // 1 : ON // uint16_t *puint16_timer : 点灯時間 / 消灯時間をセットする変数のポインタ // uint16_t uint16_timeon : 点灯時間 // uint16_t uint16_timeoff : 消灯時間 void BlinkLED(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin_x, int16_t *pint16_onoff, uint16_t *puint16_timer, uint16_t uint16_timeon, uint16_t uint16_timeoff); 15
3) LED に使用する I/O の初期化 a) StatusLED : LD4( 緑 ) // Status LED ポート初期化 : LD4( 緑 ) void InitializePortStatusLED(void); b) LD3( 橙 ) // LD3( 橙 ) ポート初期化 void InitializePortLD3(void); c) LD5( 赤 ) // LD5( 赤 ) ポート初期化 void InitializePortLD5(void); d) LD6( 青 ) // LD6( 青 ) ポート初期化 void InitializePortLD6(void); 4) StatusLED : LD4( 緑 ) の点滅 // Status LED 点滅 : LD4( 緑 ) : 点灯 / 消灯切り替え // Timer2 割り込み内で GLB_uint16_vBlinkTimerStatusLED をデクリメントする // GLB_uint16_vBlinkTimerStatusLED が 0 になった時 呼び出される // 点灯 / 消灯を切り替えると同時に点灯時間 / 消灯時間をセットする // 引数 : // uint16_t uint16_timeon : 点灯時間 // uint16_t uint16_timeoff : 消灯時間 void BlinkStatusLED(uint16_t uint16_timeon, uint16_t uint16_timeoff); 16
6.4. Communicate_VCP 1) VCP の初期化 //--------------------------------------------------------------- // VCP Communication 初期化 : USB を VCP として使用するための初期化を行います //--------------------------------------------------------------- void InitializeCommunicate_VCP(void); 2) VCP 通信処理 VCP の受信待ちを行い 受信データを判定して LED の点灯 / 消灯を行います 受信データはエコーバックします //------------------------------------------------------------ // VCP 通信処理 //------------------------------------------------------------ // 戻り値 : // -1 : 処理中 // 0 : 終了 //------------------------------------------------------------ int16_t Communicate_VCP(void); 3) VCP 送信処理指定された送信データを指定数送信します ---- // VCP 送信処理 ---- // 引数 : // uint16_t uint16_sendlength : 送信データ数 // uint8_t *puint8_senddata : 送信データのポインタ ---- void SendVCP(uint16_t uint16_sendlength, uint8_t *puint8_senddata); 17
4) VCP 受信処理データ受信があった場合 受信データを取得して指定バッファにセットします ---- // VCP 受信処理 ---- // 引数 : // uint8_t *puint8_receivebuffer : 受信データを格納する Buffer のポインタ // 戻り値 : // -1 : 受信なし // 0 : Error // 1 以上 : 受信 byte 数 ---- int16_t ReceiveVCP(uint8_t *puint8_receivebuffer); 5) 受信コマンドの実行 -------------------- // 受信コマンドを実行する -------------------- // 引数 : // uint16_t uint16_receivelength : 受信データ数 // uint8_t *puint8_receivedata : 受信データが格納されている Buffer のポインタ // uint8_t *puint8_senddata : 応答送信データを格納する Buffer のポインタ // 戻り値 : 応答送信データ数 -------------------- uint16_t ExecuteCommandVCP(uint16_t uint16_receivelength, uint8_t *puint8_receivedata, uint8_t *puint8_senddata); 18
改訂履歴 V001 2014/07/05 初版 19