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

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 回答时间:3 小时前
如果是固定在272字节后产生中断了,那么看看是不是这时候主机发了一个idle 帧出来。


或者用另一个STM32F4当主机发送数据试试看。
唯若丝絮 回答时间:3 小时前

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

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

啦啦啦啦啦啦啦啦 回答时间:2 小时前

把空闲中断关了

唯若丝絮 回答时间:2 小时前

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

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

唯若丝絮 回答时间:2 小时前

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

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

qintian0303 回答时间:1 小时前

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

唯若丝絮 回答时间:半小时前

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

DMA通道最大搬运65535个

唯若丝絮 回答时间:半小时前

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 回答时间:半小时前
使用空闲中断的话,在使能空闲中断前最好查询下idle标志,若为1的话先将其清零。


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


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


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