中级会员 
   
	- 积分
 - 294
 
        - 金钱
 - 294 
 
       - 注册时间
 - 2014-8-1
 
      - 在线时间
 - 6 小时
 
 
 
 | 
 
5金钱 
              本想今晚把我项目的DMA想法分享给群里,结果出现一些问题。 
            1. 串口初始化 
            2. DMA初始化 
              void MYDMA_Config() 
               {  
                    DMA_InitTypeDef  DMA_InitStructure; 
                    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); 
                    DMA_DeInit(DMA2_Stream7); 
                    while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){} 
                    DMA_InitStructure.DMA_Channel = DMA_Channel_4;  
                    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_ADDRESS; 
                    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer; 
                    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; 
                    DMA_InitStructure.DMA_BufferSize = 5; 
                    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_FIFOMode = DMA_FIFOMode_Disable;          
                    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; 
                    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; 
                    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; 
                    DMA_Init(DMA2_Stream7, &DMA_InitStructure); 
                    DMA_Cmd(DMA2_Stream7, ENABLE);                   
               }  
          3.主函数 
              int main(void) 
             { 
                     int i; 
                      rintf_Init(); 
                    for(i=0;i<5;i++)            (1) 
                    { 
                         Buffer=i+1; 
                    } 
                    MYDMA_Config();         (2) 
                   USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);    (3) 
                   return(0); 
              } 
          串口打印的数据是 : 
  
 
 
 
主函数 
                    MYDMA_Config();         (2)
  
 
 
                    for(i=0;i<5;i++)           (1) 
                    { 
                         Buffer=i+1; 
                    } 
                   这样的结果就丢失了第一个字节, 
 
                   搞了一晚上貌似没有网友碰到这样的问题? 
 
我还有一个想法就是   Buffer[] 数组DMA传输的,     每次可以传输数量可以改变]   ,也就是 
            DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //来改变传输量  原子哥例程里的 
 
两个发送函数 
void VIEWTECH_79 (u8 On_Time) 
{ 
int i; 
i=0; 
Buffer[i++]=0xAA; 
Buffer[i++]=0x79; 
Buffer[i++]=On_Time; 
Buffer[i++]=0xCC; 
Buffer[i++]=0x33; 
Buffer[i++]=0xC3; 
Buffer[i++]=0x3C; 
MYDMA_Enable(DMA2_Stream7, 7); 
} 
void VIEWTECH_52(void) 
{ 
u8 i=0; 
Buffer[i++]=0xAA; 
Buffer[i++]=0x52; 
Buffer[i++]=0xCC; 
Buffer[i++]=0x33; 
Buffer[i++]=0xC3; 
Buffer[i++]=0x3C; 
MYDMA_Enable(DMA2_Stream7, 6); 
} 
 
int main(void) 
{ 
int i; 
Printf_Init(); 
MYDMA_Config(); 
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  //?????®??1??DMA·???   
  
 VIEWTECH_79(100);  (1) 
VIEWTECH_52();           (2) 
 
return(0); 
} 
 
这样运行的结果:
  
 
 
	期待结果是:  AA 79 64 CC 33 C3 3C  AA 52 CC 33 C3 3C  
要是把(2)注释掉,运行结果是正确的:
 
  
 
 
 
我的想法是我要把我最新的buffer[]数据发出去,大神们帮忙看看,谢谢,估计以后有人也会遇到这样的问题!
  |   
 
 
最佳答案
查看完整内容[请看2#楼] 
回复【2楼】正点原子:
---------------------------------
解决方案是:
                              DMA_Cmd(DMA2_Stream7, ENABLE);    这条语句不能放在DMA初始化函数里,只要放在你构建好的数组后面就不会
	int i;
	Printf_Init() ... 
 
 
 
 
 
 
 |