硬汉嵌入式论坛

 找回密码
 立即注册
查看: 241|回复: 11
收起左侧

[UART] 请教硬件CRC配置和串口超时中断

[复制链接]

5

主题

92

回帖

107

积分

初级会员

积分
107
发表于 2025-6-18 11:12:13 | 显示全部楼层 |阅读模式
请教大佬们两个问题:

1,你们H7的串口加DMA接收不定长数据用的什么中断,我看H7有个超时中断还有个空闲中断,之前用F4用空闲中断好像还挺好,H7用空闲中断好像有点问题,经常进空闲中断,不处理甚至影响DMA传输。

2,硬件CRC怎么配置成crc16-modbus,试了很多次,总是不对,需要硬件CRC计算之后再处理吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 2025-6-18 14:48:30 | 显示全部楼层
1、H7的空闲和F4的空闲一样,不过都是单字符空闲,也就是超过1个字符的空闲后才会触发。

然后是否好用,可能是你的程序实现问题,使用这个试试,比较好用


STM32H7基于STM32CubeMX的串口DMA+空闲中断接收不定长数据实现(HAL库1.9.0自带函数实现)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=108553

还有就是H7带了超时判断,这个范围比较大,不限制必须一个字符间隔

2、这种的好像用硬件CRC配置不了,多项式不同。
回复

使用道具 举报

4

主题

127

回帖

139

积分

初级会员

积分
139
发表于 2025-6-18 14:54:07 | 显示全部楼层
H7可以使用硬件CRC做MODBUS用,由于多项式不同需要初始化配置不能默认。但还需手工高低字节交换。记得应该F3之后的芯片(G0\G4都可以)
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2025-6-18 15:42:07 | 显示全部楼层
hance2000 发表于 2025-6-18 14:54
H7可以使用硬件CRC做MODBUS用,由于多项式不同需要初始化配置不能默认。但还需手工高低字节交换。记得应该F ...

手动高低字节交换小问题,只是CRC根本算不出正确的16位CRC,各种参数组合起来十几种都试过,算出来就是不正确,输入交换/不交换,输出翻转/不翻转/,初始值0/初始值FFFF,多项式0x8005/0xA001,这16种都试过,不考虑结果的顺序就没有2个字节同时正确的时候
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2025-6-18 16:48:17 | 显示全部楼层
eric2013 发表于 2025-6-18 14:48
1、H7的空闲和F4的空闲一样,不过都是单字符空闲,也就是超过1个字符的空闲后才会触发。

然后是否好用, ...

找到问题了,USART1和LPUART的超时中断和空闲中断都没问题,但是又没找到真正的问题。之前的两个串口都正常工作,前几天在SPI1上挂了一个W5500,用了USART1一个DMA控制器下的不同stream,然后就不能正常工作了,而LPUART挂在BDMA上的没有被干扰,工作正常。

真是太神奇了,先初始化USART1再初始化SPI和他们的DMA通道,把SPI的初始化函数注释打开,USART1的两个DMA 数据流在前面都使能不上了。USART1用了DMA1的 STREAM0 STREAM1 ,SPI1用了DMA1的STREAM6 STREAM7。
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2025-6-18 17:53:16 | 显示全部楼层
没想明白,初始化的时候后面的程序影响前面的初始化,进了硬件模拟里面明显能看到只要打开SPI1和它的DMA初始化,前面的串口初始化DMA数据流使能都有问题。
如果不是程序问题,那就是编译或者预加载的时候出现的问题,但是宏定义几乎没有,内存只只用了一点点。
QQ_1750237960342.png
QQ_1750238494645.png
QQ20250618-171549.png
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2025-6-18 21:10:30 | 显示全部楼层
搞不完,根本搞不完,加了一个UART4上去,占了DMA1的Stream2 和Stream3,初始化放在上面两个中间,这个串口能用,但是SPI接的W5500不正常了,USART1还是不正常。
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2025-6-18 23:50:29 | 显示全部楼层
解决了,很迷惑的分散加载,那语句不知道算成功没有,说没成功吗又没报错,说成功有的加载到不知道的地方去了
回复

使用道具 举报

3

主题

112

回帖

121

积分

初级会员

积分
121
发表于 2025-6-19 09:06:59 | 显示全部楼层
是否启用了第二段SRAM?如果是需要将DMA的缓存手动指定到内存1地址。
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 昨天 20:48 | 显示全部楼层
WangYI741 发表于 2025-6-19 09:06
是否启用了第二段SRAM?如果是需要将DMA的缓存手动指定到内存1地址。

就是分散加载指定到内存没成功,所以跑不起来。
回复

使用道具 举报

692

主题

3548

回帖

5649

积分

论坛元老

积分
5649
发表于 2 小时前 | 显示全部楼层
本帖最后由 hpdell 于 2025-7-4 09:18 编辑
死不低头 发表于 2025-7-3 20:48
就是分散加载指定到内存没成功,所以跑不起来。

我一般不使用 uart +dma + 空闲, 我比较喜欢 使用 uart 超时 (uart+tim 实现) 我使用了 6 个 uart 都是这个套路,而且工作稳定没出错, 接收超时设定 20ms , 这样 uart 也可以统一管理,也方面后续移植到其他任何有 uart 的 单片机上

使用 uart+dma 的话,有些芯片 的 uart + dma 是不支持 或只支持其中 几路 uart+dma 捣鼓起来也 麻烦
回复

使用道具 举报

5

主题

92

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2 小时前 | 显示全部楼层
hpdell 发表于 2025-7-4 09:14
我一般不使用 uart +dma + 空闲, 我比较喜欢 使用 uart 超时 (uart+tim 实现) 我使用了 6 个 uart 都 ...

有的单片机超时中断也不支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-4 11:58 , Processed in 0.584226 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表