CoIDE 用 STM32F4_UART2 の説明 V002 2014/03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000000 です デバッグが可能です 提供する PC のアプリケーションの Access_SerialPort を使用して UART( 非同期シリアル通信 ) 送受信の試験を行うことができます 目次 1. UART について... 2 2. UART に使用する信号... 2 3. プログラム実行時の動作と確認... 4 3.1. 実行時の動作... 4 3.2. 動作確認... 4 1) アプリケーション Access_SerialPort のインストール... 4 2) Access_SerialPort アプリケーションの起動... 7 3) COM ポートと通信速度の選択... 8 4) 送信データのエコーバック... 10 5) 基板上の LED LD6( 青 ) の点灯 / 消灯... 11 4. プロジェクトの構成... 12 4.1. 独自に追加したソースフォルダ... 12 4.2. ルートのファイル... 13 5. 主なモジュールの説明... 13 5.1. HandleTimer2... 13 5.2. HandleUART... 14 5.3. main.c... 15 5.4. UserPrograms... 15 5.5. CommunicateHOST... 17 1
1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受け渡すために 送信側が 1bit ずつ送り出し 受信側が 1bit ずつ取り込みます 通常 UART という場合 送受信のために 送信と受信に一本ずつ信号線を使用します また 送受信する機器同士の GND を接続します というわけで 信号線は 最低 3 本接続することになります 詳しくは UART( 非同期シリアル通信 ) の説明 をご覧ください 2. UART に使用する信号 STM32F4 Discovery の UART( 非同期シリアル通信 ) に使用する信号と接続相手との接続は以下の通りです 1) UART2 接続信号表 STM32F4 Discovery の UART 信号 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART2_TX PA2 P1-14 --- > RxD 2 2 USART2_RX PA3 P1-13 < --- TxD 3 3 GND GND P1-1, P1-2, P1-5, P1-23 P1-49, P1-50 P2-1, P2-2, P2-49, P2-50 < --- > GND 5 D-SUB 9S ストレート接続 2) RS232C ドライバ接続例 この例では DSUB-9S には TxD, RxD, GND の 3 本の信号以外は接続されません 2
3) PC との接続例 PC との接続は以下のようになります PC A USB ケーブル : 電源供給および ST-LINK のため USB ポート STM32F4 Discovery Mini B RS232C ドライバ RS232C 変換ケーブル DSUB-9S 図 2. 3) RS232C ドライバと DSUB-9S との接続は以下の通りです RS232C ドライバ DSUB-9S 1 RS2_TxD --- > 2 RxD 2 RS2_RxD < --- 3 TxD 3 GND < --- > 5 GND 3
3. プログラム実行時の動作と確認 3.1. 実行時の動作 1) プログラムを実行すると基板上の LED LD4( 緑 ) が 1 秒点灯 2 秒消灯で点滅します 2) UART2 ポートで LED ON/OFF コマンド以外のデータを受信するとエコーバックします 3) UART2 ポートで LED ON/OFF コマンドを受信すると 基板上の該当する LED の点灯 / 消灯を行います LED ON/OFF コマンドと LED との対応は以下のようになります a) LD3 ON LD3( 橙 ) が点灯します b) LD3 OFF LD3( 橙 ) が消灯します d) LD5 ON LD5( 赤 ) が点灯します e) LD5 OFF LD5( 赤 ) が消灯します f) LD6 ON LD6( 青 ) が点灯します g) LD6 OFF LD6( 青 ) が消灯します 3.2. 動作確認 UART( 非同期シリアル通信 ) のためのアプリケーション Access_SerialPort を使用して CPU 基板の送受信の確認 およびコマンド文字列を送信して基板上の LED の点灯 / 消灯を行います 1) アプリケーション Access_SerialPort のインストール Access_SerialPort_Install.zip をダウンロードして解凍すると 次ページのようにフォルダ Access_SerialPort_Install の下にインストールのためのファイルが格納されています 次ページに続く 4
setup.exe をダブルクリックすると次の警告のダイアログが開きます [ インストール (I)] ボタンをクリックしてインストールしてください アプリケーションがインストールされて自動的に Access_SerialPort が実行されて次ページのフォームが表示されます 5
アプリケーション Access_SerialPort のインストールはこれで終了です STM32F4 Discovery でプロジェクト STM32F4_UART2 が実行されていて PC と STM32F4 Discovery とが RS232C ケーブルで接続されている場合 上記のように COM( シリアルポート ) を検索しました とメッセージが表示されます 通常は スタートメニューの { Access_SerialPort } をクリックするとアプリケーションを起動されて上記のフォームが表示されます 次ページに続く 6
2) Access_SerialPort アプリケーションの起動まず PC と STM32F4 Discovery とを RS232C インターフェースで接続してください スタートメニューの { Access_SerialPort } をクリックするとアプリケーション Accsess_SerialPort が起動して次ページのフォームが表示されます 7
3) COM ポートと通信速度の選択 COM 選択の ComboBox で COM を選択します 8
確認のメッセージが表示されるので よい場合は [ はい (Y)] ボタンをクリックします この例では COM8 に設定しました とメッセージが表示されています 通信速度は 9600bps でよいのでこのままにしておきます 次ページに続く 9
4) 送信データのエコーバック送信データの TextBox に ASCII 文字列を入力して [ 送信 ] ボタンをクリックすると CPU 基板にデータが送信されます CPU 基板はデータを受信して そのデータをそのまま PC に送信します PC が受信したデータは受信データの部分に表示されます 上記の例では 送信データに How are you? と入力して [ 送信 ] ボタンをクリックした結果 エコーバックのデータが受信データの欄に表示されています 次ページに続く 10
5) 基板上の LED LD6( 青 ) の点灯 / 消灯基板上の LED LD6( 青 ) を点灯 / 消灯するコマンドは以下のようになります a) 点灯 LD6 ON b) 消灯 LD6 OFF 上記の例では LD6 ON を入力して [ 送信 ] ボタンをクリックした結果 STM32F4 Discovery は LD6( 青 ) を点灯して OK : LD6 ON を応答データとして送信しました LD6( 青 ) を消灯したい場合は LD6 OFF を送信します LD3( 橙 ) LD5( 赤 ) についても同様にして点灯 / 消灯を行うことができます 確認してみてください 11
4. プロジェクトの構成 CoIDE で作成したプロジェクト STM32F4_UART2 を開いた状態を以下に示します 4.1. 独自に追加したソースフォルダ独自に追加したソースフォルダについて簡単に説明します 1) CommonModules 共通処理を記述しています 2) CommunicateHOST UART の通信処理を記述しています LED 点灯 / 消灯のコマンドを受信して処理を行います コマンド以外のデータを受信した場合はそのままデータを折り返し送信します 3) Handles Peripheral の設定などを行っています a) HandleTimer2.h HandleTimer2.c タイマ割り込みを使用するために タイマの初期設定を記述しています b) HandleUART.h HandleUART.c UART の初期設定と送受信の処理を記述しています 4) UserPrograms a) Status LED および LD3( 橙 ) LD5( 赤 ) LD6( 青 ) に使用している I/O の初期設定と点滅処理を記述しています 12
4.2. ルートのファイルルートの中の特に重要なファイルについて説明します 1) main.c main モジュールが記述されています プログラムはここから開始します I/O と UART の初期設定と UART の送受信モジュールの呼び出しを記述しています 2) stm32f4xx_it.c 割り込み処理を記述しています このプロジェクトでは Timer2 割り込みと UART の割り込み処理を記述しています 5. 主なモジュールの説明 5.1. HandleTimer2 1) Timer2 初期化 -------------- // Timer2 初期化 -------------- // uint16_t uint16_tim_pulse1 : Timer2 CH1 インターバル // uint16_t uint16_tim_pulse2 : Timer2 CH2 インターバル // uint16_t uint16_tim_pulse3 : Timer2 CH3 インターバル // uint16_t uint16_tim_pulse4 : Timer2 CH4 インターバル -------------- void InitializeTimer2( IO uint16_t uint16_tim_pulse1, IO uint16_t uint16_tim_pulse2, IO uint16_t uint16_tim_pulse3, IO uint16_t uint16_tim_pulse4); 2) Timer2 割り込み禁止 //Timer2 割り込み禁止 void DisableIrqTim2(void); 3) Timer2 割り込み許可 //Timer2 割り込み許可 void EnableIrqTim2(void); 13
5.2. HandleUART 1) UART2 の初期化 //------------------------------------------------- // UART2 初期化 //------------------------------------------------- // uint32_t uint32_baudrate : 通信速度 bps //------------------------------------------------- void InitializeUART2(uint32_t uint32_baudrate) 2) UARTx の初期化 ( 共通処理 ) UART 番号やピン番号を指定して 希望の UART を初期化します -------------------------------- // UARTx 初期化 -------------------------------- // uint32_t uint32_baudrate : 通信速度 bps // uint32_t RCC_AHB1Periph_GPIOx : specifies the AHB1 peripheral to gates its clock. // uint32_t RCC_APBxPeriph_USARTx : specifies the APB1 peripheral to gates its clock. // GPIO_TypeDef *GPIOx : where x can be (A..H) to select the GPIO peripheral. // uint8_t GPIO_PinSourceTx : GPIO_PinSource : specifies the pin for the Alternate function. : TX // uint8_t GPIO_PinSourceRx : GPIO_PinSource : specifies the pin for the Alternate function. : RX // uint8_t GPIO_AF_USARTx : selects the pin to used as Alternate function. : USART1..3 // uint16_t GPIO_Pin_Tx : GPIO_Pin : specifies the port bit. : TX // uint16_t GPIO_Pin_Rx : GPIO_Pin : specifies the port bit. : RX // USART_TypeDef* USARTx : where x can be 1, 2, 3, 4, 5 or 6 to select the USART or UART peripheral. // (STM32F4 Discovery では 2 と 3 のみ使用可能 ) // uint8_t USARTx_IRQn : STM32 specific Interrupt Numbers // int16_t *GLB_pint16_UARTxReceiveIRQ : 受信割り込み ON/OFF フラグのポインタ -------------------------------- void InitializeUARTx(uint32_t uint32_baudrate, uint32_t RCC_AHB1Periph_GPIOx, uint32_t RCC_APBxPeriph_USARTx, GPIO_TypeDef *GPIOx, uint8_t GPIO_PinSourceTx, uint8_t GPIO_PinSourceRx, uint8_t GPIO_AF_USARTx, uint16_t GPIO_Pin_Tx, uint16_t GPIO_Pin_Rx, USART_TypeDef* USARTx, uint8_t USARTx_IRQn, int16_t *GLB_pint16_UARTxReceiveIRQ ); 14
5.3. main.c 1) 使用するクロックの初期化 void RCC_Configuration(void); 2) I/O の初期化 void Init_GPIOs(void); 5.4. UserPrograms 1) LED に使用する I/O の初期化 ( 共通処理 ) 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 の初期化 // Status LED ポート初期化 : LD4( 緑 ) void InitializePortStatusLED(void); // LD3( 橙 ) ポート初期化 void InitializePortLD3(void); // LD5( 赤 ) ポート初期化 void InitializePortLD5(void); // LD6( 青 ) ポート初期化 void InitializePortLD6(void); 4) Status LED : 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
5.5. CommunicateHOST 1) UART の初期化 //----------------------------------------------------------- // HOST 通信パラメータ初期化 //----------------------------------------------------------- // uint32_t uint32_baudrate : 通信速度 //----------------------------------------------------------- void InitializeCommunicateHOST(uint32_t uint32_baudrate); 2) HOST 通信処理受信処理を行い 受信コマンドを処理して応答データを送信します //------------------------------------------------------------ // HOST 通信処理 //------------------------------------------------------------ // 戻り値 : // -1 : 処理中 // 0 : 終了 //------------------------------------------------------------ int16_t CommunicateHOST(void); 次ページに続く 17
3) UART 送信処理送信バッファにセットされたデータを指定された byte 数だけ送信します ---- // UART 送信処理 ---- // uint16_t uint16_sendlength : 送信データ数 // uint8_t *puint8_data : 送信データのポインタ ---- void SendUART(uint16_t uint16_sendlength); 4) UART 受信処理受信の有無を判定して 受信があった場合 受信データを Buffer にセットします ---- // UART 受信処理 ---- // uint8_t *puint8_receivebuffer : 受信データを格納する Buffer のポインタ // 戻り値 : // -1 : 受信なし // 0 : Error // 1 以上 : 受信 byte 数 ---- int16_t ReceiveUART(uint8_t *puint8_receivebuffer); 5) HOST コマンドの実行受信コマンドを判定してそれぞれの処理を行います -------------------- // HOST コマンドを実行する -------------------- // uint16_t uint16_receivelength : 受信データ数 // uint8_t *puint8_receivedata : 受信データが格納されている Buffer のポインタ // uint8_t *puint8_senddata : 応答送信データを格納する Buffer のポインタ // 戻り値 : 応答送信データ数 -------------------- uint16_t ExecuteCommandHOST(uint16_t uint16_receivelength, uint8_t *puint8_receivedata, uint8_t *puint8_senddata); 18
改訂履歴 V001 2014/03/26 初版 V002 2014/03/30 説明追加 19