
STM32G030K6Tx使用ADC+DMA进行6通道ADC采集,DMA传输错位问题。
请问如何在下载程序时保护flash中的用户数据不被覆盖?
STM32G070 I2C主机只发送设备地址读测试是否产生stop位
STM32G474VET6如何配置HRTIM的中心对齐模式
单片机板跟上位机进行串口发收数据时,每次上位机下发指令,出现问题都是在第一条指令后,有时在单片机回发完数据后偷发0x00,怎么解?
STM32F405RGT6 ADC2+TIM4触发+DMA(DMA2_Stream2_CH1)+DMA中断会死机(取消中断后完全正常)
stm32g431rbt怎么显示汉字
多DMA数据流问题
stm32h725
夜深了,睡不着
网上不少类似案例分享,稍微比较下。 如果使用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 模式,看起来是停掉了。
可以在回调函数里接着再使能。
楼主可以再调试一下,看看是不是这么回事。