STM32F407的DMA_BufferSize最大能设置多少字节?600KB似乎不行。

2019-07-20 21:02发布

这个数值最大是多少呢?受RAM大小限制吗?

谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-07-21 00:22
16位,最多65535
HenryYam
2楼-- · 2019-07-21 04:46
我是用DMA+DCMI来读取OV2640的图像数据到内存,然后处理一下再送LCD显示。

这样是不是需要在内存中开辟一帧数据的空间作缓存?DMA支持这么大的缓存吗?

phoenix
3楼-- · 2019-07-21 06:12
本帖最后由 phoenix 于 2016-7-11 22:52 编辑
HenryYam 发表于 2016-7-11 22:10
我是用DMA+DCMI来读取OV2640的图像数据到内存,然后处理一下再送LCD显示。

这样是不是需要在内存中开辟 ...

当然要在内存中开辟空间做缓存,比如定义一个数组。具体大小要看你要用多少和内存的大小(受内存大小限制)。

如果是内部SRAM,F407是192k,去了程序用到,你试试你用来做缓存的有多大,我试过220*280*2=120K

如果是外部SRAM,探索者是1M。但应该注意以下几点(原子哥原话)

1,设置存储器地址自增。
2,传输长度为1(参考我们摄像头例程)。
3,注意在每一帧传输完成后,重新设置存储器首地址。
4,注意降低OV2640的输出速率,否则SRAM存储不过来。
HenryYam
4楼-- · 2019-07-21 09:33
 精彩回答 2  元偷偷看……
phoenix
5楼-- · 2019-07-21 13:28
HenryYam 发表于 2016-7-12 12:29
谢谢回复!

我想存一幅 640*480大小的RGB565图片,处理后再送LCD显示。所以需要600KB大小的缓存。外部 ...

1、如果传输长度为1,是不是每次只传一个像素就完了?


这里的“传输长度”是指每次的搬运数据量,直至把一帧的所有数据搬运完毕才停止。





2、如何在帧中断内重设存储器首地址?请详述为盼。


把修改DMA的地址寄存器的代码加到帧中断内,如你定义的数组为:buf_CAM,则

DMA2_Stream1->M0AR = (u32)&buf_CAM;//(寄存器版本)

DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&buf_CAM;//(库函数版本)






3、OV2640的输出速率可设置?如何设置?


通过对OV2640的0xD3寄存器(DSP设置区)、0x11寄存器(Sensor设置区)设置,对时钟进行降频,从而改变了OV2640的输出速率(VSYNC周期)。

本人没有进行相关测试,这有原子的代码,供你参考调试。

//OV2640速度控制
//根据LCD分辨率的不同,设置不同的参数
void ov2640_speed_ctrl(void)
{
        u8 clkdiv,pclkdiv;                //时钟分频系数和PCLK分频系数

        if(lcddev.width==240)                //2.8寸LCD
        {
                clkdiv=1;
                pclkdiv=28;
        }else if(lcddev.width==320)        //3.5寸LCD
        {
                clkdiv=3;
                pclkdiv=15;
        }else                                //4.3/7寸LCD
        {
                clkdiv=15;
                pclkdiv=4;
        }
        SCCB_WR_Reg(0XFF,0X00);               
        SCCB_WR_Reg(0XD3,pclkdiv);        //设置PCLK分频
        SCCB_WR_Reg(0XFF,0X01);
        SCCB_WR_Reg(0X11,clkdiv);        //设置CLK分频       
}


HenryYam
6楼-- · 2019-07-21 18:08
 精彩回答 2  元偷偷看……

一周热门 更多>