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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版