谁知道STM32用STLINK下载的时候,不连接3V3不能下载
用SDRAM刷ltdc有白线会出现是啥情况
STM32G030F6P6TR 48MHz下Flash擦写必HardFault?官方库疑似有坑,求勘误或替代方案
在keil中仿真程序时,结构体变量出现错乱
异步传输中的奇偶帧位
什么是 GPIO 事件?如何将事件关联到外设
使用STM32H7A3的FMC接口驱动LCD 是否可以用DMA传输数据
STM32L562DK探索板——如何通过板载ST-LINK的虚拟串口进行通讯?
中断服务程序抖动
STM32L562DK探索板——如何启用蓝牙功能?
微信公众号
手机版
网上不少类似案例分享,稍微比较下。 如果使用ST库的话,
注意你的第二次是否真的发送了,里面有些类似gState状态机
的变量,看看是否在ready状态。
HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情况下可以正常接收,包含接收个数第二次也正常。如果使用DMA发送就会导致第二次接收长度为0,接收DMA配置为一般模式,发送DMA循环模式。接收串口在自定义回调函数中重新开启了DMA串口接收。 在测试过程中仅更改了串口发送方式,DMA(非阻塞)和阻塞发送。不理解为什么串口发送影响了串口接收。
HAL_UART_Transmit(&huart3 ,USART3_Struct.rxbuf, 16 , 10);
HAL_UART_Transmit_DMA(&huart3 ,USART3_Struct.rxbuf, 16);
void USR_UART_IdleRxCpltCallback(UART_HandleTypeDef *huart) { if( huart->Instance == USART3) { if ( USART3_Struct.Busyflag == 0 ) { USART3_Struct.usart3_rxbuf_len = rxbuffsize - (__HAL_DMA_GET_COUNTER(&hdma_usart3_rx));//接收个数 if( USART3_Struct.usart3_rxbuf_len != 16 )//判断接收数据长度是否正常,如果异常就回复数据长度错误 { //长度错误 } if(USART3_Struct.usart3_rxbuf_len==16)//数据长度正常,未处于解析命令状态 { //拷贝数组 for(uint8_t i=0; i < USART3_Struct.usart3_rxbuf_len ;i++) { USART3_Struct.rxbuf[i]=USART3_Struct.usart3_rxbuf[i];//将收到的数组放到解析缓存数组里去 } //主函数轮询标志位->解析数据缓存Buf memset(USART3_Struct.usart3_rxbuf , 0x00 , USART3_Struct.usart3_rxbuf_len);//清空DMA接收缓冲区 } HAL_UART_Receive_DMA(&huart3, USART3_Struct.usart3_rxbuf , rxbuffsize);//重新开启DMA USART3_Struct.Rxflag = 1;//接收完成标志位 USART3_Struct.Busyflag = 1; //正在解析标志位 }
}
[md]应该不会有影响。idle中断可以不用自定义,建议使用新函数
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)。看看是不是你的代码在ISR中将DMA停止了
在接收中断里,如果DMA是normal 模式,看起来是停掉了。
可以在回调函数里接着再使能。
楼主可以再调试一下,看看是不是这么回事。