局部变量初始化时未赋值会导致什么后果
在 STM32CubeIDE 中使用 RTOS 代理
如何为ram变量分配固定地址
ST TOF问题请教
为什么STM32H7的DMA第一次启动延时较长?
STM32F407 USB 发送数据 上位机接受不到
请问我的CubeMX为什么初始界面没有ai选项,进去之后也没有addnetwork?
STM32H523CEU6的Pin41和Pin42能否作为USART6使用?
ST Motor Control Workbench卡在如图界面,生成不了代码
SDIO 标致位 没有变
微信公众号
手机版
具体你这里,应该是DMA半完成中断进了一次,我们的库代码就是这样设计的。
DMA半完成中断也是默认开启的。
其实你很好验证这点,比方DMA长度1024不变,你一次性数据只发送 不超过512的数据看看。
或者用另一个STM32F4当主机发送数据试试看。
目前我是通过电脑抓包工具,520个字节是一次性发送的。的确没考虑到用其他stm32 发送数据,现在我短接rx与tx 看下结果
把空闲中断关了
使用短接rx与tx 问题依旧存在,示波器抓取波形,串口发送数据,字节与字节之间并未出现明显断帧现象,怀疑可能是本身芯片的闲时中断就设置了最大接收长度,但在勘误手册都没提到这点
关闲时中断那肯定没问题的,我定时器轮询读取dma接收剩余长度是正常的
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,大家有条件可以试试
的确,DMA半完成中断很有说服性,我先看下代码,再修改最大接收长度试试。
其实 我昨天已经验证过了。你可以再验证下。
的确,重新看了一下代码,在半完成中断事件中也实现了void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size),所有我在开启DMA闲时中断后,关闭了半完成中断,解决问题。
65535个是字节还是位 啊?
65535个数据,肯定不是65535个位,可能是字节、半字、字。但某些STM32系列统一为字节个数。你要适当看看相应的手册。