stm32f407的adc采样不稳?
STM32F407VET6 能适配哪些FATFS版本文件
stm32 定时器外部时钟1的TI1FP1及TI2FP2的设置问题
STM32F1定时器中触发信号TRC的来源及选择配置是怎么样的
STM32H7A3VGTA QSPI读W25Q128J DMA模式不能工作
使用CubeMx第二次生成的代码编译时报错
无刷电机PWM输出配置
//STM32H7A3VGT6 QSPI的DMA方式无法正常工作
CubeMX+STM32F407VGT6+配置lwip的httpd功能,工程编译报错
workbench5.3.1生成代码问题
微信公众号
手机版
具体你这里,应该是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系列统一为字节个数。你要适当看看相应的手册。