因为我要做无线视频传输 所以将摄像头实验例程中DCMI_DMA传输到的内存有LCD->LCD_RAM 改为了一个外部SRAM的一个大数组U16 buff[384000]
但是出现了只能lcd一部分显示图像剩下全是花屏 不知为什么 摄像头输出速率也调过没有反应 求大神帮忙看一下@正点原子
#define jpeg_buf_size 384000 //定义JPEG数据缓存jpeg_buf的大小(*4字节)31*1024
//__align(4) u32 jpeg_buf[jpeg_buf_size]; //JPEG数据缓存buf
u16 jpeg_buf[jpeg_buf_size] __attribute__((at(0X68000000))); //JPEG数据缓存buf
//RGB565测试
//RGB数据直接显示在LCD上面
void rgb565_test(void)
{
u8 key;
int i=0;
int j=0;
int flag=0;
LCD_Clear(WHITE);
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4");
LCD_ShowString(30,70,200,16,16,"OV2640 RGB565 Mode");
LCD_ShowString(30,100,200,16,16,"KEY0:Contrast"); //对比度
LCD_ShowString(30,130,200,16,16,"KEY1:Saturation"); // {MOD}彩饱和度
LCD_ShowString(30,150,200,16,16,"KEY2:Effects"); //特效
LCD_ShowString(30,170,200,16,16,"KEY_UP:FullSize/Scale"); //1:1尺寸(显示真实尺寸)/全尺寸缩放
ov2640_speed_ctrl();
OV2640_RGB565_Mode(); //RGB565模式
DCMI_Init(); //DCMI配置
// DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,1,0);//DCMI DMA配置
DCMI_DMA_Init((u32)&jpeg_buf,384000,1,1);//DCMI DMA配置
OV2640_OutSize_Set(480,800);
DCMI_Start(); //启动传输
printf("out
");
while(1)
{
LCD_SetCursor(0x0000,0X0000);
LCD_WriteRAM_Prepare(); //开始写入GRAM
for(j=0;j<384000;j++)
{
LCD->LCD_RAM=jpeg_buf[j];
}
delay_ms(500);//delay_ms(10) 这个延时的长短决定摄像头采集图像质量 延时长点图像效果好
}
}
原子哥 我想实现一个无线视频传输功能,试过以下方法:
1.直接定义一个u16 ram; lcd->lcd_ram=ram;这种方法我想的原理就是和直接给lcd显存数据一样lcd屏幕全是花屏,这种方法失败,但原因并不清楚,想不通有点。
2.定义一个内部sram最大的数组,摄像头数据存在这个数组中直接,将lcd分成几部分(类似于页)显示,但是有很多重叠画面,失败,原因是摄像头更新速度和存放到数组的速度不匹配,且不好控制为一致。
3.定时器读取一块屏幕上的GRAM值,然后传输到另一块单片机再显示出来,基本上不可行,读取行——400,还不是太卡,当读取到800行的时候,传输方的lcd就卡的不动了,调定时器时间不能解决。并且这种方法我觉得也不太好,就算成功了也应该很慢,不实时。
4.用外部sram定义一个56000数组然后显示240*240的视屏画面还可以,不卡,但是就是画面不太大。
我看到网上有视频用的103做得很不错,不知原子哥有没有其他好的方向或者思路
另附一个别人做的网址:http://v.youku.com/v_show/id_XODc3OTcwNjMy.html
倒是看不太清楚到底是不是实时传输@正点原子
原子哥
或者我直接不用rgb565模式 用jpeg模式的话是不是数组大小空间就省下了 明天再试试jpeg模式
一周热门 更多>