具体Freemodbus移植到STM32步骤参考:
STMC2CubeMX | STM32 HAL库移植FreeModbus详细步骤
基于STM32HAL库移植FreeModbus
FreeModbus+STM32 +HAL库 无操作系统移植 (已在正点原子阿波罗F429开发板上移植成功)

移植过程各路网站上都比较多,具体可参考以上链接内容。把思路和步骤记录一下:
①下载复制Freemodbus库;
② 使用CubeMX生成工程,需要注意配置串口、timer,NVIC优先级串口高于timer,需要用到中断,但不需要生成IRQHandle(移植中有手动添加)
③添加Freemodbus中相关.c.h文件到工程,设置中配置c++ include目录
④移植的核心在于port.c,portserial.c,porttimer.c,portevent.c 四个文件的修改与配置;其中配置serial与time是关键,需修改portserial.c与porttimer.c,操作时,只需要修改为需要的串口和timer即可,其他内容不需要动。
⑤如果用到485收发芯片,需要添加收发控制端代码(具体可以参考下边问题1种内容)
⑥根据需要配置port.c文件,如果初步测试,不用修改
⑦编译下载,然后就可以测试了

整个移植过程其实不是太复杂(站在前人基础上),但还是容易出现一些问题,在此仅个人移植存在的问题,踩过的坑在这里记录一下

(1)Freemodbus移植到TTL的USART1可行,但改为485的USART2不行

具体和端口没关系,主要问题是端口使用到485芯片,需要有收发控制端的配置,并在适当时候打开即可;
这个问题具体操作是修改portserial.c文件中 vMBPortSerialEnable函数内容,添加打开接收或者打开发送控制端,具体需要根据芯片及接法有关。

/* ------------- Start implementation -------------------------*/
void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{if(xRxEnable){__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);// 使能接收非空中断HAL_GPIO_WritePin(RS485_DE_GPIO_Port, RS485_DE_Pin, GPIO_PIN_RESET); //MAX485操作 低电平为接收模式}else{__HAL_UART_DISABLE_IT(&huart2, UART_IT_RXNE);// 禁能接收非空中断    }if(xTxEnable){HAL_GPIO_WritePin(RS485_DE_GPIO_Port, RS485_DE_Pin, GPIO_PIN_SET); //MAX485操作 高电平为发送模式__HAL_UART_ENABLE_IT(&huart2, UART_IT_TXE);            // 使能发送为空中断 }else{__HAL_UART_DISABLE_IT(&huart2, UART_IT_TXE);      // 禁能发送为空中断}
}

(2)485-Modbus 通讯 Timeout,数据发送不全或者结尾总是0xFF

这个问题的在不使用485芯片上一般不出现,在使用到485芯片的时候就比较明显,根源在于收发过程切换。仔细调试发现,MCU已经将数据传输出去,TTL口数据已经正常,但到485芯片后就出错,主要是MCU从发送到接收的转换太快,数据还没发送完全就将485的收发端口从发送转换为接收,造成最后一个字节数据没有从485芯片传输出去,造成出错。修改也比较简单,在切换之前进行适当延时,确保数据发送完成后在进行切换收发使能端口状态,即可解决。通过多方测试,感觉加到 cBOOL xMBRTUTransmitFSM( void )比较合适:增加语句【while(i<RS485_swtict_delay) i++; 】即可,具体位置看代码吧,其实加到相应的串口中断中也可以,不过可能影响效率。

关于RS485_swtict_delay 设置多大合适呢
经测试的波特率115200时,1000左右即可;波特率9600时,13000左右;这个延时时间与芯片延时有关系,具体以测试为准。

BOOL xMBRTUTransmitFSM( void )
{BOOL            xNeedPoll = FALSE;uint16_t        i = 0;assert( eRcvState == STATE_RX_IDLE );switch ( eSndState ){/* We should not get a transmitter event if the transmitter is in* idle state.  */case STATE_TX_IDLE:/* enable receiver/disable transmitter. */vMBPortSerialEnable( TRUE, FALSE );break;case STATE_TX_XMIT:/* check if we are finished. */if( usSndBufferCount != 0 ){xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur );pucSndBufferCur++;  /* next byte in sendbuffer. */usSndBufferCount--;}else{xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );/* Disable transmitter. This prevents another transmit buffer* empty interrupt. */* //  ********看这里***** ↓ 边是重点while(i<RS485_swtict_delay) i++; //补充延时//  ********看这里***** ↑ 边是重点vMBPortSerialEnable( TRUE, FALSE );eSndState = STATE_TX_IDLE;}break;}return xNeedPoll;
}

移植Freemodbus到STM32(基于CubeMX,HAL库)-避坑篇相关推荐

  1. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  2. STM32 使用CubeMX HAL库快速生成USBVCP虚拟串口工程

    一.前言 原来STM32USB开发很复杂,在标准库上移植USB库需要修改不少地方,但是现在用HAL库,配合CubeMX就能快速生成USB工程了,这里用STM32F1来实现Virtual_COM_Por ...

  3. STM32如何配置HAL库

    STM32如何配置HAL库 前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...

  4. 手把手教你移植FreeModbus到STM32【看评论区引导,领取全套资料包】

    为什么要移植freemodbus 大家好,近期由于一个小项目的需要,要用到Modbus协议进行通信.相信各位工作的小伙伴们,或多或少都要跟Modbus打交道吧.那么,Modbus协议的重要性我自不必多 ...

  5. 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)

    [STM32笔记]HAL库低功耗模式配置(ADC唤醒无法使用.低功耗模式无法烧录解决方案) [STM32笔记]低功耗模式配置及避坑汇总 一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需 ...

  6. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  7. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  8. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  9. 基于STM32移植U8g2图形库——OLED显示(HAL库)

    前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...

最新文章

  1. 关于dbutils中QueryRunner看批量删除语句batch
  2. trace--求矩阵的迹
  3. Nginx反向代理的系统优化
  4. VHDL中的分辨函数
  5. Blazor+Dapr+K8s微服务之服务调用
  6. 王道考研 计算机网络11 数据链路层 封装成帧 透明传输 流量控制 停止-等待协议 后退N帧协议GBN 选择重传协议SR
  7. The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
  8. 什么是三层交换,说说和路由的区别在那里?(转)
  9. 保定市身份证前6位代表地
  10. STM32智能小车------红外遥控
  11. 计算机桌面去方格子,win7桌面office图标变成白色方格图标的原因和解法
  12. Nginx文件服务器配置及使用
  13. 【uni-app】uni-app-微信小程序项目笔记
  14. Win10设置系统补丁更新服务器,win10系统手动更新补丁如何设置 win10系统手动安装更新方法...
  15. 新电脑自带win11刷win10 系统之后出现的触摸屏/板失灵等问题
  16. 两个求和符号如何用计算机,计算:两个求和符号∑∑怎么办
  17. Sass扫码点餐源码 单门店多门店餐饮连锁扫码点餐外卖自提系统源码
  18. Python--递归初步
  19. Python操作Excel文件:插入一列数据
  20. 病毒也遵循二八法则?超级传播者背后的科学道理

热门文章

  1. android 将图片转换成黑白图片
  2. 生成对抗网络玩转图像水印
  3. javac不是内部或外部命令,也不是可运行的程序解决办法和踩过的一些坑
  4. 一款简约的乐享书籍小程序
  5. 设置各种浏览器的兼容性
  6. word文档设置位置锁定对象(锚)
  7. Python二级(05)——基本数据类型
  8. 小巧上班通勤必备真无线蓝牙耳机,音质动听颜值在线,机不可失
  9. Pip给指定版本的Python安装模块
  10. Python Flask实现最简单的 Web