对STM32F407的OV2640采集的数据在SRAM进行存储并在LCD 上显示对应数据
一、操作函数
(注:此函数均基于OV2640的源代码执行)
1、在LCD上对存储在SRAM的数组进行显示;
(1)源代码
u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组
for(ts=0;ts<250000;ts++)testsram[ts]=ts;//预存测试数据
for(ts=0;ts<250000;ts++)LCD_ShowxNum(60,190,testsram[ts],6,16,0);//显示测试数据
2、对OV2640采集到的数据存储到SRAM上再输出到LCD上
(1)灰度模式的RGB(源代码)
(注:对一个8位的二进制进行移位使其成为5位或6位的二进制)
(注:320*240代表有这么多的像素点,一个像素点是2个字节,32位的单片机是以4个字节为一个单位的)
//灰度模式
u16 Gray2GRB(u8 _gray)
{
u8 R=_gray>>3;//8位的灰度值左移3位
u8 G=_gray>>2;//8位的灰度值左移2位
u8 B=_gray>>3;//8位的灰度值左移3位
return (R<<11)|(G<<5)|B;//拼凑了一个返回一个16位的二进制
}
if(1)
{
u32 i;
//对320*240的的分辨率的屏幕进行赋值操作
for(i=0;i<320*240;i++)
{
DispBuf[i]=i;
}
//将灰度模式的RGB输出到LCD上
for(i=0;i<320*240;i++)
{
LCD->LCD_RAM=Gray2GRB(DispBuf[i]);
}
}
(2)RGB模式(源代码)
//显示函数
void DisplayBuf(void)
{
u32 i;
LCD_SetCursor(0,0);//设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
for(i=0;i<320*240;i++)
{
//LCD>LCD_RAM=RED;//DispBuf565[i];//SRAM的存储空间
LCD>LCD_RAM=DispBuf565[i]&0x07e0;//SRAM的存储空间绿色的RGB模式
}
}
if(1)
{
DisplayBuf();
}
(3)将摄像头OV2640的采集到的数据存储到DispBuf565(SRAM的存储空间)(源代码)
DCMI_DMA_Init((u32)DispBuf565,320*240/2,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI配置
(4)处理DCMI中断服务函数
//DCMI中断服务函数
void DCMI_IRQHandler(void)
{
if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET)//捕获到一帧图像
{
DCMI_Stop(); //停止传输
//jpeg_data_process(); //jpeg数据处理(因为我们是RGB模式,所以会注释掉这一句)
LED1=!LED1;//控制LED的闪烁
ov_frame++;
//LCD_SetCursor(0,0); //设置光标位置
//LCD_WriteRAM_Prepare(); //开始写入GRAM
DisplayBuf();//显示函数
DCMI_Start(); //开始传输
DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断
}
}
(5)LCD上像素点填充表示方法
(注:因为LCD上的存储空间只有一个单元,所以指针只指向此单元,所以设置一个光标即可。)
(注:DMA_MemoryInc_Disable是一个表示不增加存储地址的字符)(源代码)
//DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA 配置
(注:SRAM上的所有存储空间有很多单元,所以必须将地址自增标明)
(注:DMA_MemoryInc_Enable是一个表示增加存储地址的字符)(源代码)
DCMI_DMA_Init((u32)DispBuf565,320*240/2,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置