OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5653|回复: 4

STM32F407 DCMI数据DMA到SRAM

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-5-11
在线时间
0 小时
发表于 2016-5-11 16:02:07 | 显示全部楼层 |阅读模式
3金钱
        摄像头OV2460,输出800*600像素。
       我现在用的是320*240像素,输出RGB565格式,配置DMA,DCMI_DMA_Init((u32)Bank1_SRAM3_ADDR,0,38400,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable );数据能够一次传输到SRAM,且数据正常,再传到LCD正常显示。
     现在我要摄像头输出800*600像素,DMA一次可操作的数据长度最大65536也不够我的一帧图像数据。
     求问怎么把一帧数据保存在SRAM。


     我试过在DMA传输中断中改变缓存地址,但是数据错乱,(貌似是影响DMA速度,把DCMI的数据漏了)
     有人说可以用双缓冲,但是不明白具体怎么做,在双缓冲里,把数据COPY出来,但是速度能跟的上么
    有没有更好的方法,求告知


void DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u32 DMA_Memory1BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc)
{
        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//
        DMA_DeInit(DMA2_Stream1);//μè′yDMA2_Stream1
        while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}
       
  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = DMA_BufferSize;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream1, &DMA_InitStructure);//3õê¼»ˉDMA Stream
       
       
                       
        if(DMA_Memory1BaseAddr)
  {
                DMA_DoubleBufferModeCmd(DMA2_Stream1,ENABLE);
          DMA_MemoryTargetConfig(DMA2_Stream1,DMA_Memory1BaseAddr,DMA_Memory_1);
                DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE);
               
                NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;               
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
                NVIC_Init(&NVIC_InitStructure);       
        }
               
       


最佳答案

查看完整内容[请看2#楼]

参考我们的DCMI传输到LCD的配置。设置传输长度是1,循环传送。你只要把目标存储器改为地址自增就行了。 不过提醒你一下,要降低DCMI的输出速度,否则sram速度不够快,会丢失数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-5-11 16:02:08 | 显示全部楼层
参考我们的DCMI传输到LCD的配置。设置传输长度是1,循环传送。你只要把目标存储器改为地址自增就行了。  不过提醒你一下,要降低DCMI的输出速度,否则sram速度不够快,会丢失数据。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-13
在线时间
8 小时
发表于 2016-6-30 15:55:39 | 显示全部楼层
正点原子 发表于 2016-5-11 19:41
参考我们的DCMI传输到LCD的配置。设置传输长度是1,循环传送。你只要把目标存储器改为地址自增就行了。  不 ...

这样貌似不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-6-30 23:32:22 | 显示全部楼层

说明你没写对代码,慢慢调试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-12-10
在线时间
13 小时
发表于 2020-3-15 10:38:53 | 显示全部楼层
正点原子 发表于 2016-5-11 16:02
参考我们的DCMI传输到LCD的配置。设置传输长度是1,循环传送。你只要把目标存储器改为地址自增就行了。  不 ...

您好,我参照stm32f4 “实验35 摄像头实验”做了下测试,按照 原子哥 的建议:1. DMA_Memory0BaseAddr使用的是外部sram地址。
2. DMA_BufferSize设置为1
3. DMA_MemoryInc设置为自增
4. 传输完一帧中断中重新设置传输量。


目前的遇到的问题:
外部sram中仅有第一个像素有值,其他全为0。如果使用LCD屏测试,DMA_MemoryInc设置为不自增,图像是正常的,猜测是LCD有地址自增,所以结果正确。

我的问题:
外部sram如何设置地址自增?

我的dma配置如下:        DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //通道1 DCMI通道
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//外设地址为CMI->DR
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)im;//外部sram存储器空间,im为指针
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到存储器模式
        DMA_InitStructure.DMA_BufferSize = 1;//数据传输量
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO模式        
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//使用全FIFO
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//外设突发单次传输
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//存储器突发单次传输
        DMA_Init(DMA2_Stream1, &DMA_InitStructure);//初始化DMA Stream







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 17:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表