FreeRTOS+ModbusRTU

本文介绍了如何在STM32F407开发板上结合FreeRTOS实现ModbusRTU通信,涵盖了STM32CubeMX配置、串口设置、定时器配置、任务线程创建以及中断和串口处理函数的编写。通过03、06、10三个功能测试,验证了通信的正确性,并提供了资源下载链接。
摘要由CSDN通过智能技术生成

FreeRTOS + ModbusRTU

通过正点原子的STM32F407板子,实现了ModbusRTU,03,06,10,三个功能,可以实现电脑主站和板子的通信,本文还加入了FreeRTOS,当做是练习了。

1.STM32CubeMX的配置

1.1

首先调试功能选择Trace Asynchronous Sw,时钟选择TIM1,是为了跟踪调试
在这里插入图片描述

1.2 RCC设置

在这里插入图片描述

1.3定时器选择

在这里插入图片描述
我选的是TIM3
时钟源是Internal Clock;
自动重装载值arr=9;
预分频系数PSC=7199;
主频Tclk=72M;
根据定时器溢出时间公式Tout= ((arr+1)*(psc+1))/Tclk,(1M=1000000)
溢出时间Tout=((9+1)*(7199+1))/72000000=1ms

然后使能时钟
在这里插入图片描述

1.4 USART设置

在这里插入图片描述
波特率为9600

1.5 FreeRTOS设置

在这里插入图片描述
任务线程设置
在这里插入图片描述
在这里插入图片描述

1.6 中断优先级设置

在这里插入图片描述
在这里插入图片描述

1.7 USART

PA9,PA10设置相同
在这里插入图片描述

1.8

在这里插入图片描述

1.9

在这里插入图片描述
生成代码
在这里插入图片描述

2.0 代码

2.1首先在freertos.c文件中添加任务线程函数

void StartModbusTask(void *argument)
{
   
  /* USER CODE BEGIN StartModbusTask */
    /* Infinite loop */
  for(;;)
    {
   
     if(uart1.rx_start == 0x01)
        {
          
            uart1.rx_start = 0x00;
              ModbusTask();
                osDelay(1);
               
            
         }
     
}  /* USER CODE END StartModbusTask */
}

在/* USER CODE BEGIN Includes / 和/ USER CODE END Includes */中添加头文件

/* USER CODE BEGIN Includes */     
#include "modbustask.h"
#include "defaultTask.h"
/* USER CODE END Includes */

2.2定时器回调函数
在main.c中添加

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   
/* USER CODE BEGIN Callback 0 */
 /* USER CODE END Callback 0 */
 if (htim->Instance == TIM1) {
   
    HAL_IncTick();
  }
    /* USER CODE BEGIN Callback 1 */
  if(htim == &htim3)
    {
   
        uCnt ++;
        if(uCnt >= 4)
        {
   
            uCnt = 0;
            HAL_TIM_Base_Stop_IT(&htim3); // 停止定时器
            HAL_UART_RxCpltCallback(&huart1); // 一帧传输完成
        }
    }
  /* USER CODE END Callback 1 */
}

同样在main.c中/* USER CODE BEGIN 2 /和 / USER CODE END 2 */之间添加

/* USER CODE BEGIN 2 */
  E_USART_INIT(&huart1);

  /* USER CODE END 2 */

在main.c中添加头文件

/* USER CODE BEGIN Includes */
#include <stdarg.h>
#include "modbustask.h"
/* USER CODE END Includes */
在tim.h中添加

```c
/* USER CODE BEGIN Includes */
extern uint8_t uCnt;
/* USER CODE END Includes */ 

同时在 tim.c 中添加对"usart.h"的包含,并定义 uCnt 变量

#include "tim.h"
#include "usart.h"
/* USER CODE BEGIN 0 */
uint8_t uCnt = 0;
/* USER CODE END 0 */
TIM_HandleTypeDef htim3 ;

``
2.3在stm32f4xx_hal_uart.c文件中在void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)函数中对以下的函数片段进行丰富

/

* UART in mode Receiver -------------------------------------------------*/
if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{
   
UART_Receive_IT(huart);
return;
} 
改为如下

的中断处理

 /* UART in mode Receiver -------------------------------------------------*/
        if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
        {
   
            UART_Receive_IT(huart);
            if(uCnt >= 2) // 数据接收非法,清除已经接收数据
            {
   
                uCnt = 0;
  
### 回答1: Modbus是一种通讯协议,通常应用于工控领域。在Modbus通讯中,通常存在两种设备:主机和从机。主机通常是一个有能力获取和发送Modbus数据的设备,而从机则是对主机进行响应的设备。在Modbus通讯中,设备之间需要共同遵守一定的协议规则,才能实现数据交换。Modbus通讯协议有多种形式,例如ModbusTCP、ModbusRTU等。 modbus_mstm32是一个支持Modbus通讯的开源库,可以在ST公司的STM32系列微控制器上使用。它提供了Modbus通信协议的所有功能,包括主机和从机设备之间的通讯、多个从机设备之间的通讯等。使用modbus_mstm32,可以方便地实现Modbus通讯,对于需要与其他设备进行数据交换的工控领域应用非常实用。 freemodbusrtu是另一个支持Modbus通讯的开源库,主要用于嵌入式系统中。它提供了Modbus通信协议的所有功能,并且具有非常高的可靠性和稳定性。使用freemodbusrtu,可以快速实现基于Modbus通讯的数据传输,同时也可以支持多种不同的硬件平台。 在实现Modbus通讯时,还可以采用操作系统的支持。freertos是一个非常流行的开源操作系统,可以用于嵌入式系统中。freertos提供了一系列的API,支持多线程、信号量、时间延迟等常见的操作系统功能,可以方便地实现Modbus通讯中不同设备之间的任务分配和优先级控制。 综上所述,modbus_mstm32和freemodbusrtu都是支持Modbus通讯的开源库,可以用于实现主机和从机设备之间的数据传输。同时,使用操作系统如freertos可以方便地实现多任务的协同工作,提高系统的可靠性和效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值