300msec i/o port-bit7 -...
TRANSCRIPT
1
CoIDE用 tri_S_FreeRTOSの説明 V002 2014/04/04
無料で提供されている リアルタイムOS FreeRTOS を使用して、「飛石伝ひCPU基板」の UART 2の送受信により
I/O Portの bitをON/OFFするプログラムです。
FreeRTOS は http://www.freertos.org/ のサイトで提供されています。さまざまなCPUに対応しており、実績があり、
動作も安定しています。
tri_S_FreeRTOSプロジェクトサンプルでは FreeRTOSを組み込んで、タスクを起動させる形でプログラムを動作させて
みました。
コードサイズ制限なしで Freeの開発ツール CoIDE で作成したプロジェクトです。
プログラムの開始番地は 0x08010000 です。デバッグが可能です。
PCアプリケーションのAccess_SerialPortを使用して UART(非同期シリアル通信)送受信の試験を行うことができます。
目次
1. FreeRTOSについて ........................................................................................................................................................................................................................................ 2
1.1. CoIDE用 tri_S_FreeRTOSプロジェクトで使用するタスク ................................................................................................................................................. 2
2. UARTに使用する信号 .................................................................................................................................................................................................................................. 3
3. I/O bit出力に使用する信号 ...................................................................................................................................................................................................................... 5
4. プログラム実行時の動作と確認 ............................................................................................................................................................................................................... 6
4.1. 実行時の動作 ........................................................................................................................................................................................................................................ 6
4.2. 動作確認 .................................................................................................................................................................................................................................................. 6
1) Access_SerialPortアプリケーションの起動画面 .................................................................................................................................................................... 6
2) COMポートと通信速度の選択 ......................................................................................................................................................................................................... 7
3) 送信データのエコーバック ................................................................................................................................................................................................................. 9
4) I/O Portの bit ON/OFF.................................................................................................................................................................................................................... 10
5. プロジェクトの構成 ......................................................................................................................................................................................................................................... 11
5.1. 独自に追加したソースフォルダ ................................................................................................................................................................................................. 11
5.2. ルートのファイル ................................................................................................................................................................................................................................ 12
6. 主なモジュールの説明 .............................................................................................................................................................................................................................. 13
6.1. main.c ........................................................................................................................................................................................................................................................ 13
6.2. HandleTimer2 ...................................................................................................................................................................................................................................... 15
6.3. HandleUART ......................................................................................................................................................................................................................................... 16
6.4. UserPrograms ..................................................................................................................................................................................................................................... 17
6.5. CommunicateHOST .......................................................................................................................................................................................................................... 18
2
1. FreeRTOSについて
FreeRTOSは無料で提供されている、リアルタイムOSです。
FreeRTOS は http://www.freertos.org/ のサイトで提供されています。さまざまなCPUに対応しており、実績があり、
動作も安定しています。
リアルタイムOSはタスクの起動と待ち(一時停止)を行うことができ、それを使用してマルチタスク処理を実現できます。
1.1. CoIDE用 tri_S_FreeRTOSプロジェクトで使用するタスク
tri_S_FreeRTOSプロジェクトでは、実験として、割り込みの中から、UART2受信による受信データの処理と
Status LEDの点滅処理を起動してみます。
使用するタスクは次の3個です。
1) I/O Port-bit7のON/OFF
300mSec間隔で I/O Port-bit7をON/OFFします。LEDを接続すれば LEDが点滅します。
このタスクは一時停止(Suspend)しないで実行し続けます。
2) UART2の受信データの処理
受信割り込みでデータを受信したとき、受信終了タイマを起動して、タイマ割り込みで受信終了タイマの値が 0 になった時
受信終了とします。受信終了を検知したときに受信データ処理のタスクを起動します。
処理が終了したときタスクを一時停止(Suspend)状態にします。次に起動されるまで実行されません。
3) Status LEDの点滅処理の起動
タイマ割り込み内でStatus LEDの点灯/消灯タイマの値が 0 になった時、Status LEDの点滅処理を起動します。
処理が終了したときタスクを一時停止(Suspend)状態にします。次に起動されるまで実行されません。
3
2. UARTに使用する信号
「飛石伝ひCPU基板」の UART(非同期シリアル通信)に使用する信号と接続相手との接続は以下の通りです。
1) UART2 接続信号表
「飛石伝ひCPU基板」の UART信号表
番号 CPU機能名 CPU信号名 基板コネクタピン番号 接続相手の信号名
1 USART2_TX PA2 P2-40 --- > RxD
2 USART2_RX PA3 P2-39 < --- TxD
3 GND GND P1-1, P1-2, P1-5
P1-17, P1-49, P1-50
P2-1, P2-2, P2-50
< --- > GND
2) RS232C ドライバ接続例
4
3) 「飛石伝ひ I/F基板」を使用する場合
「飛石伝ひ I/F基板」はRS232C ドライバを搭載しています。
コネクタ P9-UART1を使用して PCなどとRS232C接続することができます。
(P9-UART1にCPUの USART2の信号が接続されています。まぎらわしくて、すみません。)
「飛石伝ひ I/F基板」の UART信号表
飛石伝ひ I/F基板
P9 ピン番号
信号名 CPU機能名 CPU信号名 飛石伝ひCPU基板
コネクタピン番号
接続相手の信号名
1 TxD USART2_TX PA2 P2-40 --- > RxD
2 RxD USART2_RX PA3 P2-39 < --- TxD
3 GND GND GND P1-1, P1-2, P1-5
P1-17, P1-49, P1-50
P2-1, P2-2, P2-50
< --- > GND
DSUB-9Sとの接続
飛石伝ひ I/F基板
P9 ピン番号
信号名 DSUB-9S 備考
1 TxD 2
2 RxD 3
3 GND 5
DSUB-9Sには上記の3本の信号以外は接続されていません。
PCとの接続は以下のようになります。
飛石伝ひ I/F基板 P9 D
SUB-9S
PC
RS232C変換ケーブル
飛石伝ひCPU基板
P3 P4
5
3. I/O bit出力に使用する信号
Command文字列を送信することにより、I/O bitの ON/OFF を行えます。
Command文字列以外のデータを送信した場合は、エコーバックします。
「飛石伝ひCPU基板」の I/O bit出力に使用する信号は以下の I/O Port0 bit0 – 7, I/ O Port1 bit0 - 7の 16本です。
1) I/O Port0信号表
飛石伝ひ I/F基板
P3 ピン番号
信号名 CPU機能名 CPU信号名 飛石伝ひCPU基板
コネクタピン番号
1 I/O_Port0-bit0 I/O PD0 P1-31
2 I/O_Port0-bit1 I/O PD1 P1-30
3 I/O_Port0-bit2 I/O PE14 P2-22
4 I/O_Port0-bit3 I/O PD3 P1-28
5 I/O_Port0-bit4 I/O PD4 P1-27
6 I/O_Port0-bit5 I/O PD5 P1-26
7 I/O_Port0-bit6 I/O PD6 P1-25
8 I/O_Port0-bit7 I/O PD7 P1-24
9 +3.3V ----- ----- -----
10 GND GND GND P1-1, P1-2, P1-5
P1-17, P1-49, P1-50
P2-1, P2-2, P2-50
2) I/O Port1信号表
飛石伝ひ I/F基板
P4 ピン番号
信号名 CPU機能名 CPU信号名 飛石伝ひCPU基板
コネクタピン番号
1 I/O_Port1-bit0 I/O PD8 P2-14
2 I/O_Port1-bit1 I/O PD9 P2-13
3 I/O_Port1-bit2 I/O PD10 P2-12
4 I/O_Port1-bit3 I/O PD11 P2-11
5 I/O_Port1-bit4 I/O PD12 P2-10
6 I/O_Port1-bit5 I/O PD13 P2-9
7 I/O_Port1-bit6 I/O PD14 P2-8
8 I/O_Port1-bit7 I/O PD15 P2-7
9 +3.3V ----- ----- -----
10 GND GND GND P1-1, P1-2, P1-5
P1-17, P1-49, P1-50
P2-1, P2-2, P2-50
6
4. プログラム実行時の動作と確認
4.1. 実行時の動作
1) プログラムを実行すると基板上の LED1(緑)が 1秒点灯、2秒消灯 で点滅します。
2) I/O Port1-bit7が300mSec間隔でON/OFFします。
3) UART2ポートで I/O Port bit ON/OFFコマンド以外のデータを受信するとエコーバックします。
4) UART2ポートで I/O Port bit ON/OFFコマンドを受信すると、指定された bitのON/OFFを行います。
4.2. 動作確認
UART(非同期シリアル通信)のツール Access_SerialPortアプリケーションを使用して、CPU基板の送受信の確認、
および コマンド文字列を送信して I/O Portの bitのON/OFFを行うことができます。
1) Access_SerialPortアプリケーションの起動画面
まず、PCと「飛石伝ひCPU基板」とをRS232Cインターフェースで接続してください。
Access_SerialPortアプリケーションを起動すると以下のダイアログが表示されます。
次ページに続く
7
2) COMポートと通信速度の選択
COM選択のComboBoxでCOMを選択します。
確認のメッセージが表示されるので、よい場合は [はい(Y)] ボタンをクリックします。
次ページに続く
8
この例では、”COM4に設定しました。” とメッセージが表示されています。
通信速度は 9600bpsでよいのでこのままにしておきます。
次ページに続く
9
3) 送信データのエコーバック
送信データのTextBoxにASCII文字列を入力して、[送信] ボタンをクリックすると、CPU基板にデータが送信されます。
CPU基板はデータを受信して、そのデータをそのまま PCに送信します。
PCが受信したデータは受信データの部分に表示されます。
上記の例では、送信データに “How are you?” と入力して [送信] ボタンをクリックした結果、エコーバックのデータが
受信データの欄に表示されています。
次ページに続く
10
4) I/O Portの bit ON/OFF
I/O Portの bit ON/OFFのコマンドは以下のようになります。
a) bit ONの場合
“Portx bitx ON”
b) bit OFFの場合
“Portx bitx OFF”
Portx は Port0 または Port1 の2通りです。
bitxは bit0 ~ bit7 の8通りです。
合計16bitをON/OFFすることができます。
注: tri_S_FreeRTOSプロジェクトでは I/O Port1-bit7 を300mSec間隔でON/OFFしているので、I/O Port1-bit7 に対して
bit ON/OFFコマンドを送信しても、制御できません。
上記の例では、”Port0 bit0 ON” を入力して [送信] ボタンをクリックした結果、CPU基板は I/O_Port0-bit0をHighに
して、”OK : Port0 bit0 ON” を応答データとして送信しました。
I/O_Port0-bit0を Lowにしたい場合は、”Port0 bit0 OFF” を送信します。
11
5. プロジェクトの構成
CoIDEで作成したプロジェクト tri_S_FreeRTOSを開いた状態を以下に示します。
5.1. 独自に追加したソースフォルダ
独自に追加したソースフォルダについて簡単に説明します。
1) CommonModules
共通処理を記述しています。
2) CommunicateHOST
UARTの通信処理を記述しています。I/O Port bit出力のコマンドを受信して処理を行います。
3) FreeRTOS_V753
リアルタイムOSである FreeRTOSのプログラムソースです。
4) Handles
Peripheralの設定などを行っています。
a) HandleTimer2.h HandleTimer2.c
タイマ割り込みを使用するために、タイマの初期設定を記述しています。
b) HandleUART.h HandleUART.c
UARTの初期設定と送受信の処理を記述しています。
5) UserPrograms
a) Status LED に使用している I/O の初期設定と点滅処理を記述しています。
b) I/O Port0 bit0 ~ bit7 と I/O Port1 bit0 ~ bit7の初期設定と、それぞれの bitのON/OFF処理を記述しています。
12
5.2. ルートのファイル
ルートの中の特に重要なファイルについて説明します。
1) main.c
mainモジュールが記述されています。プログラムはここから開始します。
クロックと I/Oの初期化を行った後、リアルタイムOSのタスクの登録と起動を行っています。
2) stm32f4xx_it.c
割り込み処理を記述しています。
このプロジェクトでは、Timer2割り込みと UART2の割り込み処理を記述しています。
13
6. 主なモジュールの説明
6.1. main.c
1) mainモジュール
クロックと I/Oを初期化した後、リアルタイムOSのタスクの登録して、タスクを起動します。
int main(void);
a) リアルタイムOSのタスクの登録
FreeRTOSの使い方は、簡単です。この例に示すように、タスクを登録して起動すれば、タスクに記述された処理を
実行してくれます。
この例では、TaskBとTaskCは一時停止(Suspend)させて、事象が発生したとき割り込み内から起動していますが、
一時停止(Suspend)しない場合は、1mSecごとにタスクを切り替えて平行に動作してくれます。
予備のTaskDとTaskEに処理を書いて実行させてみてください。
//--------------------------------------------------------------------------------
// RTOSのタスクの登録
//--------------------------------------------------------------------------------
//TaskA : I/O Port1-bit7 ON/OFF
//TaskB : HOST通信処理
//TaskC : Status LED点滅
//TaskD : suspend
//TaskE : suspend
//--------------------------------------------------------------------------------
xTaskCreate(prvTaskA, (signed portCHAR *) "TaskA", 256, NULL, 1, &xHandleA);
xTaskCreate(prvTaskB, (signed portCHAR *) "TaskB", 256, NULL, 1, &xHandleB);
xTaskCreate(prvTaskC, (signed portCHAR *) "TaskC", 256, NULL, 1, &xHandleC);
xTaskCreate(prvTaskD, (signed portCHAR *) "TaskD", 256, NULL, 1, &xHandleD);
xTaskCreate(prvTaskE, (signed portCHAR *) "TaskE", 256, NULL, 1, &xHandleE);
i) TaskA : I/O Port-bit7のON/OFF
300mSec間隔で I/O Port-bit7をON/OFFします。LEDを接続すれば LEDが点滅します。
このタスクは一時停止(Suspend)しないで実行し続けます。
ii) TaskB : UART2の受信データの処理
受信割り込みでデータを受信したとき、受信終了タイマを起動して、タイマ割り込みで受信終了タイマの値が 0 になった時
受信終了とします。受信終了を検知したときに受信データ処理のタスクを起動します。
処理が終了したときタスクを一時停止(Suspend)状態にします。次に起動されるまで実行されません。
iii) TaskC : Status LEDの点滅処理の起動
タイマ割り込み内でStatus LEDの点灯/消灯タイマの値が 0 になった時、Status LEDの点滅処理を起動します。
処理が終了したときタスクを一時停止(Suspend)状態にします。次に起動されるまで実行されません。
iv) TaskD : 登録のみです。 Suspend状態にしています。
v) TaskE : 登録のみです。 Suspend状態にしています。
14
b) タスクの起動
//----------------------------
// Start the scheduler. : RTOSのタスクの起動
//----------------------------
vTaskStartScheduler();
2) 使用するクロックの初期化
void RCC_Configuration(void);
3) I/Oの初期化
void Init_GPIOs(void);
4) Peripheralの初期化 : 使用する I/O出力ポートとTimer2の初期化を行っています。
//-------------------------------
// 各Peripheralの初期化
//-------------------------------
void InitializeHandler(void);
5) TaskA
//---------------------------------------------
// RTOS : Task A : I/O Port1-bit7 ON/OFF
//---------------------------------------------
void prvTaskA(void *pvParameters);
6) TaskB
//---------------------------------------------
// RTOS : Task B : HOST通信処理
//---------------------------------------------
void prvTaskB(void *pvParameters);
7) TaskC
//---------------------------------------------
// RTOS : Task C : Status LED点滅
//---------------------------------------------
void prvTaskC(void *pvParameters);
8) TaskD : 予備
9) TaskE : 予備
15
6.2. HandleTimer2
1) Timer2初期化
//------------------------------------------------------------------------------
//Timer2初期化
//------------------------------------------------------------------------------
//引数 :
// uint16_t uintTIM_Pulse1 : Timer2 CH1 インターバル
// uint16_t uintTIM_Pulse2 : Timer2 CH2 インターバル
// uint16_t uintTIM_Pulse3 : Timer2 CH3 インターバル
// uint16_t uintTIM_Pulse4 : Timer2 CH4 インターバル
//------------------------------------------------------------------------------
void InitializeTimer2(uint16_t uintTIM_Pulse1, uint16_t uintTIM_Pulse2,
uint16_t uintTIM_Pulse3, uint16_t uintTIM_Pulse4);
2) Timer2割り込み禁止
//Timer2割り込み禁止
void DisableIrqTim2(void);
3) Timer2割り込み許可
//Timer2割り込み許可
void EnableIrqTim2(void);
16
6.3. HandleUART
1) UARTの初期化
//UART2初期化
void InitializeUART2(uint32_t ulngBaudRate);
2) UART送信
設定された送信データを送信します。
//------------------------------------------------------------------
//UART2 送信処理
//------------------------------------------------------------------
//引数 :
// uint16_t uintLength : 送信データ数
// uint8_t *puchrData : 送信データのポインタ
//戻り値 :
// 0 : 送信終了
// 1 : エラー
//------------------------------------------------------------------
void SendUART2(uint16_t uintLength, uint8_t *puchrData);
3) UART受信
受信の有無をチェックして、受信があったら受信データを受信Bufferに格納して受信データ数を返します。
//------------------------------------------------------------------
//UART2 受信処理
//------------------------------------------------------------------
//引数 :
// uint8_t *puchrReceiveBuffer : 受信データを格納するBufferのポインタ
//戻り値 :
// -1 : 受信なし
// 0 : 受信なし
// 1以上 : 受信byte数
//------------------------------------------------------------------
int16_t ReceiveUART2(uint8_t *puchrReceiveBuffer);
17
6.4. UserPrograms
1) LEDに使用する I/Oの初期化
//Status LEDポート初期化
void InitializePortStatusLED(void);
//Action LEDポート初期化
void InitializePortActionLED(void);
2) StatusLEDの点滅
点滅一回の処理
//Status LED点滅
void BlinkStatusLED(uint16_t uintTimeON, uint16_t uintTimeOFF);
3) I/O Port0 bit0 ~ bit7 と I/O Port1 bit0 ~ bit7の初期化
//----------------------------------------------------------------
// I/O Port初期化 : Port0 bit0 - 7 and Port1 bit0 - 7
//----------------------------------------------------------------
void InitializePortIO(void);
4) I/O Port bitのON/OFF処理
//----------------------------------------------------------------
// I/O Port bit出力
//----------------------------------------------------------------
//引数 :
// uint16_t uintPort : I/O Port指定
// uint16_t uintBit : bit指定
// uint16_t uintOnOff : ON/OFF指定
//戻り値 :
// 0 : OK
// 0以外 : NG
//----------------------------------------------------------------
int16_t OutputBitIO(uint16_t uintPort, uint16_t uintBit, uint16_t uintOnOff)
18
6.5. CommunicateHOST
1) UARTの初期化
//-----------------------------------------------------------
// HOST通信パラメータ初期化
//-----------------------------------------------------------
//引数 :
// uint32_t ulngBaudRate : 通信速度
//-----------------------------------------------------------
void InitializeCommunicateHOST(uint32_t ulngBaudRate);
2) HOST通信処理
受信処理を行い、受信コマンドを処理して応答データを送信します。
//------------------------------------------------------------
// HOST通信処理
//------------------------------------------------------------
//戻り値 :
// -1 : 処理中
// 0 : 終了
//------------------------------------------------------------
int16_t CommunicateHOST(void)
3) HOSTコマンドの実行
受信コマンドを判定してそれぞれの処理モジュールを呼び出します。
//------------------------------------------------------------------------------------
// HOSTコマンドを実行する。
//------------------------------------------------------------------------------------
//引数 :
// uint16_t uintReceiveLength : 受信データ数
// uint8_t *puchrReceiveData : 受信データが格納されているBufferのポインタ
// uint8_t *puchrSendData : 応答送信データを格納するBufferのポインタ
//戻り値 : 応答送信データ数
//------------------------------------------------------------------------------------
uint16_t ExecuteCommandHOST(uint16_t uintReceiveLength, uint8_t *puchrReceiveData,
uint8_t *puchrSendData);
19
4) I/O Command判定と実行
コマンドを解釈して、I/O Port の bitをON/OFFします。
//------------------------------------------------------------------------------------
// I/O Command判定と実行
//------------------------------------------------------------------------------------
//引数 :
// uint16_t uintReceiveLength : 受信データ数
// uint8_t *puchrReceiveData : 受信データが格納されているBufferのポインタ
// uint8_t *puchrSendData : 応答送信データを格納するBufferのポインタ
//戻り値 : 応答送信データ数
//------------------------------------------------------------------------------------
uint16_t CheckAndExeCommandIO(uint16_t uintReceiveLength, uint8_t *puchrReceiveData,
uint8_t *puchrSendData);
5) I/O bitのON/OFF処理
指定bitのON/OFFを行い応答送信データをセットします。
//---------------------------------------------------------------------
// I/O bit ON/OFF処理
//---------------------------------------------------------------------
//引数 :
// uint16_t uintPort : I/O Port指定
// uint16_t uintBit : bit指定
// uint16_t uintOnOff : ON/OFF指定
// uint8_t *puchrSendData : 応答データを格納するBufferのポインタ
//戻り値 : 応答送信データ数
//---------------------------------------------------------------------
uint16_t ComActOutputBit(uint16_t uintPort, uint16_t uintBit, uint16_t uintOnOff,
uint8_t *puchrSendData);
20
改訂履歴
V001 2013/12/26 初版
V002 2014/04/04 誤記訂正