HALライブラリとmodbus-stm 32ライブラリを使用してSTM 32マイクロコントローラをベースにしたModbus RTUCommunicationを実装するには、以下の手順に従います。
- 準備作業:
- STM 32 CubeMXおよびHALライブラリがインストールされていることを確認します。
- modbus-stm 32ライブラリをダウンロードして、プロジェクトに統合します。このライブラリはGitHubで見つけ、ドキュメントに従って統合できます。
- 新しいCubeMXプロジェクトを作成し、適切なSTM 32マイクロコントローラ·モデルを選択し、クロック、シリアルポートなどのペリフェラルを設定します。
- シリアルCommunicationの設定:
- CubeMXを使用してModbus RTU通信用のシリアルポートを設定します。シリアルポート構成がModbus RTU規格に準拠していることを確認してください。例えば、8ビットデータビット、1ビットストップビット、パリティなし。
- HALライブラリでシリアルインタフェース割込みを有効にして、データの送受信を処理します。
- modbus-stm32ライブラリを設定する
- modbus-stm 32ライブラリのドキュメントに従って、選択したシリアルポートとレジスタを使用するようにライブラリを設定します。
- Modbusスレーブアドレス、ボーレートなどのパラメータの設定を含むmodbusCommunicationスタックの初期化。
- Modbus RTUマスタープログラムの作成:
- メインプログラムでは、Modbus RTUリクエストを作成してModbusスレーブデバイスに送信し、応答を待つ必要があります。
- 応答を処理してデータを抽出します。
以下は、シリアルポートとmodbus-stm 32ライブラリを初期化し、Modbus RTUリードホールドレジスタ要求を送信し、レスポンスをParseするための簡単なサンプルコードです。
#include "main.h"
#include "modbus.h"
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
modbus_init();
while (1)
{
modbus_update();
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
modbus_rx_char(huart->Instance->DR);
HAL_UART_Receive_IT(&huart1, (uint8_t*)modbus_tx_buf, 1);
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
modbus_tx_end();
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&huart1, (uint8_t*)modbus_tx_buf, 1);
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}上記のコード例には、Modbus RTU通信用のSTM 32 HALライブラリとmodbus-stm 32ライブラリが含まれています。以下は、このコードのいくつかの説明です:
- コードのこと。
mainこの機能は、HALライブラリ、システムクロック、GPIO(出力ピンとしてGPIOCピン13)、およびUART1シリアルポートを初期化する。次に、modbus-stm 32ライブラリを初期化し、ループ内で呼び出される無限ループを開始します。modbus_updateModbusCommunicationを扱う。 HAL_UART_RxCpltCallback関数はUART受信割込みコールバック関数で、受信したデータを処理します。この機能において、modbus_rx_char受信した文字を処理するために使用され、HAL_UART_Receive_IT次の文字が届くのを待つ。これはModbusCommunicationで使用される基本的なシリアル受信モードです。HAL_UART_TxCpltCallback関数は、送信完了イベントを処理するUART送信割込みコールバック関数です。ここでは、modbus_tx_endModbusライブラリに送信が完了したことを通知するために使用されます。SystemClock_Configシステムクロックを設定します。この例では、クロックは9600ボーレートの16分周HSI発振器を使用するように設定されています。ご使用のハードウェアおよびパフォーマンス要件に応じて、適切なクロック構成を行ってください。MX_USART1_UART_Initこの機能はUART1シリアルポートを初期化し、ボーレート、データビット、ストップビット、検証ビットなどを設定します。シリアル構成に応じて適切な変更を行う必要がある。MX_GPIO_Init機能GPIOCピン13を出力ピンとして設定しました。このピンは、必要に応じてインジケータなどの他のデバイスの制御に使用できます。
このコードは基本的なModbus RTUCommunicationフレームワークを提供しますが、スレーブアドレス、ファンクションコード、レジスタアドレスなど、特定のニーズに合わせてmodbus-stm 32ライブラリをさらに設定する必要があります。modbus-stm 32ライブラリのドキュメントに従って設定し、アプリケーションのニーズに合わせて適切に変更してください。
怎么感觉文章没写完呢