问答

汇集网友智慧,解决技术难题

xlhhao

TA的家园币:13  

  • SWM34S DMA接收不定长数据问题

    使用的是SWM34S,在官方SimplUART_DMA_RX例程上修改。目的是想实现DMA接收不定长数据。使用UART超时中断。DMA设置单次,长度1024个字节。在UART超时中断中再次重新初始化DMA配置接收问题现象如下:第一次通过串口发送数据16个数据。数据能准确接收到buffer中.第二次再发送16数据,新接收数据则存放在buffer+16位置。也就是说DMA未被重新初始化。仍然还是保持上一次DMA的接收状态。相关代码如下:voidrs485_init(void){PORT_Init(PORTB,PIN13,PORTB_PIN13_UART2_RX,1);/*GPIOB.13配置为UART2输入引脚*/PORT_Init(PORTB,PIN11,PORTB_PIN11_UART2_TX,0);/*GPIOB.11配置为UART2输出引脚*/UART_InitStructureUART_initStruct;UART_initStruct.Baudrate=RS485_BAUD;UART_initStruct.DataBits=UART_DATA_8BIT;UART_initStruct.Parity=UART_PARITY_NONE;UART_initStruct.StopBits=UART_STOP_1BIT;UART_initStruct.RXThreshold=3;UART_initStruct.RXThresholdIEn=0;UART_initStruct.TXThreshold=3;UART_initStruct.TXThresholdIEn=0;UART_initStruct.TimeoutTime=10;UART_initStruct.TimeoutIEn=1;//超时中断UART_Init(UART2,&UART_initStruct);UART_Open(UART2);UART_INTClr(UART2,UART_IT_RX_TOUT);}voidrs485rx_dma_config(void){DMA_InitStructureDMA_initStruct;DMA_initStruct.Mode=DMA_MODE_SINGLE;DMA_initStruct.Unit=DMA_UNIT_BYTE;DMA_initStruct.Count=1024;//DMA搬运个数DMA_initStruct.SrcAddr=(uint32_t)&UART2->DATA;DMA_initStruct.SrcAddrInc=0;DMA_initStruct.DstAddr=(uint32_t)RX_Buffer;DMA_initStruct.DstAddrInc=1;//Scatter-Gather模式DMA_initStruct.Handshake=DMA_CH0_UART2RX;DMA_initStruct.Priority=DMA_PRI_LOW;DMA_initStruct.INTEn=0;DMA_CH_Init(DMA_CH0,&DMA_initStruct);DMA_CH_Open(DMA_CH0);}//接收超时中断,voidUART2_Handler(void){if(UART_INTStat