UART用DMA传送不定长度的数据,每次发送的数据量不等且时间很随机。 还有一个问题被发送的数据是局部的变量,等数据发送函数退出时,局部的变量会销毁,此时DMA发送的数据可能就已经不是原来想要发送的数据了。为了解决这个问题,就是把数据先写入一个环形的缓存再进行MDA发送,但被发送的数据写缓存到顶端时返回缓存开始继续写数据,此时DMA怎么知道需要返回?DMA如何判断缓存的开始地址和结束地址(顶端)?DMA如何使用环形的内存?我写了这样一段程序,但程序中间红色的还是在浪费时间,如何解决? 下面程序没有经过测试,示意使用。 void UART1_Send_dma(U8 *str,U16 Length) //发送一串数据 { U32 i; U32 BackLength=0; // 设置发送目标内存的开始地址 DMA_InitStructure_UART1.DMA_MemoryBaseAddr = (U32)UART1_Write_MEM_Pointer; DMA_InitStructure_UART1.DMA_BufferSize = Length; //定义指定DMA通道的DMA缓存的大小 for(i=0;iUART1_tx_size) //判断写发送缓存指针越界 { UART1_Write_MEM_Pointer=0; BackLength++; //写发送缓存指针越界后,开始计算返回数据量 } } ////////////////////////////////////////////////////////////////////// if(BackLength==0) //写缓存地址无过零 { while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET); //发送前等待上次发送是否完毕, DMA_Init(DMA1_Channel4, &DMA_InitStructure_UART1); //初始化DMA通道4 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //将USART1模块设置成DMA方式工作 DMA_Cmd(DMA1_Channel4, ENABLE);//开始一次DMA传输! } if(BackLength)//写缓存地址有过零 { DMA_Init(DMA1_Channel4, &DMA_InitStructure_UART1); //初始化DMA通道4 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //将USART1模块设置成DMA方式工作 DMA_Cmd(DMA1_Channel4, ENABLE);//开始传输数据! while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET) ;//发送前等待上次发送是否完毕, //设置DMA源:发送目标内存从缓存的开始地址开始 DMA_InitStructure_UART1.DMA_MemoryBaseAddr = (U32)UART1_Send_Puffer; DMA_InitStructure_UART1.DMA_BufferSize = BackLength; //数据返回的数量 定义指定DMA通道的DMA缓存的大小 DMA_Init(DMA1_Channel4, &DMA_InitStructure_UART1); //初始化DMA通道4 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //将USART1模块设置成DMA方式工作 DMA_Cmd(DMA1_Channel4, ENABLE);//开始传输返回的数据! } } |
回复:UART用DMA传送不定长度的数据,每次发送的数据量不等且时间很随机。