初级会员

- 积分
- 53
- 金钱
- 53
- 注册时间
- 2020-5-21
- 在线时间
- 18 小时
|
8金钱
本帖最后由 ClineH 于 2020-7-13 23:29 编辑
stm32h743,工程中用到了uart rx的dma。在电脑串口向板子发数据时,数据发送稍微快点,500ms时,USART_RX_BUF2中数据有时会是0。
为何哦???
求助USART2_IRQHandler中断程序如下:
if (__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_IDLE) != RESET) //判断是否为空闲中断
{
//清除DMA2_Steam3传输完成标志位
__HAL_UART_CLEAR_IDLEFLAG(&UART2_Handler);//清除标志位
HAL_UART_DMAStop(&UART2_Handler); //传输完成以后关闭串口DMA
//计算接收数据长度,拷贝数据到USART_RX_BUF
count = USART_REC_LEN - __HAL_DMA_GET_COUNTER(&UART2RxDMA_Handler);
memcpy((void *)USART_RX_BUF, (void *)USART_RX_BUF2, count);
printf("\r\n进入空闲中断中 字节数 = %d \r\n",count);
//数据个数放到低8bit,数据接收完毕标志置1
USART_RX_STA2 = 0x8000 + count;
//清空缓冲区
memset(USART_RX_BUF2,0,count);
count = 0;
//重新打开DMA接收
HAL_UART_Receive_DMA(&UART2_Handler,USART_RX_BUF2,USART_REC_LEN);//重新打开DMA接收
}
HAL_UART_IRQHandler(&UART2_Handler); //该函数会清空中断标志,取消中断使能,并间接调用回调函数
接收到的数据有时全是0 ???
|
最佳答案
查看完整内容[请看2#楼]
解决方法:Cache打开时,在读取数据前调用 SCB_CleanInvalidateDCache_by_Addr()。
原因:DMA 串口接收时会发生cache与内存不一致情况,详细原因和解决方法求解哦???
|