[mw_shl_code=c,true]//DCMI DMA配置
//memaddr:存储器地址 将要存储摄像头数据的内存地址(也可以是外设地址)
//memsize:存储器长度 0~65535
//memblen:存储器位宽 0,8位,1,16位,2,32位
//meminc:存储器增长方式,0,不增长;1,增长
void DCMI_DMA_Init(u32 memaddr,u16 memsize,u8 memblen,u8 meminc)
{
RCC->AHB1ENR|=1<<22; //DMA2时钟使能
while(DMA2_Stream1->CR&0X01);//等待DMA2_Stream1可配置
DMA2->LIFCR|=0X3D<<6*1; //清空通道1上所有中断标志
DMA2_Stream1->FCR=0X0000021;//设置为默认值
DMA2_Stream1->  AR=(u32)&DCMI->DR;//外设地址为  CMI->DR
DMA2_Stream1->M0AR=memaddr; //memaddr作为目标地址
DMA2_Stream1->NDTR=memsize; //传输长度为memsize
DMA2_Stream1->CR=0; //先全部复位CR寄存器值
DMA2_Stream1->CR|=0<<6; //外设到存储器模式
DMA2_Stream1->CR|=1<<8; //循环模式
DMA2_Stream1->CR|=0<<9; //外设非增量模式
DMA2_Stream1->CR|=meminc<<10; //存储器增量模式
DMA2_Stream1->CR|=2<<11; //外设数据长度:32位
DMA2_Stream1->CR|=memblen<<13; //存储器位宽,8/16/32bit
DMA2_Stream1->CR|=2<<16; //高优先级
DMA2_Stream1->CR|=0<<21; //外设突发单次传输
DMA2_Stream1->CR|=0<<23; //存储器突发单次传输
DMA2_Stream1->CR|=1<<25; //通道1 DCMI通道
DMA2_Stream1->FCR|=1<<2; //FIFO模式
DMA2_Stream1->FCR|=3<<0; //使用全FIFO
} [/mw_shl_code]
这是我的配置:
[mw_shl_code=c,true] DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,1,0);//DCMI DMA配置
[/mw_shl_code]
这句话之后,OV的数据,就直接到LCD屏了.
LCD是挂在外部总线的,如果将
[mw_shl_code=c,true]DCMI_DMA_Init的参数设置为外部存储器,并设置存储器增量模式,那么就可以存储到外部存储器.[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]不过有个bug,我用407,用内部SRAM,可以正常的接受数据,但是用外部SRAM,就有问题(大部分数据正常,有部分数据丢失),比较郁闷.一直没解决.[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code] |