truestudio 用 l152cd lps u1 の説明 v001 …tri-s.world.coocan.jp/.../project_l152cd_lps_u1.pdf1...
TRANSCRIPT
1
TrueSTUDIO用 L152CD_LPS_U1の説明 V001 2014/10/19
STM32L152C-DISCOに搭載されているCPU STM32L152RCの最大の特徴である超低消費電力モードを使用する
プロジェクトサンプルです。
RTCを使用して指定時刻を判定して指定時刻なら指定された処理に分岐するプログラムです。
CPUの動作周波数を32.768KHzにして Low Power Sleepモードに移行します。
RTCの 1秒割り込みで起床して時刻を判定します。指定時刻でない場合、またすぐに Low Power Sleepモードに移行します。
指定された時刻だった場合、CPUの動作周波数を32MHzにして指定モジュールを呼び出します。
処理が終了したら、動作周波数を32.768KHzにして再度Low Power Sleepモードに移行します。
時刻の判定には次の3種類があります。
1) 正時インターバルを最大2個指定することができます。指定した時刻に指定モジュールを呼び出します。
2) 定刻を指定を最大2個指定することができます。毎日、指定した時刻に指定モジュールを呼び出します。
3) 日付・時刻を最大2個指定することができます。指定した日付・時刻に指定モジュールを呼び出します。
指定モジュールでは、とりあえず LED LD4(青)を点滅させています。
ユーザーが指定モジュール内のプログラムを記述することにより希望の処理を実現できます。
指定時刻の設定は、アプリケーションAccess_Timetableにより行います。
RS232CでPCと STM32L152C-DISCOとを接続して UART(非同期シリアル通信)により設定します。
アプリケーションAccess_Timetableは本プロジェクトサンプルTrST_L152CD_LPS_U1掲載のページでダウンロードできます。
プロジェクトの開始番地は 0x08000000 です。デバッグが可能です。
2
目次
1. 指定処理への分岐と指定時刻について.............................................................................................................................................................................................. 4
1.1. 時刻による指定処理への分岐 ..................................................................................................................................................................................................... 4
1.2. 指定時刻について ............................................................................................................................................................................................................................... 4
1) 正時インターバル ................................................................................................................................................................................................................................... 4
2) 定刻................................................................................................................................................................................................................................................................ 4
3) 日付・時刻 .................................................................................................................................................................................................................................................. 4
2. RS232Cの UART(非同期シリアル通信)による接続 .................................................................................................................................................................... 5
2.1. UART信号 .............................................................................................................................................................................................................................................. 5
2.2. RS232C ドライバ................................................................................................................................................................................................................................... 5
2.3. RS232Cケーブル接続図 ............................................................................................................................................................................................................... 6
2.4. UART通信確認のための接続例 ................................................................................................................................................................................................ 6
3. プログラム実行時の動作と確認 ............................................................................................................................................................................................................... 7
3.1. プログラム実行時の動作 ................................................................................................................................................................................................................. 7
3.2. 動作確認 .................................................................................................................................................................................................................................................. 7
3.3. 消費電流 .................................................................................................................................................................................................................................................. 7
3.4. Sleep時のデバッグについて .......................................................................................................................................................................................................... 8
4. 指定時刻設定アプリケーションAccess_Timetableのインストール .................................................................................................................................... 10
4.1. アプリケーションAccess_Timetableのインストールファイルのダウンロード ....................................................................................................... 10
4.2. ダウンロードした圧縮ファイルAccess_Timetable_Install.zipの解凍 ........................................................................................................................ 10
4.3. アプリケーションAccess_Timetableのインストール........................................................................................................................................................ 11
5. アプリケーションAccess_Timetableによる指定時刻の設定 ................................................................................................................................................. 12
5.1. アプリケーションAccess_Timetableの起動 ........................................................................................................................................................................ 12
5.2. COMポートの選択 ............................................................................................................................................................................................................................ 13
5.3. RTCの時刻設定 ............................................................................................................................................................................................................................... 15
1) RTCの時刻取得 .................................................................................................................................................................................................................................. 15
2) RTCの時刻設定 .................................................................................................................................................................................................................................. 16
5.4. 指定できる時刻の種類 .................................................................................................................................................................................................................. 17
1) 正時インターバル ................................................................................................................................................................................................................................ 17
2) 定刻............................................................................................................................................................................................................................................................. 17
3) 日付・時刻 ............................................................................................................................................................................................................................................... 17
5.5. 正時インターバルの設定 .............................................................................................................................................................................................................. 17
1) 正時インターバルの選択 ................................................................................................................................................................................................................. 17
2) 正時インターバルとオフセットの設定 ........................................................................................................................................................................................ 18
5.6. 定刻の設定 .......................................................................................................................................................................................................................................... 19
1) 定刻の選択 ............................................................................................................................................................................................................................................. 19
2) 定刻の設定 ............................................................................................................................................................................................................................................. 19
5.7. 日付・時刻の設定 ............................................................................................................................................................................................................................. 20
1) 日付・時刻の選択 ................................................................................................................................................................................................................................ 20
2) 日付・時刻の設定 ................................................................................................................................................................................................................................ 21
5.8. モジュール分岐のON/OFFの設定 ....................................................................................................................................................................................... 22
5.9. CPU基板への時刻パラメータTimetableの設定 ............................................................................................................................................................ 22
5.10. CPU基板に設定されているTimetableの取得 ............................................................................................................................................................. 23
5.11. 時刻パラメータをファイルに保存 .......................................................................................................................................................................................... 23
5.12. 時刻パラメータファイルを読み込む。 ................................................................................................................................................................................ 25
6. プロジェクトの構成 ......................................................................................................................................................................................................................................... 26
6.1. プロジェクト L152CD_LPS_U1の起動画面........................................................................................................................................................................... 26
6.2. 追加したソース・フォルダとファイル........................................................................................................................................................................................ 26
6.3. 指定時刻による対応モジュールへの分岐 ......................................................................................................................................................................... 27
3
1) 指定時刻と対応モジュール ........................................................................................................................................................................................................... 27
7. 主なモジュールの説明 .............................................................................................................................................................................................................................. 28
7.1. ソース・フォルダ src内のファイル ........................................................................................................................................................................................... 28
7.2. HandleCLK............................................................................................................................................................................................................................................. 30
7.3. HandleEEPROM ................................................................................................................................................................................................................................... 30
7.4. HandleGPIO ........................................................................................................................................................................................................................................... 31
7.5. HandleRTC ............................................................................................................................................................................................................................................ 31
7.6. HandleTIM .............................................................................................................................................................................................................................................. 33
7.7. HandleUART ......................................................................................................................................................................................................................................... 34
7.8. UserPrograms ..................................................................................................................................................................................................................................... 35
7.9. Communicate_UART ........................................................................................................................................................................................................................ 39
4
1. 指定処理への分岐と指定時刻について
1.1. 時刻による指定処理への分岐
プロジェクト L152CD_LPS_U1では、RTCの 1秒ごとの割り込みで指定時刻であるかを判定して、
その時刻であれば指定処理へ分岐します。
指定時刻の設定はPCと STM32L152C-DISCOとをRS232Cで接続し、アプリケーションAccess_Timetableを使用して
UART(非同期シリアル通信)により行います。
アプリケーションAccess_Timetableは本プロジェクトサンプルTrST_L152CD_LPS_U1掲載のページでダウンロードできます。
1.2. 指定時刻について
指定時刻には次の 3種類があります。
1) 正時インターバル
正時とは時計のそれぞれの時刻の 00分00秒 のことをいいます。
1日を24時間であらわすと 00時00時00分、01時00分00秒、02時00分00秒、 ・・・
・・・ 22時00分00秒、23時00分00秒
のことをいいます。
インターバルを 60分にすれば、そのまま 24回、インターバルを 120分にすれば
00時00時00分、02時00分00秒、04時00分00秒、 ・・・ 20時00分00秒、22時00分00秒
の 12回が指定時刻になりその時刻に指定モジュールを呼び出します。
正時インターバルは2個指定できます。指定した時刻に指定モジュールを呼び出します。
2) 定刻
hh時mm分ss秒 を指定してください。
毎日 1回 指定した時刻に指定モジュールを呼び出します。
定刻は2個指定できます。指定した時刻に指定モジュールを呼び出します。
3) 日付・時刻
未来のYYYY年MM月DD日 hh時mm分ss秒を指定してください。
指定した日付・時刻になったときに1回だけ指定モジュールを呼び出します。
日付・時刻は2個指定できます。指定した日付・時刻に指定モジュールを呼び出します。
5
2. RS232CのUART(非同期シリアル通信)による接続
STM32L152C-DISCOの UART(非同期シリアル通信)に使用する信号と接続相手との接続は以下の通りです。
2.1. UART信号
UART信号表
番号 CPU機能名 CPU信号名 基板コネクタピン番号 方向 接続相手の
信号名
1 USART1_TX PA9 P2-22 --- > RxD
2 USART1_RX PA10 P2-21 < --- TxD
3 GND GND P1-2, P1-9, P1-28
P2-2, P2-5, P2-28
< --- > GND
GNDは、いずれかの 1ピンに接続すればOKです。
UART信号にRS232C ドライバを接続して RS232Cレベルの信号どうしで接続すればRS232C通信を行うことが
できます。
2.2. RS232Cドライバ
RS232C ドライバの例を以下に示します。
RS232Cストレートケーブル接続の場合の DSUB-9Sへの接続例を以下に示します。
この例ではDSUB-9SにはTxD, RxD, GNDの3本の信号以外は接続されません。
番号 RS232C
ドライバ
方向 ドライバ側
D-SUB 9S
ストレートケーブル側
D-SUB 9P
1 RS1_TxD --- > 2 2 RxD
2 RS1_RxD < --- 3 3 TxD
3 GND < --- > 5 5 GND
6
2.3. RS232Cケーブル接続図
2.4. UART通信確認のための接続例
アプリケーション Access_Timetableを使用して、UART(非同期シリアル通信)によりCPUにアクセスします。
PCからコマンド文字列を送信してCPU内蔵の RTCに対して日付・時刻の設定と取得を行います。
また、CPU内蔵の EEPROMに対して時刻パラメータの書き込みおよび取得を行います。
動作確認を行うための接続は以下のようになります。この例はRS232Cレベルで UART信号を接続しています。
STM32L152C-DISCO
RS232C
ドライバ
DSUB-9S
DSUB-9P
DSUB-9S
ストレートケーブル
接続機器
(PCなど)
図2.3.
RS232C
ドライバ DSUB-9S
PC
RS232C変換ケーブル
STM32L152C-DISCO
図2.4.
USBポート
USBケーブル : 電源供給 および ST-LINKのため A
MiniB
7
3. プログラム実行時の動作と確認
3.1. プログラム実行時の動作
1) プログラムを実行すると基板上の LED LD3(緑)が 3秒に1回 チカっと点灯します。
Low Power Sleepモードから起床して LD3(緑)を点灯し、すぐに消灯して再び Low Power Sleepモードになります。
指定時刻の処理がある場合は、処理が終了するまでSleepしません。
2) アプリケーションAccess_Timetableを使用して、時刻を設定します。
プログラムは指定時刻になるとその指定時刻に対応する処理モジュールを呼び出します。
それぞれの呼び出す処理モジュールの動作は以下の通りです。
a) 正時インターバル0 の時刻で呼び出すモジュールの処理 LD4(青) 点滅間隔100mSec 点滅5回
b) 正時インターバル1 の時刻で呼び出すモジュールの処理 LD4(青) 点滅間隔100mSec 点滅10回
c) 定刻0 の時刻で呼び出すモジュールの処理 LD4(青) 点滅間隔200mSec 点滅4回
d) 定刻1 の時刻で呼び出すモジュールの処理 LD4(青) 点滅間隔200mSec 点滅8回
e) 日付・時刻0 の時刻で呼び出すモジュールの処理 LD4(青) 点滅間隔400mSec 点滅3回
f) 日付・時刻1 の時刻で呼び出すモジュールの処理 LD4(青) 点滅間隔400mSec 点滅6回
3) CPUの動作
a) CPUは通常Low Power Sleepモードになっています。その時の動作周波数は32.768kHzです。
b) RTCによる割り込みで1秒に一回起床します。起床すると動作周波数を32MHzにして指定時刻であるかを判定します。
c) 指定時刻であった場合、対応する処理モジュールを呼び出します。
d) 処理が終了すると、再び Low Power Sleepモードに移行します。
e) Low Power Sleepモードのとき、USART1_RX(PA10)のピンは入力に設定されていて信号の立ち上がりエッジで
外部割込みを発生するように設定されます。
f) 外部割込みが4回発生すると動作周波数を32MHzにして、UART1の初期化を行い通信可能になります。
g) 通信が終了すると、再び Low Power Sleepモードに移行します。
3.2. 動作確認
アプリケーションAccess_Timetableを使用して、指定時刻を設定します。
指定した時刻に上述のそれぞれの LD4(青)の動作を行うかを確認します。
アプリケーションAccess_Timetableのインストールと指定時刻の設定については後述します。
3.3. 消費電流
a) Low Power Sleepモードのとき : 50μA未満
b) 動作周波数32MHzのとき : 約12mA
8
3.4. Sleep時のデバッグについて
Sleep時にST-LINKとの接続を保ってデバッグする方法があります。
1) Sleep前に呼び出すモジュール
以下のモジュールを読み出すことにより、Sleepモード時に debugger(ST-LINK)との接続が保たれます。
//-----------------------------------------------------------------
// Keep debugger connection during SLEEP mode
//-----------------------------------------------------------------
// Sleep状態でもデバッガとの接続が切れないようにすることができる。
//-----------------------------------------------------------------
// ただし、ブレークポイントの設定と解除は、実行が中断しているときに行う必要がある。
//-----------------------------------------------------------------
DBGMCU_Config(DBGMCU_SLEEP, ENABLE);
2) Sleep後、起床時に呼び出すモジュール
以下のように引数にDISABLEを指定して、keep debugger connectionを解除します。
// Keep debugger connection during SLEEP mode
DBGMCU_Config(DBGMCU_SLEEP, DISABLE);
3) ブレークポイントの設定について
ブレークポイントの設定と解除は、プログラム実行の中断中に行う必要があります。
実行中にブレークポイントを設定しても、正常にブレークしません。
実行開始前に、ブレークポイントを設定しておいて、ブレークがかかったら、その実行中断中に他のブレークポイントの
設定や、ブレークポイントの解除を行うと、うまくデバッグを行うことができます。
4) 不安定な要素
STM32L152C-DISCOではSleepモードに移行するためのモジュール
PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_SLEEPEntry_WFI);
を実行すると、CPUが動作しなくなります。
現在は、このモジュールをコメントアウトしています。
Sleepモードに移行しなくても、CPUの動作周波数は32.768kHzなので、消費電流は50μA未満になります。
//------------------------------------------------------------------
// Release ModeでBuildしたとき、このモジュールを実行するとCPUが動作しなくなる。
//------------------------------------------------------------------
// STM32L152C-DISCO(STM32L152RC)では、このモジュールを実行するとCPUが動作しなくなる。
//------------------------------------------------------------------
// Request to enter SLEEP mode with regulator in low power mode
// PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_SLEEPEntry_WFI);
//------------------------------------------------------------------
9
5) Low Powerモードに移行せずにデバッグするために
ソースフォルダ Handlesの下の HandleLowPower.hにある以下の定義を生かすと Low Powerモードに移行せずに
デバッグを行うことができます。
動作周波数が32MHzのままになるので、LD3(緑)の点滅は、見えなくなります。
Low Powerモード以外の基本的なデバッグを行う場合に使用してください。
//---------------------------------------------------------
// Low Powerのデバッグ時宣言する。 : SYSCLKを32MHzのままにして
// Low Powerモードに移行しない。
//---------------------------------------------------------
//#define defDebug_LowPower
//---------------------------------------------------------
10
4. 指定時刻設定アプリケーションAccess_Timetableのインストール
4.1. アプリケーションAccess_Timetableのインストールファイルのダウンロード
アプリケーションAccess_Timetableをインストールするための圧縮ファイルが掲載されているページから
Access_Timetable_Install.zipをダウンロードしてください。(本プロジェクトサンプルと同一のページに掲載されています。)
4.2. ダウンロードした圧縮ファイルAccess_Timetable_Install.zipの解凍
ダウンロードした圧縮ファイルAccess_Timetable_Install.zipがフォルダ tri_S_Downloadにあるものとして説明します。
フォルダ内のAccess_Timetable_Install.zipを選択した状態で右クリックするとポップアップメニューが開きます。
メニューの一番上の {開く(O)} をクリックすると圧縮ファイルが解凍されて次ページのように解凍されたファイルが
作成されます。
11
4.3. アプリケーションAccess_Timetableのインストール
Access_Timetable_Install.zipをダウンロードして解凍すると、下図のようにフォルダAccess_Timetable_Installの下に
インストールのためのファイルが格納されています。
setup.exeをダブルクリックすると次の警告のダイアログが開きます。
[インストール(I)] ボタンをクリックしてインストールしてください。
アプリケーションがインストールされて、自動的にアプリケーションAccess_Timetableを実行して次のフォームが
表示されます。
12
RS232Cケーブルを接続している場合、”COM(シリアルポート)を検索しました。” と表示されます。
5. アプリケーションAccess_Timetableによる指定時刻の設定
STM32L152C-DISCOがプロジェクト L152CD_LPS_U1を実行しているものとします。
5.1. アプリケーションAccess_Timetableの起動
スタートメニューから { Access_Timetable } をクリックすると次ページのアプリケーションAccess_Timetableの
フォームが表示されます。
13
5.2. COMポートの選択
COM選択のComboBoxで COMポートを選択してください。
選択すると次ページのメッセージが表示されます。
14
よい場合は、[はい(Y)] ボタンをクリックしてください。
この例では 「COM4に設定しました。」 とメッセージが表示されています。
通信速度は115200bpsです。
15
5.3. RTCの時刻設定
1) RTCの時刻取得
RTCの時刻を読んでみます。
[ 時刻取得 ] ボタンをクリックしてください。時刻が読み込まれて次のように動作メッセージの部分に表示されます。
RTCがバックアップされていない初期状態では、日付・時刻が 2000/01/01 00:00:00 から開始します。
16
2) RTCの時刻設定
[ 時刻設定 ] ボタンをクリックすると PCの日付・時刻がRTCに設定されます。
動作メッセージの欄に ”時刻を設定しました。“ と表示されています。再度 [ 時刻取得 ] ボタンをクリックして確認して
みます。
今度は設定した時刻が表示されました。
17
5.4. 指定できる時刻の種類
指定時刻には次の 3種類があります。
1) 正時インターバル
正時とは時計のそれぞれの時刻の 00分00秒 のことをいいます。
1日を24時間であらわすと 00時00時00分、01時00分00秒、02時00分00秒、 ・・・
・・・ 22時00分00秒、23時00分00秒
のことをいいます。
インターバルを 60分にすれば、そのまま 24回、インターバルを 120分にすれば
00時00時00分、02時00分00秒、04時00分00秒、 ・・・ 20時00分00秒、22時00分00秒
の 12回が指定時刻になり処理を起動します。
正時インターバルは2個指定できます。指定した時刻に指定モジュールを呼び出します。
2) 定刻
指定した時刻が毎日 1回 指定時刻になり処理を起動します。 hh時mm分ss秒 を指定します。
定刻は2個指定できます。指定した時刻に指定モジュールを呼び出します。
3) 日付・時刻
指定した日付・時刻に 1回だけ処理を起動します。未来のYYYY年MM月DD日 hh時mm分ss秒 を指定します。
日付・時刻は2個指定できます。指定した日付・時刻に指定モジュールを呼び出します。
5.5. 正時インターバルの設定
1) 正時インターバルの選択
正時インターバルは TaskIH00 ~ TaskIH01 の 2個です。TaskIHのComboBoxで選択します。
18
2) 正時インターバルとオフセットの設定
正時インターバルはインターバルとオフセットの TextBoxに値を秒単位で入力して設定します。
インターバルは最小値10秒で、オフセットはインターバルの値未満にします。
正時に対するオフセットを正負の値で指定することができます。インターバルに3600秒を設定して、
オフセットに -5 を設定した場合は hh時59分55秒 に
オフセットに 5 を設定した場合は hh時00分05秒 にTaskが起動します。
[ 設定 ] ボタンをクリックしたときにTextBoxに入力した値が有効になります。
この例では、選択したTaskIH 00を設定しました。 とメッセージが表示されています。
19
5.6. 定刻の設定
1) 定刻の選択
定刻は TaskFT00 ~ TaskFT01 の 2個です。TaskFTのComboBoxで選択します。
2) 定刻の設定
定刻は 時:分:秒 のTextBoxに hh:mm:ss の形で入力します。
20
毎日 15時20分35秒にTaskを起動したい場合は、15:20:35 を 時:分:秒 のTextBoxに入力します。
[ 設定 ] ボタンをクリックしたときにTextBoxに入力した値が有効になります。
この例では、選択したTaskFT 00を設定しました。 とメッセージが表示されています。
5.7. 日付・時刻の設定
1) 日付・時刻の選択
日付・時刻は TaskDT00 ~ TaskDT01 の 2個です。TaskDTのComboBoxで選択します。
21
2) 日付・時刻の設定
日付・時刻は 年/月/日 時:分:秒 のTextBoxに YYYY/MM/DD hh:mm:ss の形で入力します。
2014年10月17日 15時30分00秒にTaskを起動したい場合は、2014/10/17 15:30:00 を
年/月/日 時:分:秒 のTextBoxに入力します。
[ 設定 ] ボタンをクリックしたときにTextBoxに入力した値が有効になります。
この例では、選択したTaskDT 00を設定しました。 とメッセージが表示されています。
処理をONに設定するとCPU基板ではその日付・時刻に実行します。処理を実行するとCPUは処理フラグをOFFにします。
22
5.8. モジュール分岐のON/OFFの設定
正時インターバル、定刻、日付・時刻 それぞれの部分のON/OFFの RadioButtonでモジュール分岐のON/OFFを
設定します。
プロジェクト分岐ON/OFFの設定もそれぞれの [ 設定 ] ボタンをクリックしたときに有効になります。
5.9. CPU基板への時刻パラメータTimetableの設定
時刻パラメータTimetableはCPU基板に設定しないと、動作しません。
[ Timetable設定 ] ボタンをクリックするとCPU基板に、設定した時刻パラメータが設定されます。
正常に書き込みが行われると動作メッセージの欄に “Taskパラメータを設定しました。” と表示されます。
23
5.10. CPU基板に設定されているTimetableの取得
[ Timetable取得 ] ボタンをクリックするとCPU基板に設定されている時刻パラメータTimetableを取得できます。
正常に取得できると、動作メッセージの欄に “Taskパラメータを取得しました。” と表示されます。
5.11. 時刻パラメータをファイルに保存
設定したTask起動のための時刻パラメータをファイルに保存することができます。
ファイルの [ 保存 ] ボタンをクリックすると、保存場所の選択ダイアログが表示されます。
24
保存したいフォルダを指定して [ 保存(S) ] ボタンをクリックすると設定した時刻パラメータを保存することができます。
ファイルの保存に成功すると上記のメッセージが表示されます。
25
5.12. 時刻パラメータファイルを読み込む。
ファイルの [ 読み込み ] ボタンをクリックすると、次ページのファイル選択ダイアログが表示されます。
時刻パラメータのファイルを選択して [ 開く(O) ] ボタンをクリックするとファイルからパラメータを読み込んで
Access_Timetableの画面に表示します。
正常に読み込めた場合、次のメッセージが表示されます。
[ OK ] ボタンをクリックして閉じてください。
26
6. プロジェクトの構成
6.1. プロジェクト L152CD_LPS_U1の起動画面
TrueSTUDIOで作成したプロジェクト L152CD_LPS_U1を開いた状態を以下に示します。
左側のプロジェクト・エクスプローラーの L152CD_LPS_U1を展開した状態です。
6.2. 追加したソース・フォルダとファイル
追加したソース・フォルダとファイルについて簡単に説明します。
1) CommonModules (ソース・フォルダ)
共通に使用するモジュールを記述してあります。
時間待ち、文字列操作 などの処理を記述しています。
2) Communicate_UART (ソース・フォルダ)
a) Communicate_UART .h Communicate_UART .c (ファイル)
接続相手との通信処理を記述しています。
コマンドを受信して、RTCの日付・時刻の設定 または 日付・時刻データの送信を行います。
3) Handles (ソース・フォルダ)
Peripheralの設定などを行っています。
a) HandleCLK.h HandleCLK.c (ファイル)
内部クロックMSIと HSIを使用するための設定を記述しています。
Low Power Sleepモード時はMSIを使用して動作周波数を32.768kHzにします。
高速動作時はHSI(周波数16MHz)を入力して PLLにより32MHzにしてシステムクロック SYSCLKとして使用します。
27
b) HandleEEPROM.h HandleEEPROM.c (ファイル)
CPU内部の EEPROMへの書き込み処理を記述しています。
c) HandleGPIO.h HandleGPIO.c (ファイル)
GPIO入出力の初期設定を記述しています。
d) HandleLowPower.h HandleLowPower.c (ファイル)
Low Power Sleepモードへの移行処理と、高速動作モードへの移行処理を記述しています。
e) HandleRTC.h HandleRTC.c (ファイル)
RTCの初期化を行います。
f) HandleTIM.h HandleTIM.c (ファイル)
タイマ割り込みを使用するために、タイマの初期設定を記述しています。
1mSecごとにタイマ割り込みが発生するように設定しています。
g) HandleUART.h HandleUART.c (ファイル)
UARTの初期化と UART送受信の処理を記述しています。
4) UserPrograms (ソース・フォルダ)
a) ScheduledJobs.h ScheduledJobs.c (ファイル)
指定時刻に呼び出されるモジュールの雛形が記述されています。
b) TimeScheduled.h TimeScheduled.c (ファイル)
指定時刻を判定して、その時刻と一致した場合、対応する処理モジュールを呼び出します。
c) UserPrograms.h UserPrograms.c (ファイル)
Status LED : LD3(緑) に使用している GPIOの初期設定と点滅処理を記述しています。
LD4(青)に使用している GPIOの初期設定を記述しています。
6.3. 指定時刻による対応モジュールへの分岐
指定時刻に対応して実行するモジュールの雛形はソースフォルダUserProgramsの下のファイルScheduledJobs.c
に記述されています。
1) 指定時刻と対応モジュール
以下に、それぞれの指定時刻と対応モジュールを記します。
a) 正時インターバル0 の時刻で呼び出すモジュール : void JobIH0(void);
b) 正時インターバル1 の時刻で呼び出すモジュール : void JobIH1(void);
c) 定刻0 の時刻で呼び出すモジュール : void JobFT0(void);
d) 定刻1 の時刻で呼び出すモジュール : void JobFT1(void);
e) 日付・時刻0 の時刻で呼び出すモジュール : void JobDT0(void);
f) 日付・時刻1 の時刻で呼び出すモジュール : void JobDT1(void);
本プロジェクトサンプルでは LD4(青)の点滅処理を記述していますが、このモジュールの内容を書き換えることにより希望の
処理を実現することができます。
28
7. 主なモジュールの説明
7.1. ソース・フォルダ src内のファイル
ソース・フォルダ src内のファイルでプログラムを追加した主なファイルについて簡単に説明します。
1) main.c
a) main関数
プログラムはここから開始します。主に初期化処理関数を呼び出しています。
int main(void)
呼び出している初期化処理は以下の通りです。
b) システムクロックの設定
システムクロック SYSCLKの設定を行います。Low Power Sleepモードから抜けるためのモジュールを呼び出して
高速動作モードにしています。内部クロック HSIを入力クロックとして選択し、PLLを使用して 32MHzに設定します。
//------------------------------------------------------------------------------------------
GLB_int16_vLowPowerMode = 1; // ExitLowPowerMode();を実行するためにLowPowerModeフラグを
ONにする。
//-------------------------------------------------------------------
// HSIを選択して、PLL ClockをSystem Clockとして使用する。 : SYSCLK = 32MHz
//-------------------------------------------------------------------
ExitLowPowerMode(); // Low Power Sleepモードから抜けてSYSCLK = 32MHzにする。
//------------------------------------------------------------------------------------------
c) 周辺クロックの初期化
// 周辺クロックの設定
void RCC_Configuration(void);
d) GPIOの初期化
// GPIO初期化
void Init_GPIOs(void);
e) Status LEDポートの初期化
//--------------------------------------
// Status LEDポート初期化 : LD3(緑)
//--------------------------------------
InitializePortStatusLED();
29
f) LD4(青)ポートの初期化
//--------------------------------------
// LD4(青)ポート初期化
//--------------------------------------
InitializePortLD4();
g) 時刻パラメータTimetableがEEPROMに設定済みかを判定
CPU内蔵のEEPROMに時刻パラメータTimetableが設定済みかを判定して結果を
フラグ GLB_int16_vTimeParameterOK_NGにセットします。
//--------------------------------------------------------------
// EEPROMの時刻パラメータ判定
//--------------------------------------------------------------
//戻り値 :
// 0 : OK
// 1 : NG
//--------------------------------------------------------------
GLB_int16_vTimeParameterOK_NG = CheckParameterEEPROM();
h) TIM6の初期化
//----------------------------------------------------------------------
// TIM6初期化
//----------------------------------------------------------------------
InitializeTIMx(TIM6, RCC_APB1Periph_TIM6, (uint16_t)defInterval_1mSec);
EnableIrqTIMx(RCC_APB1Periph_TIM6, TIM6_IRQn); // TIM6 Enable Interrupt
//----------------------------------------------------------------------
i) RTCの初期化
//--------------------------------------------------------------------------
// RTC初期化 : InitializeRTC()は、TIM6の割り込みを許可した後に呼び出さなければならない。
//--------------------------------------------------------------------------
InitializeRTC();
j) UART1の初期化
UART通信を行うときに、PCから 10mSecごとに 4回 0x00を送信します。CPUはUSART1_RX(PA10)のピンに
4回、外部割込みが発生すると Low Power Sleepモードから抜けて、動作周波数を32MHzにします。
その後、以下のUART初期化モジュールを呼び出し、通信速度を115200bpsに設定して通信を行います。
//-----------------------------------------------------------
// UART1通信パラメータ初期化 : 通信速度 115200bps
//-----------------------------------------------------------
InitializeCommunicate_UART1((uint32_t)115200);
30
2) stm32f4xx_it.h stm32f4xx_it.c
このファイルに割り込み処理を記述します。
本プロジェクトサンプルではRTCの1秒割り込み と TIM6のタイマ割り込み処理 および UART1の割り込み処理を
記述しています。
また、Low Power Sleepモード時はUSART_RX(PA10)のピンを入力に設定して外部割込みが発生するようにして
通信時に起床させるために使用しています。
7.2. HandleCLK
1) 高速動作モード時の設定
動作クロックに内部クロックHSI : 16MHzを選択し、PLLにより 32MHzにして使用します。
//----------------------------------------------------------------------------------
// HSIを選択して、PLL ClockをSystem Clockとして使用する。 : SYSCLK = 32MHz
//----------------------------------------------------------------------------------
void SetHSICLK32MHz(void);
2) Low Power Sleep時の設定
動作クロックに内部クロックMSI : 65.536kHzを選択し、設定により 32.768kHzにして使用します。
//-----------------------------------------------------
// To select MSI as System clock source
//-----------------------------------------------------
// 低消費電飾モード(Low Power Mode)にするために使用クロックをMSIに
// 変更してHCLK = 32.768KHzにする。
//-----------------------------------------------------
void SetHSICLKToMSI(void);
7.3. HandleEEPROM
CPU内蔵のEEPROMにデータを書き込みます。
//--------------------------------------------------------------------------------------------
// Set Data and Write EEPROM
//--------------------------------------------------------------------------------------------
//引数 :
// uint32_t uint32_StartAddress(4 の倍数) : 書き込み開始アドレス
// int16_t int16_Length : 書き込みbyte数
// uint8_t *puint8_Data : 書き込みデータが格納されているBufferのポインタ
//戻り値 :
// -1 : NG
// 0 : OK
//--------------------------------------------------------------------------------------------
int16_t SetDataAndWriteEEPROM(uint32_t uint32_StartAddress, int16_t int16_Length,
uint8_t *puint8_Data);
31
7.4. HandleGPIO
GPIOを初期化します。
1) 低消費電力モード時のGPIO初期化
最初は、使用しないGPIOピンをアナログ入力モードに初期化します。
//--------------------------------------------------------------------------------
// 低消費電力モード時のGPIO初期化
//--------------------------------------------------------------------------------
void InitializeGPIOs_LowPower(void);
2) GPIOの初期化
必要なGPIOの初期化を行います。
//---------------------------------------------
// GPIO初期化
//---------------------------------------------
void Init_GPIOs(void);
7.5. HandleRTC
RTCの初期化と日付・時刻の設定 および 日付・時刻の取得の処理を行います。
1) RTCの初期化
Backupの有無を判定して、Buckupが行われていない場合、RTCを全て初期化します。
Backupが行われている場合、日付・時刻のレジスタの設定は行わず、レジスタにセットされている日付・時刻を
読み出します。
RTCの時刻の読み込みは、RTCの 1秒割り込みの中で行います。
//---------------------------------------------------------------------
// RTC初期化
//---------------------------------------------------------------------
void InitializeRTC(void);
32
2) その他のRTCデータ処理
a) 日付・時刻の文字列を uint32_t のデータに変換
//-------------------------------------------------------------------------
// 日付・時刻の文字列から uint32_t に変換
//-------------------------------------------------------------------------
// 2000/01/01 00:00:00 を起点に秒で表す。
// 2135年以上はエラー : 0xffffffff を返す。
// 2000/01/01 00:00:00 以前の日付・時刻を指定された場合 戻り値は 0 とする。
//-------------------------------------------------------------------------
//引数 :
// uint8_t *puint8_DateTime : 日付・時刻の文字列が格納されたBufferのポインタ : YYYY/MM/DD hh:mm:ss
//戻り値 : 日付・時刻に対する秒数
//-------------------------------------------------------------------------
uint32_t ConvStringDateTimeToULONG(uint8_t *puint8_DateTime);
b) uint32_t の秒データから日付・時刻の文字列に変換
//-------------------------------------------------------------------------
// uint32_t の秒から 日付・時刻の文字列に変換
//-------------------------------------------------------------------------
// YYYY/MM/DD hh:mm:ss
// 2000/01/01 00:00:00 を 0 とする。
// 1日 : 60 x 60 x 24 = 86400
// 1年 : 86400 x 365 = 31536000
//-------------------------------------------------------------------------
//引数 :
// uint32_t uint32_Sec : 現在の日付・時刻を表す秒数
// uint8_t *puint8_Date : 変換した日付・時刻を格納するBufferのポインタ
//-------------------------------------------------------------------------
void ConvUlongSecToTimeString(uint32_t uint32_Sec, uint8_t *puint8_Date);
33
7.6. HandleTIM
1) TIM6の初期化
タイマ割り込みのためにTIM6を初期化してインターバルをセットします。
1mSecごとに割り込みがかかるように設定しています。
以下の関数の引数にTIM6用のパラメータを指定して TIM6を初期化します。
//------------------------------------------------------------------------------
// TIMx初期化
//------------------------------------------------------------------------------
//引数 :
// TIM_TypeDef *TIMx : TIM選択 : TIM6 or TIM7
// uint32_t RCC_APB1Periph_TIMx : specifies the APB1 peripheral to gates its clock.
// uint16_t uint16_Interval : TiMxのインターバル設定値
//------------------------------------------------------------------------------
void InitializeTIMx(TIM_TypeDef *TIMx, uint32_t RCC_APB1Periph_TIMx, uint16_t uint16_Interval);
2) タイマ割り込み許可
以下の関数の引数に希望するTIMx用のパラメータを指定して割り込みを許可します。
//-----------------------------------------------------------------------------------
// TIMx割り込み許可
//-----------------------------------------------------------------------------------
//引数 :
// uint32_t RCC_APB1Periph_TIMx : specifies the APB1 peripheral to gates its clock.
// uint8_t TIMx_IRQn : STM32 specific Interrupt Numbers
//-----------------------------------------------------------------------------------
void EnableIrqTIMx(uint32_t RCC_APB1Periph_TIMx, uint8_t TIMx_IRQn);
34
7.7. HandleUART
1) UARTの初期化
//-------------------------------------------------
// UART1初期化
//-------------------------------------------------
//引数 :
// uint32_t uint32_BaudRate : 通信速度 bps
//-------------------------------------------------
void InitializeUART1(uint32_t uint32_BaudRate);
2) UART送信
送信Bufferに格納されたデータを指定データ数送信します。
//------------------------------------------------------------------
// UART1 送信処理 : 送信Bufferに送信データがセットされた状態でCallされる。
//------------------------------------------------------------------
//引数 :
// uint16_t uint16_SendLength : 送信データ数
//戻り値 :
// 0 : 送信終了
// 1 : エラー
//------------------------------------------------------------------
void SendUART1(uint16_t uint16_SendLength);
3) UART受信
受信待ちを行いデータを受信したら、受信Bufferに格納します。
//------------------------------------------------------------------
// UART1 受信処理
//------------------------------------------------------------------
//引数 :
// uint8_t *puint8_ReceiveBuffer : 受信データを格納するBufferのポインタ
//戻り値 :
// -1 : 受信なし
// 0 : 受信なし
// 1以上 : 受信byte数
//------------------------------------------------------------------
int16_t ReceiveUART1(uint8_t *puint8_ReceiveBuffer);
35
7.8. UserPrograms
1) ScheduledJobs.h ScheduledJobs.c
指定時刻に対応して、以下の6個のモジュールの中のいずれかが呼び出されます。
// 正時インターバルJob0
void JobIH0(void);
// 正時インターバルJob1
void JobIH1(void);
// 定刻Job0
void JobFT0(void);
// 定刻Job1
void JobFT1(void);
// 日付・時刻Job0
void JobDT0(void);
// 日付・時刻Job1
void JobDT1(void);
2) TimeScheduled.h TimeScheduled.c
a) 正時インターバルの時刻判定と分岐
正時インターバルの指定時刻を判定して、一致した場合、対応する処理モジュールを呼び出します。
//-----------------------------------------------------------------------------------
// 正時インターバル時刻判定と分岐 : 指定の正時インターバルに一致したら指定プロジェクトの開始番地に分岐する。
//-----------------------------------------------------------------------------------
void CheckIntervalProjectBranch(uint8_t uint8_OnOff, uint32_t uint32_Interval, int32_t int32_Offset,
uint32_t *puint32_NextTime, uint32_t uint32_CountRTC, uint16_t uint16_JobNumber,
uint32_t *puint32_Interval_Old, int32_t *pint32_Offset_Old);
b) 定刻の時刻判定と分岐
定刻の指定時刻を判定して、一致した場合、対応する処理モジュールを呼び出します。
//-----------------------------------------------------------------------------------
// 定刻判定と分岐: 指定の定刻に一致したら指定プロジェクトの開始番地に分岐する。
//-----------------------------------------------------------------------------------
void CheckTimeProjectBranch(uint8_t uint8_OnOff, uint32_t uint32_Time, uint32_t *puint32_NextTime,
uint32_t uint32_CountRTC, uint16_t uint16_JobNumber,
uint32_t *puint32_Time_Old);
36
c) 日付・時刻の時刻判定と分岐
日付・時刻の指定時刻を判定して、一致した場合、対応する処理モジュールを呼び出します。
//-----------------------------------------------------------------------------------
// 日付・時刻判定と分岐: 指定の日付・時刻に一致したら指定プロジェクトの開始番地に分岐する。
//-----------------------------------------------------------------------------------
void CheckDateTimeProjectBranch(uint8_t *puchrOnOff, int16_t int16_PositionOnOff,
uint32_t ulngDateTime,
uint32_t ulngCountRTC, uint16_t uint16_JobNumber);
3) UserPrograms.h UserPrograms.c
UserPrograms.hには LEDに使用するGPIOに対する定義を記述してあります。
以下に、UaerPrograms.cに記述している関数の説明を記します。
a) 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);
37
b) 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);
c) LEDに使用する I/Oの初期化
i) StatusLED : LD3(緑)
//----------------------------------------------------------------
// Status LEDポート初期化 : LD3(緑)
//----------------------------------------------------------------
void InitializePortStatusLED(void);
ii) LD4(青)初期化
//----------------------------------------------------------------
// LD4(青) ポート初期化
//----------------------------------------------------------------
void InitializePortLD4(void);
38
d) StatusLED : LD3(緑)の点滅
//----------------------------------------------------------------
// Status LED点滅 : LD3(緑) : 点灯/消灯 切り替え
//----------------------------------------------------------------
// TIMx割り込み内で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);
e) LD4(青)の点滅 : 点滅回数の指定あり
//----------------------------------------------------------------
// LD4(青)を指定回数だけ点滅 : LD4(青) : 点灯/消灯 切り替え
//----------------------------------------------------------------
// TIMx割り込み内でGLB_uint16_BlinkTimerStatusLEDをデクリメントする。
// GLB_uint16_BlinkTimerStatusLEDが0になった時、呼び出される。
//----------------------------------------------------------------
// 点灯/消灯 を切り替えると同時に 点灯時間/消灯時間 をセットする。
//----------------------------------------------------------------
//引数 :
// uint16_t uint16_TimeON : 点灯時間
// uint16_t uint16_TimeOFF : 消灯時間
// int16_t *pint16_Count : 点滅回数の変数のポインタ
//----------------------------------------------------------------
void BlinkLD4withCount(uint16_t uint16_TimeON, uint16_t uint16_TimeOFF, int16_t *pint16_Count);
39
7.9. Communicate_UART
1) UARTの初期化
//-----------------------------------------------------------
// UART1通信パラメータ初期化
//-----------------------------------------------------------
//引数 :
// uint32_t uint32_BaudRate : 通信速度
//-----------------------------------------------------------
void InitializeCommunicate_UART1(uint32_t uint32_BaudRate);
2) UART通信処理
UARTの受信待ちを行い、受信データを判定して RTCアクセスコマンドの場合、RTCに対する処理を行います。
//------------------------------------------------------------
// UART1通信処理
//------------------------------------------------------------
//戻り値 :
// -1 : 処理中
// 0 : 終了
//------------------------------------------------------------
int16_t Communicate_UART1(void);
3) 受信コマンドの実行
受信データを判定して、コマンドに対する処理を呼び出します。
//--------------------------------------------------------------------
//受信コマンド判定 および 実行
//--------------------------------------------------------------------
//引数
// uint16_t uint16_ReceiveLength : 受信データ数
// uint8_t *puint8_ReceiveData : 受信データが格納されたBufferのポインタ
// uint8_t *puint8_SendData : 応答送信データを格納するBufferのポインタ
//戻り値: 応答送信データ数
//--------------------------------------------------------------------
uint16_t ExecuteCommandUART(uint16_t uint16_RecieveLength, uint8_t *puint8_ReceiveData,
uint8_t *puint8_SendData);
40
4) RTCに日付・時刻を設定
RTC設定コマンドを受信した場合呼び出されるモジュールです。
受信した日付・時刻データをRTCのレジスタに設定します。
//-------------------------------------------------------------------------------------------------
// 時刻設定
//-------------------------------------------------------------------------------------------------
// 受信Command :
// "Set RTC [日付・時刻 : 19byte]"
//-------------------------------------------------------------------------------------------------
// [日付・時刻 : 19byte] : "YYYY/MM/DD hh:mm:ss"(西暦/月/日 時:分:秒)
//-------------------------------------------------------------------------------------------------
// 応答(Reply) :
// OK応答 : "Set RTC OK"
// NG応答 :
// RTCが動作していない : "RTC is not working."
// 設定値エラー : "The parameter is not correct."
//-------------------------------------------------------------------------------------------------
//引数 :
// uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ
// uint8_t *puint8_SendData : 応答データを格納するBufferのポインタ
//戻り値 : 応答データ数
//-------------------------------------------------------------------------------------------------
uint16_t ComActSetTime(uint8_t *puint8_ReceiveData, uint8_t *puint8_SendData);
5) RTCに日付・時刻を取得
RTC取得コマンドを受信した場合呼び出されるモジュールです。RTCの日付・時刻データを送信します。
//-------------------------------------------------------------------------------------------------
// 時刻取得
//-------------------------------------------------------------------------------------------------
// 受信Command :
// "Get RTC¥0"
//-------------------------------------------------------------------------------------------------
// 応答(Reply) :
// OK応答 : [日付・時刻 : 19byte] : "YYYY/MM/DD hh:mm:ss"(西暦/月/日 時:分:秒)
//-------------------------------------------------------------------------------------------------
// NG応答 :
// RTCが動作していない : "RTC is not working."
//-------------------------------------------------------------------------------------------------
//引数 :
// uint8_t *puint8_SendData : 応答データを格納するBufferのポインタ
//戻り値 : 応答データ数
//-------------------------------------------------------------------------------------------------
uint16_t ComActGetTime(uint8_t *puint8_SendData);
41
6) Timetable設定
PCからTimetable設定コマンドと時刻パラメータを受信して、Timetableの内容を EEPROMに書き込みます。
//---------------------------------------------------------------------------------------------
// Timetable設定
//---------------------------------------------------------------------------------------------
// 受信Command :
// "Set Timetable [Timetable パラメータ]"
//---------------------------------------------------------------------------------------------
// [Timetable パラメータ] :
// [TaskIH ON/OFF],[IntervalIH],[OffsetIH],
// [TaskFT ON/OFF],[TimeFT],
// [TaskDT ON/OFF],[DateTimeDT]
//---------------------------------------------------------------------------------------------
// 応答(Reply) :
// OK応答 : "Set Timetable OK"
// NG応答 :
// 設定値エラー : "The parameter is not correct."
// EEPROM書き込みNG : "It failed to write the EEPROM."
//---------------------------------------------------------------------------------------------
//引数 :
// uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ
// uint8_t *puint8_SendData : 応答データを格納するBufferのポインタ
//戻り値 : 応答データ数
//---------------------------------------------------------------------------------------------
uint16_t ComActSetTimetable(uint8_t *puint8_ReceiveData, uint8_t *puint8_SendData);
42
7) Timetable取得
PCからTimetable取得コマンドを受信したとき、EEPROMから時刻パラメータを読み込んで、送信します。
//---------------------------------------------------------------------------------------------
// Timetable取得
//---------------------------------------------------------------------------------------------
// 受信Command :
// "Get Timetable¥0"
//---------------------------------------------------------------------------------------------
// 応答(Reply) :
// OK応答 : [Timetableパラメータ]
//---------------------------------------------------------------------------------------------
// [Timetableパラメータ] :
// [TaskIH ON/OFF],[IntervalIH],[OffsetIH],
// [TaskFT ON/OFF],[TimeFT],
// [TaskDT ON/OFF],[DateTimeDT]
//---------------------------------------------------------------------------------------------
// NG応答 :
// Timetableが設定されていない : "There is no data."
//---------------------------------------------------------------------------------------------
//引数 :
// uint8_t *puint8_SendData : 応答データを格納するBufferのポインタ
//戻り値 : 応答データ数
//---------------------------------------------------------------------------------------------
uint16_t ComActGetTimetable(uint8_t *puint8_SendData);