我参照DMA未知长度数据接收和发送的程序写了DMA的程序,可以实现单次的接受发送,但是遇到了几个问题,新手不会解决,特来求问~
1.如何实现连续的DMA发送呢?运用这个中断函数,可以在中断中判断接收到的字符串。如果我想在判断接收到的字符串满足某个要求后,触发一连串的循环的DMA发送,该怎么实现?比如我从CAN总线一直有数据传过来,这边在DMA怎么连续地发送出去?
2.我想利用memcmp函数判断字符串是否满足要求,用if语句判断:if(memcmp(ReceiveBuff,collect,1)==0)
但是在这个中断里接收字符串总是与实际不同,不知道是什么原因,如果我将ReceiveBuff赋给SendBuff,send出去的字符串又是相同的,是因为在中断过程中字符串的接收还没有完成?
下面附上中断函数的代码
[mw_shl_code=c,true]void USART2_IRQHandler(void)
{
u16 DATA_LEN;
u16 i;
// printf("1\r\n");
if(USART_GetITStatus(USART2, USART_IT_IDLE) == RESET)//!=change to ==
{
DMA_Cmd(DMA1_Channel6, DISABLE);//??±?DMA,·??????í??????????
//USART_RX_STA = USART2->SR;//????SR?????ó??DR????????
//USART_RX_STA = USART2->DR;
DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel6);
// printf("2\r\n");
if(DATA_LEN > 0)
{
while(USART2_TX_Finish==0)
{
;
}
//????????DMA???????·
//-----------------------------------------------------------------
if(memcmp(ReceiveBuff,collect,1)==0)
strcpy(SendBuff,get);
else
strcpy(SendBuff,ReceiveBuff);
// if(memcmp(ReceiveBuff,collect,strlen(collect))==0)
// strcpy(SendBuff,get);
// else
// strcpy(SendBuff,ReceiveBuff);
//-----------------------------------------------------------------
//USART??DMA???????ú?é??·???·???????·?±????????????????ú?ú???????ó??
DMA_Cmd(DMA1_Channel7, DISABLE); //??±?datasize?°?????????¨???¤×÷
DMA1_Channel7->CNDTR=DATA_LEN; //DMA1,??????????
USART2_TX_Finish=0;//DMA????????±ê????
DMA_Cmd(DMA1_Channel7, ENABLE); //·???
}
//DMA_Cmd(DMA1_Channel5, DISABLE);//??±?DMA,·??????í??????????
DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//??±ê??
DMA1_Channel6->CNDTR = 512;//??×°??
DMA_Cmd(DMA1_Channel6, ENABLE);//???í?ê,????DMA
//??SR?ó??DR????Idle
i = USART2->SR;
i = USART2->DR;
}
if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//???í
{
USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);
}
USART_ClearITPendingBit(USART2, USART_IT_TC);
USART_ClearITPendingBit(USART2, USART_IT_IDLE);
// Delay(10000);
// printf("%s\r\n",SendBuff);
// Delay(10000);
}[/mw_shl_code]
|