サンプルプログラム NF446RE_RTC の説明
STM32F446RE内蔵のRTCの
時刻設定と時刻取得を行う
サンプルプログラムです。
STMicroelectronics社製の
評価用基板、NUCLEO-F446RE と
freeの開発ツール、STM32CubeIDE を
使用しています。
STM32F446RE の USART2 を使用してPCと送受信を行い、
PCからのコマンドによりRTCの時刻設定と時刻取得を行います。
NUCLEO-F446RE基板のST-LINK部分はVCP(仮想COMポート)の機能も有しています。
NUCLEO-F446RE基板とPCとをUSBケーブルで接続すると
ST-LINKとCOMポートの二つを認識します
COMポートは、STM32F446REのPA2(USART2_TX)とPA3(USART2_RX)に接続されていて
PC と CPUのUART2 との通信が可能です。
目次
UART(非同期シリアル通信)について
サンプルプログラム NF446RE_RTC のソース
サンプルプログラム NF446RE_RTC の説明
NF446RE_RTC の構成
NF446RE_RTC の動作パラメータの定義
ユーザープログラムの実行開始位置
NF446RE_RTC のmain()の説明
1) 初期化の部分
2) LED点滅 と UART2通信処理 の部分
UART2通信処理 Commu_UART2 の説明
受信コマンド実行 Execute_Command_UART の説明
PCアプリケーション Access_UART
PCアプリケーション Access_UART を使用して、
サンプルプログラム NF446RE_RTC の動作確認を行います。
UART(非同期シリアル通信)について
以下のページでUARTについて簡単に説明しています。
UART(非同期シリアル通信) の説明 をご覧ください。
サンプルプログラム NF446RE_RTC のソース
STM32CubeIDE 1.8.0 を使用して作成しました。
ここからサンプルプログラム R_NF446RE_RTC.zip をダウンロードしてください。
サンプルプログラム NF446RE_RTC の説明
STM32F446REのRTCの動作確認を行うためのサンプルプログラムです。
PCが送信したコマンドを受信して、コマンドに応じて
RTCの 時刻設定 または 時刻取得 を行います。
プロジェクトを最初に開いた画面は以下のようになります。
以下、サンプルプログラム NF446RE_RTC について説明していきます。
NF446RE_RTC の構成
STM32CubeIDEの画面左側、Project Explorerの
NF446RE_RTCを展開した画面は以下のようになります。
サンプルプログラム NF446RE_RTC の構成を以下に示します。
NF446RE_RTC
|- Includes
|
|- Access_UART_RTC : 受信コマンド実行
| |-Access_UART_RTC.c
| |-Access_UART_RTC.h
|
|- Blk_LED_Stat : Status LED点滅処理
| |-Blk_LED_Stat.c
| |-Blk_LED_Stat.h
|
|- Commu_UART2 : UART2通信処理
| |-Commu_UART2.c
| |-Commu_UART2.h
|
|- Core
| |- Inc
| | |- main.h
| | |- stm32f4xx_hal_conf.h
| | |- stm32f4xx_it.h
| |
| |- Src
| | |- main.c
| | |- stm32f4xx_hal_msp.c
| | |- stm32f4xx_it.c
| | |- syscalls.c
| | |- system.c
| | |- system_stm32f4xx.c
| |
| |- Startup
|
|- Drivers
|
|- Handle_F4 : 周辺インターフェース処理
| |- H_F4_GPIO.c
| |- H_F4_GPIO.h
| |- H_F4_RTC.c
| |- H_F4_RTC.h
| |- H_F4_UART2.c
| |- H_F4_UART2.h
|
|- NF446RE_RTC_Config : 動作パラメータの定義
| |- Dev_Conf.h
|
|- Wait_Itvl : 時間待ち処理
| |- Wait_Itvl.c
| |- Wait_Itvl.h
|
|- NF446RE_RTC.launch
|- STM32F446RETX_FLASH.ld
|- STM32F446RETX_RAM.ld
NF446RE_RTC の動作パラメータの定義
サンプルプログラム NF446RE_RTC の 動作パラメータの定義を
NF446RE_RTC_Config/Dev_Conf.h に記述しています。
使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、
などを記述しています。
ユーザープログラムの実行開始位置
プログラムは、int main(void) から実行開始します。
int main(void) は、フォルダ Core/Src/main.c にあります。
STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
行った後、int main(void) を呼び出します。
ユーザーコード(記述したプログラム)は、
int main(void) の先頭から実行されます。
NF446RE_RTC のmain()の説明
サンプルプログラム NF446RE_RTC の main() の記述は、
以下のとおりです。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t uint8_JobNum_LED = 0; // LED点滅処理番号
uint8_t uint8_JobNum_UART = 0; // UART処理番号
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_RTC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// Status LED点滅 : 初期化内蔵
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Time_ON : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blk_LED_Stat_with_Init(&uint8_JobNum_LED,
GLB_uint16_Time_LED_Stat_ON, GLB_uint16_Time_LED_Stat_OFF);
//------------------------------------------------------------
// UART2通信処理
//------------------------------------------------------------
// 処理内容 :
// 1. UART2の初期化がされていない場合、初期化します。
// 2. 受信が発生するのを待ち、受信データを取得します。
// 3. 受信データを判定して、内容に従い処理を行います。
// 4. 受信データによる処理の結果、送信データがセットされた場合、送信処理を行います。
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//------------------------------------------------------------
Commu_UART2(&uint8_JobNum_UART);
}
/* USER CODE END 3 */
}
1) 初期化の部分
a) CPUのPeripheral初期化
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
により、CPUのPeripheralなどの基本的な初期化を行います。
PeripheralとはCPUの周辺インターフェースなどのことを言います。
プロジェクト構築時に自動的に組み込まれる、
HAL Drivers(フォルダ Drivers/STM32F4xx_HAL_Drivers) 内に記述されています。
b) CPU動作クロックの設定
/* Configure the system clock */
SystemClock_Config();
CPUの動作クロックとPeripheralの動作クロックを設定します。
SystemClock_Config(); の設定内容は、
int main(void)
{
.
.
.
}
の、すぐ下に記述されています。
c) RTCの初期化
/* Initialize all configured peripherals */
MX_RTC_Init();
RTCを初期化します。
MX_RTC_Init(); は、Handle_F4/H_F4_RTC.c 内に記述されています
2) LED点滅 と UART2通信処理 の部分
永久ループ部分の記述を以下に示します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// Status LED点滅 : 初期化内蔵
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Time_ON : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blk_LED_Stat_with_Init(&uint8_JobNum_LED,
GLB_uint16_Time_LED_Stat_ON, GLB_uint16_Time_LED_Stat_OFF);
//------------------------------------------------------------
// UART2通信処理
//------------------------------------------------------------
// 処理内容 :
// 1. UART2の初期化がされていない場合、初期化します。
// 2. 受信が発生するのを待ち、受信データを取得します。
// 3. 受信データを判定して、内容に従い処理を行います。
// 4. 受信データによる処理の結果、送信データがセットされた場合、送信処理を行います。
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//------------------------------------------------------------
Commu_UART2(&uint8_JobNum_UART);
}
/* USER CODE END 3 */
Status LED点滅処理 Blk_LED_Stat_with_Init と
UART2通信処理 Commu_UART2 を呼び出しています。
Commu_UART2 では、コマンドを受信して、内容に応じて
RTCの 時刻設定 または 時刻取得 を行います。
UART2通信処理 Commu_UART2 の説明
PCからのデータを受信して、受信データを Execute_Command_UART に渡し、
受信データに対する処理を行います。
以下に、Commu_UART2 のコードを示します。
//------------------------------------------------------------
// UART2通信処理
//------------------------------------------------------------
// 処理内容 :
// 1. UART2の初期化がされていない場合、初期化します。
// 2. 受信が発生するのを待ち、受信データを取得します。
// 3. 受信データを判定して、内容に従い処理を行います。
// 4. 受信データによる処理の結果、送信データがセットされた場合、送信処理を行います。
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//------------------------------------------------------------
int16_t Commu_UART2(uint8_t *puint8_JobNum)
{
static uint8_t STC_uint8_JobNum_UART;
int16_t int16_ReceiveLength;
int16_t int16_Return;
switch(*puint8_JobNum)
{
case 0:
if(GLB_int16_vUART2_InitDone == 0){
//-----------------------------------------------------------
// UART2通信パラメータ初期化
//-----------------------------------------------------------
// 引数:
// uint32_t uint32_BaudRate : 通信速度
// 戻り値:
// 0 : OK
// 1 : NG
//-----------------------------------------------------------
int16_Return = Init_Commu_UART2((uint32_t)115200);
if(int16_Return != 0){
// NG
break; // NG終了
}
}
STC_uint8_JobNum_UART = 0; // UART処理番号初期化
(*puint8_JobNum)++; // 次の処理番号に移行する。: case 1:
int16_Return = -1; // 処理継続
break;
case 1:
//--------------------------------------------------
// UART2 受信処理
//--------------------------------------------------
// 戻り値:
// -2 : エラー発生
// -1 : 受信なし
// 0 : 受信なし
// 1以上 : 受信byte数
//--------------------------------------------------
int16_ReceiveLength = Receive_UART2(&STC_uint8_JobNum_UART,
GLB_uint8_ReceiveData_UART2);
if(int16_ReceiveLength <= 0){
if(int16_ReceiveLength == -2){
//--------------------------
// エラー発生
//--------------------------
*puint8_JobNum = 0; // 処理番号初期化 : case 0: に移行する。
int16_Return = -2; // エラー発生
break; // エラー終了
}
//-------------------
// 受信なし
//-------------------
int16_Return = -1; // 処理継続 : case 1: をループ
break; // 処理番号維持
}
//-----------------------------------------------------------------
// 受信コマンド実行
//-----------------------------------------------------------------
GLB_uint16_vTx2_Transfer = Execute_Command_UART((uint16_t)int16_ReceiveLength,
GLB_uint8_ReceiveData_UART2,
GLB_uint8_Tx2_Buffer);
(*puint8_JobNum)++; // 次の処理番号に移行する。: case 2:
int16_Return = -1; // 処理継続
break;
case 2:
// 応答データ送信
//------------------------------------------------------------------
// UART2 送信処理
//------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : 送信終了
// 1 : エラー
//------------------------------------------------------------------
int16_Return = Send_UART2(&STC_uint8_JobNum_UART);
if(int16_Return == -1){
// 処理中
break; // 処理番号維持 : 処理継続 : case 2: をループ
}
*puint8_JobNum = 0; // 処理番号初期化
// int16_Return : 結果
break;
default:
*puint8_JobNum = 0; // 処理番号初期化
int16_Return = 1; // NG
break;
}
return(int16_Return);
}
1) case 0:
初期化済みのフラグ GLB_int16_vUART2_InitDone を判定して
0 の場合、UART2 の初期化を行います。
2) case 1:
UART2 の受信処理を行います。
受信が発生して、1回の受信が終了するまで、case 1: をループします。
a) エラーが発生した場合は、処理番号を 0 にして、エラー終了します。
Commu_UART2 は、case 0: から処理を実行します。
b) 1回の受信が終了した場合、受信データは GLB_uint8_ReceiveData_UART2 にセットされています。
c) 受信コマンド実行 Execute_Command_UART に GLB_uint8_ReceiveData_UART2 を渡して実行します。
受信コマンド実行結果に伴う送信データは GLB_uint8_Tx2_Buffer にセットされます。
d) 処理番号をインクリメントします。
処理は、case 2: に移行します。
3) case 2:
UART2 送信処理 Send_UART2 を実行して、GLB_uint8_Tx2_Buffer のデータを送信します。
a) 送信が終了するまで、case 2: をループします。
b) 送信が終了すると、処理番号を 0 に初期化して終了します。
Commu_UART2 は再び、処理番号 0 : case 0: から実行されます。
受信コマンド実行 Execute_Command_UART の説明
Execute_Command_UART は モジュール Execute_Command_RTC を呼び出します。
Execute_Command_UART と Execute_Command_RTC は、
Access_UART_RTC/Access_UART_RTC.c 内に記述されています。
モジュール Execute_Command_RTC は、渡された受信データに応じて、
処理を行い、応答データを返します。
渡されたデータがRTC制御コマンドの場合、
コマンドの内容に応じて、RTCの 時刻設定 または 時刻取得 を行い、
処理結果に応じたデータを返します。
RTC制御コマンドは以下の通りです。
1) 時刻設定
コマンドで指定された日付・時刻をRTCに設定します。
また、その時刻を 2000/01/01 00:00:00 を 0 とした、秒数に変換して、
1秒カウンタ変数にセットします。
1秒カウンタ変数は、RTCの1秒割り込みでインクリメントされます。
a) コマンド
RTC C00,YYYY/MM/DD hh:mm:ss%00
b) 応答
i) OK応答
OK : RTC C00 : Set RTC OK
ii) NG応答
NG : RTC C00 : Parameter Error
コマンド例:
RTC C00,2022/02/01 17:30:00%00
時刻設定 の処理は ComActSetTime モジュールで行っています。
2) 時刻取得 1 : RTCの時刻読み込み
RTCの時刻を読み込んでその時刻を送信します。
a) コマンド
RTC C01%00
b) 応答
OK : RTC C01 : YYYY/MM/DD hh:mm:ss
応答例:
OK : RTC C01 : 2022/02/01 17:30:00
時刻取得 1 の処理は ComActGetTime モジュールで行っています。
3) 時刻取得 2 : 1秒カウンタの値を日付・時刻 に変換
1秒カウンタ変数を日付・時刻に変換して、その時刻を送信します。
a) コマンド
RTC C02%00
b) 応答
OK : RTC C02 : YYYY/MM/DD hh:mm:ss
応答例:
OK : RTC C02 : 2022/02/01 17:30:00
時刻取得 2 の処理は ComActGetTimeFromCounter モジュールで行っています。
%00 は 0x00 を表します。
PCアプリケーション Access_UART
PCアプリケーション Access_UART を使用して、
サンプルプログラム NF446RE_RTC の動作確認を行います。
PCアプリケーション Access_UART の説明 をご覧ください。
この説明では、LED点滅コマンドを例に説明していますが、
RTC制御コマンドに読み替えて使用してください。
A+-2C (ええ加減にC) のページに戻る
メールアドレス: apm2c.sumi@gmail.com
なんでも、気軽に、ご相談ください。
担当:おの
えがおのでんし 案内