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

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

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

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

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

  1. コードのこと。mainこの機能は、HALライブラリ、システムクロック、GPIO(出力ピンとしてGPIOCピン13)、およびUART1シリアルポートを初期化する。次に、modbus-stm 32ライブラリを初期化し、ループ内で呼び出される無限ループを開始します。modbus_updateModbusCommunicationを扱う。
  2. HAL_UART_RxCpltCallback関数はUART受信割込みコールバック関数で、受信したデータを処理します。この機能において、modbus_rx_char受信した文字を処理するために使用され、HAL_UART_Receive_IT次の文字が届くのを待つ。これはModbusCommunicationで使用される基本的なシリアル受信モードです。
  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 RTUCommunicationフレームワークを提供しますが、スレーブアドレス、ファンクションコード、レジスタアドレスなど、特定のニーズに合わせてmodbus-stm 32ライブラリをさらに設定する必要があります。modbus-stm 32ライブラリのドキュメントに従って設定し、アプリケーションのニーズに合わせて適切に変更してください。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

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

Leave a Reply

Your email address will not be published. Required fields are marked *.