u8 buf1[100]; //都初始化0 
u8 buf2[100]; //都初始化0 
u16 rev;   //中断接收计数 
串口发送方式: DMA 
串口接收方式: 中断 
 
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; 
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf1; 
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 
DMA_InitStructure.DMA_BufferSize = 10; 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 
DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte; 
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; 
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; 
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; 
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 
DMA_Init(DMA1_Channel4, &DMA_InitStructure); 
 
在主程序中 
main() 
while(1) 
{ 
启动DMA发送; 
延时; 
} 
是可以正常发送 
 
而通过中断接收数据,再把接收的数据DMA发送出去就不对了,如下: 
main() 
while(1) 
{ 
    if( rev > 10) 
    { 
        启动DMA发送;  //发送buf1 
        rev = 0; 
     } 
} 
 
串口接收中断中 
u8 c; 
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
{   
    c=USART1->DR; 
    buf1[rev] = c;   //接收放在buf1 
    rev ++;       
}   
 
当计算机这边发送11个字节数据时可以正常发回,当大于11个时,发回的就不是发出去的数据. 
以为是buf1冲突 
把 
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf2; 
发送buf2的数据,怎么接收的也不是buf2里的数据. 
 
最后把main里接收计数条件 换成 判断最后一个字节比如buf1[rev]=0x23 
(PC端发送的数据中只有一个0x23,且是最后一个) 
这样就正常,上面接收计数方法有问题吗,到底怎么回事 
高手讲讲串口DMA注意的问题? |   
     
  
 |