你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
xuyejin 提问时间:2016-3-23 10:04 /
各位大侠,你们好!

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


u16 buffer1[480],buffer2[480];

void Lcd_DMA1_Init(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef  NVIC_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[0]; //(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? 在那里出错?

收藏 评论2 发布时间:2016-3-23 10:04

举报

2个回答
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通道好像就不会出现了,给大家分享下。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版