你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32407 使用串口闲时中断+DMA方式接收最大接收字节是多少

[复制链接]
唯若丝絮 提问时间:2025-7-1 14:28 / 未解决

使用串口闲时中断+DMA方式接收数据,波特率为460800,DMA接收长度为1024个字节,并开启串口闲时中断,当上位机一次发送520个字节,我发现串口产生了两次中断,第一次接收的最大字节为272个字节,然后再接收剩下的字节,主频168MHz,修改波特率为9600、修改过采样、现象依旧存在。这个主要是什么原因?闲时中断不应该一次就接收到520个字节?

收藏 1 评论9 发布时间:2025-7-1 14:28

举报

9个回答
butterflyspring 回答时间:昨天 14:59
如果是固定在272字节后产生中断了,那么看看是不是这时候主机发了一个idle 帧出来。


或者用另一个STM32F4当主机发送数据试试看。
唯若丝絮 回答时间:昨天 15:05

butterflyspring 发表于 2025-7-1 14:59
如果是固定在272字节后产生中断了,那么看看是不是这时候主机发了一个idle 帧出来。</p>
<p>

目前我是通过电脑抓包工具,520个字节是一次性发送的。的确没考虑到用其他stm32 发送数据,现在我短接rx与tx 看下结果

啦啦啦啦啦啦啦啦 回答时间:昨天 15:46

把空闲中断关了

唯若丝絮 回答时间:昨天 15:48

butterflyspring 发表于 2025-7-1 14:59
如果是固定在272字节后产生中断了,那么看看是不是这时候主机发了一个idle 帧出来。</p>
<p>

使用短接rx与tx 问题依旧存在,示波器抓取波形,串口发送数据,字节与字节之间并未出现明显断帧现象,怀疑可能是本身芯片的闲时中断就设置了最大接收长度,但在勘误手册都没提到这点

唯若丝絮 回答时间:昨天 15:53

啦啦啦啦啦啦啦啦 发表于 2025-7-1 15:46
把空闲中断关了

关闲时中断那肯定没问题的,我定时器轮询读取dma接收剩余长度是正常的

qintian0303 回答时间:昨天 16:31

rx对应的寄存器是固定的,DMA就是把这个往外面搬运怎么会有上限呢

唯若丝絮 回答时间:昨天 17:33

qintian0303 发表于 2025-7-1 16:31
rx对应的寄存器是固定的,DMA就是把这个往外面搬运怎么会有上限呢

DMA通道最大搬运65535个

唯若丝絮 回答时间:昨天 17:43

DMA使用基本的单次字节采集模式,开启接收如下所示:HAL_UARTEx_ReceiveToIdle_DMA(&huart3,(uint8_t *)g_u8RxData,USART_RX_MAX);

串口闲时中断数据:在void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)中实现原理如下:

HAL_UART_AbortReceive(&huart3);//关闭串口DMA接收 g_u16RxCnt=USART_RX_MAX-__HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//获取DMA接收的数据长度

HAL_UARTEx_ReceiveToIdle_DMA(&huart3,(uint8_t *)g_u8RxData,USART_RX_MAX);//重新开始接收数据

以上操作发现上位机一次发送520个字节数据后,串口中断进入了两次,获取DMA接收的数据长度分别位272,248。使用的芯片为STM32F407ZGT6,主频168MHz,大家有条件可以试试

xmshao 回答时间:昨天 17:49
使用空闲中断的话,在使能空闲中断前最好查询下idle标志,若为1的话先将其清零。


具体你这里,应该是DMA半完成中断进了一次,我们的库代码就是这样设计的。


DMA半完成中断也是默认开启的。


其实你很好验证这点,比方DMA长度1024不变,你一次性数据只发送 不超过512的数据看看。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版