STM 32 의 HAL 라이브러리 및 modbus - stm 32 라이브러리를 사용하여 STM 32 마이크로컨트롤러를 기반으로 Modbus RTU 통신을 구현하는 예제 코드

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 RTU 통신을 구현하는 예제 코드

要基于STM32微コントローラーは使用HAL库和modbus-stm32库実装Modbus RTUCommunication,您可以按照以下步骤进行操作:

  1. 准备工作:
    • 确保您已经インストール了STM32 CubeMX和HAL库。
    • 下载并集成modbus-stm32库到あなたの项目中。您可以在GitHub上找到这个库并按照其ドキュメント进行集成。
    • 作成一个新的CubeMX项目,選択合适的STM32微コントローラーは型号,然后設定时钟、シリアルポート等外设。
  2. 設定シリアル通信:
    • 使用CubeMXシリアルポートの設定用于Modbus RTUCommunication。确保シリアルポート設定符合Modbus RTU標準,例如:8位データ·ビット,1位ストップ·ビット,パリティなし。
    • 在HAL库中有効シリアルポート中断,以便処理受信和送信データ。
  3. 設定modbus-stm32库:
    • 根据modbus-stm32库的ドキュメント,設定库以使用您選択的シリアルポート和レジスタ。
    • 初期化modbus通信堆栈,包括設定Modbusスレーブアドレス、ボーレート等参数。
  4. 编写Modbus RTU主程序:
    • 在主程序中,您需要作成一个Modbus RTUリクエスト并将其送信到Modbusスレーブデバイス,然后待機中レスポンス。
    • 処理レスポンス以从中提取データ。

下面是一个简单的サンプルコード,用于初期化シリアルポート和modbus-stm32库,并送信一个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);
}

上边提供的コード例中,包括了STM32的HAL库和modbus-stm32库,用于実装Modbus RTUCommunication。以下是一些について这段代码的説明:

  1. 代码的main函数初期化了HAL库、系统时钟、GPIO(GPIOC Pin 13,作为一个出力引脚),以及UART1シリアルポート。然后,它初期化了modbus-stm32库,开始了一个无限循环,在循环中调用modbus_update来処理ModbusCommunication。
  2. HAL_UART_RxCpltCallback 函数是一个UART受信中断回调函数,它被用来処理受信到的データ。在这个函数中,modbus_rx_char 用来処理受信到的文字,并且経由调用 HAL_UART_Receive_IT 来待機中下一个文字的受信。这是一个基本的シリアルポート受信方式,用于ModbusCommunication。
  3. HAL_UART_TxCpltCallback 函数是UART送信中です。断回调函数,用来処理送信完成事件。ここで,modbus_tx_end 用于通知Modbus库送信完了。
  4. SystemClock_Config 函数設定了系统时钟。在这个サンプル中,时钟設定为使用HSI振荡器,16分频,9600ボーレート。请根据あなたの硬件和性能要求进行相应的时钟設定。
  5. MX_USART1_UART_Init 函数初期化了UART1シリアルポート,設定了ボーレート、data bit、stop bit、チェックビット等。您需要根据あなたのシリアルポート設定进行相应的更改。
  6. MX_GPIO_Init 函数設定了GPIOC Pin 13 作为一个出力引脚。这个引脚可以在需要时用于控制其他デバイス,如指示灯。

这段代码提供了一个基本的Modbus RTU通信框架,但您需要进一步設定modbus-stm32库来满足あなたの特定需求,包括スレーブアドレス、関数コードとレジスター·アドレス等。确保根据modbus-stm32库的ドキュメント进行設定,并根据あなたの应用程序需求进行适当的修改。

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 RTU 통신을 구현하는 예제 코드”》 有 1 条コメント

Leave a Reply

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