在线时间1 小时
UID157129
ST金币0
蝴蝶豆0
注册时间2008-9-23
初级会员
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
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);//开始传输返回的数据!
}
}
|
|