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

STM32F207 DMA Memory to peripheral可以更新GPIOB->ODR么?

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


        我在使用207的DMA往GPIOB端口送数据,怎么老是TEIF FEIF同时置位?
我外部RAM是IS61WV25616,用TIM5_TRIG触发DMA,程序如下:

        TIM_DMACmd(TIM5, TIM_DMA_Trigger, ENABLE);
;
void 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)(GPIOB_BASE+0x14);//GPIOB->ODR
                        // 设置PB 输出寄存器
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&Buff[0];         
                        // 设置CH2 波形数据缓冲区
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;                     
                        // 设置外设位目标,内存缓冲区 -> 外设寄存器
        DMA_InitStructure.DMA_BufferSize = 480;                     
                        // 需要发送的字节数,这里其实可以设置为0,
                        // 因为在实际要发送的时候,会重新设置次值
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        
                        // 外设地址不做增加调整,调整不调整是DMA自动实现的
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 
                        // 内存缓冲区地址增加调整
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
                        // 外设数据宽度16位,2个字节
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;         
                        // 内存数据宽度16位,2个字节
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           
                        // 循环传输模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                 
                        // 优先级设置
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
                        // 打开FIFO模式
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
                        // 打开FIFO检测一半为空
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
                        // 内存一次传输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
}

初始化后,一运行DMA_Cmd(DMA1_Stream1, ENABLE); EN马上就清零,TEIF FEIF同时置位,DMA_BufferSize 由480变为479




各位能够帮我看看到底是怎么回事情么?问题出在那里?
收藏 评论3 发布时间:2016-3-23 00:01

举报

3个回答
xuyejin 回答时间:2016-3-23 14:52:54
问题找到了,好像,不知道对不对。看STM32F207 资料 RM0033第178页的那张图,DMA1的peripheral port就不能够实现memory to memory DMA,要实现只能用DMA2

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

xuyejin 回答时间:2016-3-23 14:53:10
给大家分享下
xmshao 回答时间:2016-3-28 08:36:35
xuyejin 发表于 2016-3-23 14:52
问题找到了,好像,不知道对不对。看STM32F207 资料 RM0033第178页的那张图,DMA1的peripheral port就不能 ...

是的 谢谢!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版