xuyejin 发表于 2016-3-23 10:04:13

STM32F207 DMA老是发生TEIF错误怎么回事情?

各位大侠,你们好!

         在搞STM32F207的DMA过程中,从RAM到RAM传送数据,怎么老是发生TEIF错误?
从buffer1传送到buffer2,使用的都是内部RAM.使用TIM5 CH4比较输出来触发


u16 buffer1,buffer2;

void Lcd_DMA1_Init(void)
{
      DMA_InitTypeDef DMA_InitStructure;
      NVIC_InitTypeDefNVIC_InitStructure;

      // DMA clock enable
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // 开启DMA1时钟

      DMA_Cmd(DMA1_Stream1, DISABLE);
      DMA_DeInit(DMA1_Stream2);

      DMA_InitStructure.DMA_Channel = DMA_Channel_6;
      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)buffer1;    //(uint32_t)&LCD_Disp_Buff; //(GPIOB_BASE+0x14);
                        // 设置PB 输出寄存器
      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)buffer2;      
                        // 设置CH2 波形数据缓冲区
      DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;                     
                        // 设置外设位目标,内存缓冲区 -> 外设寄存器
      DMA_InitStructure.DMA_BufferSize = 480;                     
                        // 需要发送的字节数,这里其实可以设置为0,
                        // 因为在实际要发送的时候,会重新设置次值
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;      
                        // 外设地址不做增加调整,调整不调整是DMA自动实现的
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;               
                        // 内存缓冲区地址增加调整
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
                        // 外设数据宽度16位,2个字节
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;         
                        // 内存数据宽度16位,2个字节
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           
                        // 循环传输模式
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;               
                        // 优先级设置
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
                        // 打开FIFO模式
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
                        // 打开FIFO检测一半为空
      DMA_InitStructure.DMA_MemoryBurst = DMA_PeripheralBurst_Single;
                        // 内存一次传输8字节
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
                        // 外设一次传输1字节
      
      DMA_Init(DMA1_Stream1, &DMA_InitStructure);               
                        // 写入配置
/*
      NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);

      DMA_ITConfig(DMA1_Stream1, DMA_IT_TC, ENABLE);
                        // 开启发送DMA通道中断
      DMA_ClearFlag(DMA1_Stream1,DMA_FLAG_TCIF1|DMA_FLAG_HTIF1|DMA_FLAG_TEIF1|DMA_FLAG_DMEIF1|DMA_FLAG_FEIF1);                                 
*/                        // 清除DMA所有标志
      DMA_Trans_Lines =0;               
      DMA_Cmd(DMA1_Stream1, ENABLE);
                        // 打开DMA
}


为什么?– A bus error occurs during a DMA read or a write access? 在那里出错?

xuyejin 发表于 2016-3-23 10:06:00

一运行DMA_Cmd(DMA1_Stream1, ENABLE); 马上置位TEIF,EN清零

xuyejin 发表于 2016-3-23 14:55:01

问题找到了,好像,不知道对不对。看STM32F207 资料 RM0033第178页的那张图,DMA1的peripheral port就不能够实现memory to memory DMA,要实现只能用DMA2,改为DMA2通道好像就不会出现了,给大家分享下。
页: [1]
查看完整版本: STM32F207 DMA老是发生TEIF错误怎么回事情?