STM 32のHALライブラリとmodbus-stm 32ライブラリを使用したSTM 32マイクロコントローラ上のModbus RTU通信のサンプルコード

無料無料技术资料

这篇内容可直接阅读,适合用于基础学习和検索引流。

STM 32のHALライブラリとmodbus-stm 32ライブラリを使用したSTM 32マイクロコントローラ上のModbus RTU通信のサンプルコード

HALライブラリとmodbus-stm 32ライブラリを使用してSTM 32マイクロコントローラをベースにしたModbus RTU通信を実装するには、以下の手順に従います。

  1. 準備作業:
    • STM 32 CubeMXおよびHALライブラリがインストールされていることを確認します。
    • modbus-stm 32ライブラリをダウンロードして、プロジェクトに統合します。このライブラリはGitHubで見つけ、ドキュメントに従って統合できます。
    • 新しいCubeMXプロジェクトを作成し、適切なSTM 32マイクロコントローラ·モデルを選択し、クロック、シリアルポートなどのペリフェラルを設定します。
  2. シリアル通信の設定:
    • CubeMXを使用してModbus RTU通信用のシリアルポートを設定します。シリアルポート構成がModbus RTU規格に準拠していることを確認してください。例えば、8ビットデータビット、1ビットストップビット、パリティなし。
    • HALライブラリでシリアルインタフェース割込みを有効にして、データの送受信を処理します。
  3. modbus-stm32ライブラリを設定する
    • modbus-stm 32ライブラリのドキュメントに従って、選択したシリアルポートとレジスタを使用するようにライブラリを設定します。
    • Modbusスレーブアドレス、ボーレートなどのパラメータの設定を含むmodbus通信スタックの初期化。
  4. Modbus RTUマスタープログラムの作成:
    • メインプログラムでは、Modbus RTUリクエストを作成してModbusスレーブデバイスに送信し、応答を待つ必要があります。
    • 応答を処理してデータを抽出します。

以下は、シリアルポートとmodbus-stm 32ライブラリを初期化し、Modbus RTUリードホールドレジスタ要求を送信し、レスポンスを解析するための簡単なサンプルコードです。

#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ライブラリが含まれています。以下は、このコードのいくつかの説明です:

  1. コードのこと。mainこの機能は、HALライブラリ、システムクロック、GPIO(出力ピンとしてGPIOCピン13)、およびUART1シリアルポートを初期化する。次に、modbus-stm 32ライブラリを初期化し、ループ内で呼び出される無限ループを開始します。modbus_updateModbus通信を扱う。
  2. HAL_UART_RxCpltCallback関数はUART受信割込みコールバック関数で、受信したデータを処理します。この機能において、modbus_rx_char受信した文字を処理するために使用され、HAL_UART_Receive_IT次の文字が届くのを待つ。これはModbus通信で使用される基本的なシリアル受信モードです。
  3. HAL_UART_TxCpltCallback関数は、送信完了イベントを処理するUART送信割込みコールバック関数です。ここでは、modbus_tx_endModbusライブラリに送信が完了したことを通知するために使用されます。
  4. SystemClock_Configシステムクロックを設定します。この例では、クロックは9600ボーレートの16分周HSI発振器を使用するように設定されています。ご使用のハードウェアおよびパフォーマンス要件に応じて、適切なクロック構成を行ってください。
  5. MX_USART1_UART_Initこの機能はUART1シリアルポートを初期化し、ボーレート、データビット、ストップビット、検証ビットなどを設定します。シリアル構成に応じて適切な変更を行う必要がある。
  6. MX_GPIO_Init機能GPIOCピン13を出力ピンとして設定しました。このピンは、必要に応じてインジケータなどの他のデバイスの制御に使用できます。

このコードは基本的なModbus RTU通信フレームワークを提供しますが、スレーブアドレス、ファンクションコード、レジスタアドレスなど、特定のニーズに合わせてmodbus-stm 32ライブラリをさらに設定する必要があります。modbus-stm 32ライブラリのドキュメントに従って設定し、アプリケーションのニーズに合わせて適切に変更してください。

この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口

《“STM 32のHALライブラリとmodbus-stm 32ライブラリを使用したSTM 32マイクロコントローラ上のModbus RTU通信のサンプルコード”》 有 1 条コメント

发表回复

あなたのメールアドレスアドレス不会被公开。 必須項目已用 * 标注