OpenEdv-开源电子网

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

OV2640的原子例程中的摄像头数据存放哪个地方呢,找半天找不到啊

[复制链接]

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
发表于 2017-8-5 17:03:51 | 显示全部楼层 |阅读模式
1金钱
OV2640的原子例程中的摄像头数据存放哪个地方呢,找半天找不到啊代码在这里
各位大神大哥大佬大妹子们帮忙啊


//DCMI DMA配置
//DMA_Memory0BaseAddr:存储器地址    将要存储摄像头数据的内存地址(也可以是外设地址)
//DMA_BufferSize:存储器长度    0~65535
//DMA_MemoryDataSize:存储器位宽  
//DMA_MemoryDataSize:存储器位宽    @defgroup DMA_memory_data_size MA_MemoryDataSize_Byte/DMA_MemoryDataSize_HalfWord/DMA_MemoryDataSize_Word
//DMA_MemoryInc:存储器增长方式  @defgroup DMA_memory_incremented_mode  /** @defgroup DMA_memory_incremented_mode : DMA_MemoryInc_Enable/DMA_MemoryInc_Disable
void DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc)
{
        DMA_InitTypeDef  DMA_InitStructure;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
        DMA_DeInit(DMA2_Stream1);
        while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置
       
  /* 配置 DMA Stream */
  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //通道1 DCMI通道
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//外设地址为CMI->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;//DMA 存储器0地址
  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;//外设数据长度:32位
  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; //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
       
}
//DCMI初始化
void My_DCMI_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA B C E 时钟
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI,ENABLE);//使能DCMI时钟
  //PA4/6初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;//PA4/6   复用功能输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;// PB6/7   复用功能输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;//PC6/7/8/9/11 复用功能输出
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化       

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;//PE5/6  复用功能输出
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化       

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_DCMI); //PA4,AF13  DCMI_HSYNC
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_DCMI); //PA6,AF13  DCMI_PCLK  
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_DCMI); //PB7,AF13  DCMI_VSYNC
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_DCMI); //PC6,AF13  DCMI_D0  
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_DCMI); //PC7,AF13  DCMI_D1
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI); //PC8,AF13  DCMI_D2
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI); //PC9,AF13  DCMI_D3
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI);//PC11,AF13 DCMI_D4
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_DCMI); //PB6,AF13  DCMI_D5
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_DCMI); //PE5,AF13  DCMI_D6
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_DCMI); //PE6,AF13  DCMI_D7

       
        DCMI_DeInit();//清除原来的设置


  DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//连续模式
        DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//全帧捕获
        DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8位数据格式  
        DCMI_InitStructure.DCMI_HSPolarity= DCMI_HSPolarity_Low;//HSYNC 低电平有效
        DCMI_InitStructure.DCMI_PCKPolarity= DCMI_PCKPolarity_Rising;//PCLK 上升沿有效
        DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//硬件同步HSYNC,VSYNC
        DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_Low;//VSYNC 低电平有效
        DCMI_Init(&DCMI_InitStructure);

        DCMI_ITConfig(DCMI_IT_FRAME,ENABLE);//开启帧中断
       
        DCMI_Cmd(ENABLE);        //DCMI使能

  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、

}
//DCMI,启动传输
void DCMI_Start(void)
{  
  LCD_SetCursor(0,0);  
        LCD_WriteRAM_Prepare();                //开始写入GRAM
        DMA_Cmd(DMA2_Stream1, ENABLE);//开启DMA2,Stream1
        DCMI_CaptureCmd(ENABLE);//DCMI捕获使能  
}
//DCMI,关闭传输
void DCMI_Stop(void)
{
  DCMI_CaptureCmd(DISABLE);//DCMI捕获使关闭       
       
        while(DCMI->CR&0X01);                //等待传输结束
                
        DMA_Cmd(DMA2_Stream1,DISABLE);//关闭DMA2,Stream1
}
////////////////////////////////////////////////////////////////////////////////
//以下两个函数,供usmart调用,用于调试代码

//DCMI设置显示窗口
//sx,sy;LCD的起始坐标
//width,heightCD显示范围.
void DCMI_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{
        DCMI_Stop();
        LCD_Clear(WHITE);
        LCD_Set_Window(sx,sy,width,height);
        OV2640_OutSize_Set(width,height);
  LCD_SetCursor(0,0);  
        LCD_WriteRAM_Prepare();                //开始写入GRAM
       
        DMA_Cmd(DMA2_Stream1,ENABLE);        //开启DMA2,Stream1
       
        DCMI_CaptureCmd(ENABLE);//DCMI捕获使能
       
}

//通过usmart调试,辅助测试用.
//pclk/hsync/vsync:三个信号的有限电平设置
void DCMI_CR_Set(u8 pclk,u8 hsync,u8 vsync)
{
        DCMI_DeInit();//清除原来的设置

  DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//连续模式
        DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//全帧捕获
        DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8位数据格式  
        DCMI_InitStructure.DCMI_HSPolarity= hsync<<6;//HSYNC 低电平有效
        DCMI_InitStructure.DCMI_PCKPolarity= pclk<<5;//PCLK 上升沿有效
        DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//硬件同步HSYNC,VSYNC
        DCMI_InitStructure.DCMI_VSPolarity=vsync<<7;//VSYNC 低电平有效
        DCMI_Init(&DCMI_InitStructure);

        DCMI_CaptureCmd(ENABLE);//DCMI捕获使能
        DCMI_Cmd(ENABLE);        //DCMI使能

}










最佳答案

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

兄弟,我也在做这个,它直接存到 &LCD->LCD_RAM 的地址了,不过不知道怎么赋给数组好。 DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-8-5
在线时间
6 小时
发表于 2017-8-5 17:03:52 | 显示全部楼层
本帖最后由 世界那么大 于 2017-8-5 17:38 编辑

兄弟,我也在做这个,它直接存到 &LCD->LCD_RAM 的地址了,不过不知道怎么赋给数组好。
DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置  

回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2017-8-5 18:17:07 | 显示全部楼层
LCD->LCD_RAM换成你的数组名就是了  ,但是DMA最大就65536  ,所以图像就不能太大,而且数组给LCD显示没有摄像头给数组快,就比较容易花屏

阔以用DMA将数组的数据搬运给lcd这样会好点  
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
 楼主| 发表于 2017-8-5 19:56:24 | 显示全部楼层
世界那么大 发表于 2017-8-5 17:36
兄弟,我也在做这个,它直接存到 &LCD->LCD_RAM 的地址了,不过不知道怎么赋给数组好。
DCMI_DMA_Init((u ...

我也找到了,不过也遇到和你一样的问题
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
 楼主| 发表于 2017-8-5 19:58:22 | 显示全部楼层
huyang201306 发表于 2017-8-5 18:17
LCD->LCD_RAM换成你的数组名就是了  ,但是DMA最大就65536  ,所以图像就不能太大,而且数组给LCD显示没有 ...

一个图像肯定放不完,得用动态内存和多缓存,不过我每学到这里,不能理解,书到用时方恨少啊
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-8-5
在线时间
7 小时
发表于 2017-8-6 15:43:15 | 显示全部楼层
直接定义个数组,让其指向DMA_Memory0BaseAddr,
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-8-5
在线时间
7 小时
发表于 2017-8-6 15:43:26 | 显示全部楼层
直接定义个数组,让其指向DMA_Memory0BaseAddr,
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
 楼主| 发表于 2017-8-7 12:52:36 | 显示全部楼层
吴语wcy 发表于 2017-8-6 15:43
直接定义个数组,让其指向DMA_Memory0BaseAddr,

现在解决了图像地址的问题了,不过很不幸的是STM32F407系列的板载Flash装不下定义的数组,现在正在想办法解决
回复

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2016-8-17
在线时间
16 小时
发表于 2017-8-7 17:23:53 | 显示全部楼层
楼主可以分享一下吗
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-8-5
在线时间
7 小时
发表于 2017-8-8 08:30:31 | 显示全部楼层
742746101 发表于 2017-8-7 12:52
现在解决了图像地址的问题了,不过很不幸的是STM32F407系列的板载Flash装不下定义的数组,现在正在想办法 ...

怎么样了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-7-26
在线时间
7 小时
发表于 2017-8-9 10:12:24 | 显示全部楼层
楼主可以把解决后的程序发一下吗
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
 楼主| 发表于 2017-8-14 01:16:43 | 显示全部楼层
梦飞翔 发表于 2017-8-7 17:23
楼主可以分享一下吗

可以啊,不过我在外地,得回去再发,提醒一下最好,要不我可能忘嘞
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
 楼主| 发表于 2017-8-14 01:19:02 | 显示全部楼层

做好了,效果还行,程序加入二值化,数组基本压榨完了板上的存储资源,不过有的地方原理还不太明白,到时候发帖问原子哥
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-7-12
在线时间
13 小时
 楼主| 发表于 2017-8-14 01:19:26 | 显示全部楼层
erer 发表于 2017-8-9 10:12
楼主可以把解决后的程序发一下吗

做好了,效果还行,程序加入二值化,数组基本压榨完了板上的存储资源,不过有的地方原理还不太明白,到时候发帖问原子哥
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-9-2
在线时间
0 小时
发表于 2018-9-2 11:26:11 | 显示全部楼层
楼主可以分享一一下吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 07:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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