STM32L_UART1 の説明 V004 2014/03/30 STM32L-Discovery の UART 1 の送受信を行うプログラムです 無料の開発ツール Atollic TrueSTUDIO for ARM Lite( 試用版 ) で作成したプロジェクトです プログラムの開始番地は 0x08000000 です デバッグが可能です PC アプリケーションの Access_SerialPort を使用して UART( 非同期シリアル通信 ) 送受信の試験を行うことができます 目次 1. UART について... 2 2. UART に使用する信号... 2 3. プログラム実行時の動作と確認... 4 3.1. 実行時の動作... 4 3.2. 動作確認... 4 1) Access_SerialPort アプリケーションの起動画面... 4 2) COM ポートと通信速度の選択... 5 3) 送信データのエコーバック... 7 4) 基板上の LED LD4( 青 ) の点灯 / 消灯... 8 4. プロジェクトの構成... 9 4.1. 独自に追加したソースフォルダ... 9 4.2. ソースフォルダ src のファイル... 10 5. 主なモジュールの説明... 10 5.1. HandleTIM... 10 5.2. HandleUART... 11 5.3. main.c... 11 5.4. UserPrograms... 11 5.5. CommunicateHOST... 12 1
1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受け渡すために 送信側が 1bit ずつ送り出し 受信側が 1bit ずつ取り込みます 通常 UART という場合 送受信のために 送信と受信に一本ずつ信号線を使用します また 送受信する機器同士の GND を接続します というわけで 信号線は 最低 3 本接続することになります 詳しくは UART( 非同期シリアル通信 ) の説明 をご覧ください 2. UART に使用する信号 STM32L-Discovery の UART( 非同期シリアル通信 ) に使用する信号と接続相手との接続は以下の通りです 1) UART1 接続信号表 STM32L-Discovery の UART 信号 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 P2-22 --- > RxD 2 2 USART1_RX PA10 P2-21 < --- TxD 3 3 GND GND P1-2, P1-9, P1-28 P2-2, P2-5, P2-28 < --- > GND 5 D-SUB 9S ストレート接続 2) RS232C ドライバ接続例 この例では DSUB-9S には TxD, RxD, GND の 3 本の信号以外は接続されません 2
3) PC との接続例 PC との接続は以下のようになります PC A USB ケーブル : 電源供給および ST-LINK のため USB ポート STM32L-Discovery MiniB RS232C ドライバ RS232C 変換ケーブル DSUB-9S 図 2. 3) RS232C ドライバと DSUB-9S との接続は以下の通りです RS232C ドライバ DSUB-9S 1 RS1_TxD --- > 2 RxD 2 RS1_RxD < --- 3 TxD 3 GND < --- > 5 GND 3
3. プログラム実行時の動作と確認 3.1. 実行時の動作 1) プログラムを実行すると基板上の LED LD3( 緑 ) が 1 秒点灯 2 秒消灯で点滅します 2) UART1 ポートで LED0 ON/OFF コマンド以外のデータを受信するとエコーバックします 3) UART1 ポートで LED0 ON/OFF コマンドを受信すると 基板上の LED LD4( 青 ) の点灯 / 消灯を行います 3.2. 動作確認 UART( 非同期シリアル通信 ) のツール Access_SerialPort アプリケーションを使用して CPU 基板の送受信の確認 およびコマンド文字列を送信して基板上の LED LD4( 青 ) の点灯 / 消灯を行います 1) Access_SerialPort アプリケーションの起動画面まず PC と STM32L-Discovery とを RS232C インターフェースで接続してください Access_SerialPort アプリケーションを起動すると以下のダイアログが表示されます 4
2) COM ポートと通信速度の選択 COM 選択の ComboBox で COM を選択します 確認のメッセージが表示されるので よい場合は [ はい (Y)] ボタンをクリックします 次ページに続く 5
この例では COM4 に設定しました とメッセージが表示されています 通信速度は 9600bps でよいのでこのままにしておきます 次ページに続く 6
3) 送信データのエコーバック送信データの TextBox に ASCII 文字列を入力して [ 送信 ] ボタンをクリックすると CPU 基板にデータが送信されます CPU 基板はデータを受信して そのデータをそのまま PC に送信します PC が受信したデータは受信データの部分に表示されます 上記の例では 送信データに How are you? と入力して [ 送信 ] ボタンをクリックした結果 エコーバックのデータが受信データの欄に表示されています 次ページに続く 7
4) 基板上の LED LD4( 青 ) の点灯 / 消灯基板上の LED LD4( 青 ) を点灯 / 消灯するコマンドは以下のようになります a) 点灯 LED0 ON b) 消灯 LED0 OFF 上記の例では LED0 ON を入力して [ 送信 ] ボタンをクリックした結果 STM32L-Discovery は LD4( 青 ) を点灯して OK : LED0 ON を応答データとして送信しました LD4( 青 ) を消灯したい場合は LED0 OFF を送信します 8
4. プロジェクトの構成プロジェクトを開いて 左側のプロジェクト エクスプローラーを開いた状態です 4.1. 独自に追加したソースフォルダ独自に追加したソースフォルダについて簡単に説明します 1) CommonModules 共通処理を記述しています 2) CommunicateHOST UART の通信処理を記述しています LED 点灯 / 消灯のコマンドを受信して処理を行います コマンド以外のデータを受信した場合はそのままデータを折り返し送信します 3) Handles Peripheral の設定などを行っています a) HandleTIM.h HandleTIM.c タイマ割り込みを使用するために タイマの初期設定を記述しています b) HandleUART.h HandleUART.c UART の初期設定と送受信の処理を記述しています 4) UserPrograms a) Status LED に使用している I/O の初期設定と点滅処理を記述しています b) LED0(LD3) の初期設定を記述しています 9
4.2. ソースフォルダ src のファイルフォルダ src の中の特に重要なファイルについて説明します 1) main.c main モジュールが記述されています プログラムはここから開始します I/O と UART の初期設定と UART の送受信モジュールの呼び出しを記述しています 2) stm32f4xx_it.c 割り込み処理を記述しています このプロジェクトでは Timer2 割り込みと UART1 の割り込み処理を記述しています 5. 主なモジュールの説明 5.1. HandleTIM 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); 10
5.2. HandleUART 1) UART の初期化 //UART1 初期化 void InitializeUART1(uint32_t uint32_baudrate); 5.3. main.c 1) 使用するクロックの初期化 void RCC_Configuration(void); 2) I/O の初期化 void Init_GPIOs(void); 5.4. UserPrograms 1) LED に使用する I/O の初期化 // Status LED ポート初期化 void InitializePortStatusLED(void); // LED0 ポート初期化 void InitializePortLED0(void); 2) StatusLED の点滅点滅一回の処理 //---------------------------------------------------------------- // Status LED 点滅 : 点灯 / 消灯切り替え //---------------------------------------------------------------- // Timer2 割り込み内で GLB_uint16_BlinkTimerStatusLED をデクリメントする // GLB_uint16_BlinkTimerStatusLED が 0 になった時 呼び出される //---------------------------------------------------------------- // 点灯 / 消灯を切り替えると同時に点灯時間 / 消灯時間をセットする //---------------------------------------------------------------- // 引数 : // uint16_t uint16_timeon : 点灯時間 // uint16_t uint16_timeoff : 消灯時間 //---------------------------------------------------------------- void BlinkStatusLED(uint16_t uint16_timeon, uint16_t uint16_timeoff); 11
5.5. CommunicateHOST 1) UART の初期化 //----------------------------------------------------------- // HOST 通信パラメータ初期化 //----------------------------------------------------------- // 引数 : // uint32_t uint32_baudrate : 通信速度 //----------------------------------------------------------- void InitializeCommunicateHOST(uint32_t uint32_baudrate) { //----------------------------------------------------------- //UART1 パラメータ初期化 //----------------------------------------------------------- defhostreceivetimeout = -1; defhostreceiveendtime = -1; //TimeOut OFF //Initialize EndTime defhostrxdelimiter = (uint8_t)0; //Set Value for TimeOut defhostreceivetimeoutval = -1; //TimeOut なし //Set Value for EndTime defhostreceiveendtimeval = 50; // 受信終了タイマ 50mSec defhostreadpointer = 0; defhostwritepointer = 0; } //---------------------------------- //UART1 初期化 : 通信速度設定 //---------------------------------- InitializeUART1(uint32_BaudRate); 2) HOST 通信処理受信処理を行い 受信コマンドを処理して応答データを送信します //------------------------------------------------------------ // HOST 通信処理 //------------------------------------------------------------ // 戻り値 : // -1 : 処理中 // 0 : 終了 //------------------------------------------------------------ int16_t CommunicateHOST(void); 12
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); 13
改訂履歴 V001 2014/02/05 初版 V002 2014/03/09 誤記訂正 V003 2014/03/26 誤記訂正 V004 2014/03/30 説明追加 14