RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for ARM Lite 4.2.0 で作成した STM32F4 Discovery 基板用のプロジェクトです プログラムの開始番地は 0x08000000 です デバッグが可能です 目次 1. PC 接続に使用する信号... 2 2. プログラム実行時の動作と確認... 3 2.1. 実行時の動作... 3 2.2. 動作確認... 3 3. プロジェクトの構成... 6 3.1. 独自に追加したソースフォルダ... 6 3.2. ソースフォルダ src のファイル... 7 4. 主なモジュールの説明... 8 4.1. HandleUART... 8 4.2. HandleRTC... 9 4.3. main.c... 10 4.4. UserPrograms... 11 4.5. CommunicateHOST... 11 1
1. PC 接続に使用する信号 RTC をアクセスするために使用する UART2 の信号と接続相手 PC との接続は以下の通りです 1) UART2 接続信号表 UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 接続相手 PC の信号名 1 USART2_TX PA2 P1-14 --- > RxD 2 USART2_RX PA3 P1-13 < --- TxD 3 GND ----- ----- < ---- > GND 2) RS232C ドライバ接続例 2
2. プログラム実行時の動作と確認 2.1. 実行時の動作 1) プログラムを実行すると基板上の LED LD4( 緑 ) が 1 秒点灯 2 秒消灯で点滅します 2) UART2 ポートで RTC 設定コマンドを受信すると指定された内容に従って日付 時刻を RTC にセットします 3) UART2 ポートで日付 時刻読み込みコマンドを受信すると 日付 時刻データを送信します 2.2. 動作確認 RTC の動作確認のために非同期シリアル通信を使用して CPU 内蔵の RTC にアクセスするためのアプリケーション Access_RTC を作成しました 以下は Access RTC を起動した画面です COM ポートと通信速度を選択して [ 時刻設定 ] ボタンをクリックすると 日付 時刻設定コマンド + 日付 時刻データ が送信されます CPU 基板がデータを受信して応答したデータを受信すると受信データの欄に受信データが表示されます 次ページに送受信した画面を示します 3
1) 日付 時刻コマンドに対する応答 最初の 2 行は操作に対するメッセージです CPU 基板が日付 時刻設定コマンドを受信して応答したデータ Set RTC OK が表示されています 表示しています 次ページに続く 4
2) 日付 時刻データの読み込み送信データに Get RTC を入力して [ 送信 ] ボタンをクリックしてください 日付 時刻データが返信されて受信データの欄に表示されています インストール方法や使い方については Access_RTC の説明 をご覧ください 5
3. プロジェクトの構成プロジェクトを開いて 左側の Project Exploler のそれぞれのソースフォルダを開いた状態です 3.1. 独自に追加したソースフォルダ独自に追加したソースフォルダについて簡単に説明します 1) CommonModules 共通処理を記述しています 2) CommunicateHOST UART2 の通信処理を記述しています RTC のコマンドを受信して処理を行います 3) Handle Peripheral の設定などを行っています a) HandleTimer2.h HandleTimer2.c タイマ割り込みを使用するために タイマの初期設定を記述しています b) HandleUART.h HandleUART.c UART の初期設定と送受信の処理を記述しています c) HandleRTC.h HandleRTC.c RTC の初期化とコンフィグレーションの処理を記述しています 4) UserPrograms Status LED に使用している I/O の初期設定と点滅処理を記述しています 6
3.2. ソースフォルダ src のファイルフォルダ src の中の特に重要なファイルについて説明します 1) main.c main モジュールが記述されています プログラムはここから開始します I/O と RTC の初期設定と UART による日付 時刻コマンドの送受信モジュールの読び出しを記述しています 2) stm32f4xx_it.c 割り込み処理を記述するファイルです このプロジェクトでは Timer2 割り込みと UART2 および RTC の割り込み処理を記述しています 7
4. 主なモジュールの説明 4.1. HandleUART 1) UART の初期化 //UART2 初期化 void InitializeUART2(uint32_t ulngbaudrate); 引数 : uint32_t ulngbaudrate : BaudRate を設定します このサンプルでは 9600 を設定しています 2) UART 送信 //UART2 送信処理 void SendUART2(uint16_t uintlength, uint8_t *puchrdata); 引数 : uint16_t uintlength : 送信データ数 uint8_t *puchrdata : 送信データ Buffer のポインタ 3) UART 受信 //UART2 受信処理 int16_t ReceiveUART2(uint8_t *puchrreceivebuffer); 引数 : uint8_t *puchrreceivebuffer : 受信データ Buffer のポインタ 戻り値 : -1 : 受信なし 0 : 受信なし 1 以上 : 受信 byte 数 8
4.2. HandleRTC 1) RTC の初期化 RTC の初期化とコンフィグレーションを行います // RTC 初期化 void InitializeRTC(void); 2) RTC のコンフィグレーション define による RTC クロックの外部 / 内部指定に従いコンフィグレーションを行います // RTC コンフィグレーション // RTC のクロック定義 ( 外部 / 内部 ) に従って RTC をコンフィグレーションする // 戻り値 : // 0 : OK // 1 以上 : NG int16_t RTC_Config(void); 3) 日付 時刻データを秒数に変換日付 時刻データを 2000/01/01 00:00:00 を起点 ( 0 ) とした秒数に変換します ---- // 日付 時刻を unsigned long に変換 ---- // 2000/01/01 00:00:00 を起点に秒で表す // 2135 年以上はエラー : 0xffffffff を返す // 2000/01/01 00:00:00 以前の日付 時刻を指定された場合戻り値は 0 とする ---- // 引数 : // struct RtcParam *structrtcparam : 日付 時刻がセットされた構造体のポインタ // 戻り値 : 日付 時刻に対する秒数 ---- uint32_t ConvTimeToULONG(struct RtcParam *structrtcparam); 9
4) 秒数から日付 時刻に変換秒数から 2000/01/01 00:00:00 を起点 ( 0 ) とした日付 時刻に変換します ---- // unsigned long の秒から日付 時刻の文字列に変換 ---- // 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 ulngsec : 現在の日付 時刻を表す秒数 // uint8_t *uchrdate : 変換した日付 時刻を格納する Buffer のポインタ ---- void ConvUlongSecToTimeString(uint32_t ulngsec, uint8_t *uchrdate); 4.3. main.c 1) 使用するクロックの初期化 void RCC_Configuration(void); 2) I/O の初期化 void Init_GPIOs(void); 10
4.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); 4.5. CommunicateHOST 1) UART2 の初期化 //----------------------------------------------------------- // HOST 通信パラメータ初期化 //----------------------------------------------------------- // 引数 : // uint32_t ulngbaudrate : 通信速度 //----------------------------------------------------------- void InitializeCommunicateHOST(uint32_t ulngbaudrate); 2) HOST 通信処理受信処理を行い 受信コマンドを処理して応答データを送信します //------------------------------------------------------------ // HOST 通信処理 //------------------------------------------------------------ // 戻り値 : // -1 : 処理中 // 0 : 終了 //------------------------------------------------------------ int16_t CommunicateHOST(void) 11
3) HOST コマンドの実行受信コマンドを判定してそれぞれの処理モジュールを呼び出します --------------- // HOST コマンドを実行する --------------- // 引数 : // uint8_t *puchrreceivedata : 受信データが格納されている Buffer のポインタ // uint8_t *puchrsenddata : 応答送信データを格納する Buffer のポインタ // 戻り値 : 応答送信データ数 --------------- uint16_t ExecuteCommandHOST(uint8_t *puchrreceivedata, uint8_t *puchrsenddata); 4) 時刻設定指定された日付 時刻を CPU 内部の RTC に設定して応答送信データをセットします // 時刻設定 // 引数 : // uint8_t *puchrdatetime : 日付 時刻データのポインタ : YYYY/MM/DD hh:mm:ss( 西暦 / 月 / 日時 : 分 : 秒 ) // uint8_t *puchrsenddata : 応答データを格納する Buffer のポインタ // 戻り値 : 応答送信データ数 int16_t ComActSetTime(uint8_t *puchrdatetime, uint8_t *puchrsenddata); 5) 時刻取得 CPU 内部の日付 時刻を取得して応答送信データにセットします // 時刻取得 // 引数 : // uint8_t *puchrsenddata : 応答データを格納する Buffer のポインタ // 戻り値 : 応答送信データ数 int16_t ComActGetTime(uint8_t *puchrsenddata); 12