Upload
phamthien
View
215
Download
0
Embed Size (px)
Citation preview
1
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
2
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との接続は以下のようになります。
PC A
A
Mini B
Micro B
USBケーブル : A - MiniB : 電源供給 および ST-LINKのため
USBケーブル : A - MicroB : VCP(仮想COMポート)による非同期シリアル通信のため
図2.
USBポート
STM32F4 Discovery
3
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 です。
次ページに続く
4
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が実行されて次ページのフォームが表示されます。
5
アプリケーションAccess_VCPのインストールはこれで終了です。
STM32F4 Discoveryでプロジェクト STM32F4_VCPが実行されていて、PCと STM32F4 Discoveryとが
USBケーブル(A – MicroB)でVCP接続されている場合、上記のように ”COM(シリアルポート)を検索しました。” と
メッセージが表示されます。
通常は、スタートメニューの{ Access_VCP }をクリックするとアプリケーションを起動されて上記のフォームが表示されます。
6
4.2. Access_VCPアプリケーションの起動
まず、PCと STM32F4 DiscoveryのCN5とを USBケーブル(A – MicroB)で接続してください。
スタートメニューの { Access_VCP } をクリックするとアプリケーションAccsess_VCPが 起動して
次のフォームが表示されます。
8
この例では、”COM3に設定しました。” とメッセージが表示されています。
4.4. 送信データのエコーバック
送信データのTextBoxにASCII文字列を入力して、[送信] ボタンをクリックすると、CPU基板にデータが送信されます。
CPU基板はデータを受信して、そのデータをそのまま PCに送信します。
このプログラムではASCII文字のみ入力可能です。
PCが受信したデータは受信データの部分に表示されます。
上記の例では、送信データに “How are you?” と入力して [送信] ボタンをクリックした結果、エコーバックのデータが
受信データの欄に表示されています。
9
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” をエコーバックしました。
10
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(青)消灯
11
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のドライバです。
12
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ポート)通信のためのドライバです。
13
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の割り込み処理を記述しています。
14
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);
15
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);
16
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);
17
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);
18
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);