#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "lcd.h"
#include "ltdc.h"
#include "sdram.h"
#include "key.h"
#include "malloc.h"
#include "usmart.h"
#include "w25qxx.h"
#include "sdio_sdcard.h"
#include "exfuns.h"
#include "text.h"
#include "piclib.h"
#include "string.h"
#include "math.h"
#include "ov2640.h"
#include "dcmi.h"
#include "pcf8574.h"
//ALIENTEK 阿波罗STM32F429开发板 扩展实验10
//OV2640照相机 实验
//技术支持:
www.openedv.com
//广州市星翼电子科技有限公司
u16 curline=0; //摄像头输出数据,当前行编号
u16 yoffset=0; //y方向的偏移量
u16 rgb_buf[144][176]; //存放像素的数组,大小为144*176
u16 gray;//定义灰度值
u16 hang=0;
u8 X_MAX,Y_MAX=0; //小球的坐标信息
u8 X_MAX_LSAT, X_MIN_LSAT, Y_MAX_LSAT, Y_MIN_LSAT=0; //上一次小球坐标位置信息
u8 X,Y=0; //小球的质心信息
u8 X_MIN,Y_MIN=180;
#define jpeg_buf_size 4*1024*1024 //定义JPEG数据缓存jpeg_buf的大小(4M字节)
#define jpeg_line_size 2*1024 //定义DMA接收数据时,一行数据的最大值
u32 *dcmi_line_buf[2]; //RGB屏时,摄像头采用一行一行读取,定义行缓存
u32 *jpeg_data_buf; //JPEG数据缓存buf
volatile u32 jpeg_data_len=0; //buf中的JPEG有效数据长度
volatile u8 jpeg_data_ok=0; //JPEG数据采集完成标志
//0,数据没有采集完;
//1,数据采集完了,但是还没处理;
//2,数据已经处理完成了,可以开始下一帧接收
//处理JPEG数据
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
u16 i;
u16 rlen; //剩余数据长度
u32 *pbuf;
curline=yoffset; //行数复位
}
//RGB565测试
void rgb565_test(void)
{
u8 key;
LCD_Clear(WHITE);
POINT_COLOR=RED;
OV2640_ImageWin_Set((800-480)/2,(600-600)/2,480,600);//前两个数为调节画面移动,后两个为分辨率,1200*1200的分辨率
OV2640_OutSize_Set(144,176); //144,176为分到液晶屏幕上144*176区域,大小和数组大小相同
OV2640_RGB565_Mode(); //RGB565模式
DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)rgb_buf,0,sizeof(rgb_buf)/4,1,1);//DCMI DMA配置//DMA搬运的像素点存放的地址为数组
DCMI_Start(); //启动传输
while(1)
{
key=KEY_Scan(0);
if(key)
{
DCMI_Stop(); //停止显示
switch(key)
{
case KEY0_PRES: //对比度设置
break;
case KEY1_PRES: //饱和度Saturation
break;
case KEY2_PRES: //特效设置
break;
case WKUP_PRES:
break;
}
DCMI_Start();//重新开始传输
}
delay_ms(10);
}
}
int main(void)
{
u8 key; //键值
u8 i;
u8 scale=1; //默认是全尺寸缩放
Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(90,115200); //初始化串口波特率为115200
usmart_dev.init(90);
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //初始化LCD
KEY_Init(); //初始化按键
POINT_COLOR=RED;
while(font_init()) //检查字库
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除显示
delay_ms(200);
}
Show_Str(30,50,200,16,"阿波罗STM32F4/F7开发板",16,0);
Show_Str(30,70,200,16,"OV2640照相机实验",16,0);
Show_Str(30,90,200,16,"KEY0:拍照(bmp格式)",16,0);
Show_Str(30,110,200,16,"KEY1:拍照(jpg格式)",16,0);
Show_Str(30,130,200,16,"WK_UP:FullSize/Scale",16,0);
Show_Str(30,150,200,16,"2016年6月22日",16,0);
while(OV2640_Init())//初始化OV2640
{
Show_Str(30,170,240,16,"OV2640 错误!",16,0);
delay_ms(200);
LCD_Fill(30,170,239,206,WHITE);
delay_ms(200);
}
Show_Str(30,210,210,16,"OV2640 正常",16,0);
rgb565_test(); //开始向数组传送图像数据
while(1)
{
key=KEY_Scan(0);//不支持连按
if((key)&&(key!=KEY2_PRES))
{
DCMI_Start();//开始显示
}
delay_ms(10);
i++;
if(i==20)//DS0闪烁.
{
i=0;
LED0=!LED0;
}
}
}
在原子的例程基础上做的修改,报了错。..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching test.o(.bss).
小白一个,不太懂。求助各位大神。我把所有金钱都给出来。跪谢。
我换了阿波罗的摄像头例程,是ov5640的。在例程基础上做了修改,不采用双缓冲模式。直接把像素点存在数组里的,也没有报错,就是没有图像,好像停在rgb565_test函数里面LCD_Clear(WHITE)就不运行了。这是怎么回事呢?代码贴出来,请原子哥帮我看看。万分感谢。
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "lcd.h"
#include "ltdc.h"
#include "sdram.h"
#include "key.h"
#include "usmart.h"
#include "timer.h"
#include "ov2640.h"
#include "dcmi.h"
#include "usart2.h"
//ALIENTEK 阿波罗STM32F429开发板 实验37
//摄像头 实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
u16 rgb_buf[144][176]; //存放像素的数组,大小为144*176
u16 gray;//定义灰度值
u16 hang=0;
u8 X_MAX,Y_MAX=0; //小球的坐标信息
u8 X_MAX_LSAT, X_MIN_LSAT, Y_MAX_LSAT, Y_MIN_LSAT=0; //上一次小球坐标位置信息
u8 X,Y=0; //小球的质心信息
u8 X_MIN,Y_MIN=180;
u8 ovx_mode=0; //bit0:0,RGB565模式;1,JPEG模式
u16 curline=0; //摄像头输出数据,当前行编号
u16 yoffset=0; //y方向的偏移量
//处理JPEG数据
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
u16 i;
u16 rlen; //剩余数据长度
u32 *pbuf;
curline=yoffset; //行数复位
}
//RGB565测试
//RGB数据直接显示在LCD上面
//RGB565测试
void rgb565_test(void)
{
u8 key;
LCD_Clear(WHITE);
POINT_COLOR=RED;
OV2640_ImageWin_Set((800-480)/2,(600-600)/2,480,600);//前两个数为调节画面移动,后两个为分辨率,1200*1200的分辨率
OV2640_OutSize_Set(144,176); //144,176为分到液晶屏幕上144*176区域,大小和数组大小相同
OV2640_RGB565_Mode(); //RGB565模式
DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)rgb_buf,0,sizeof(rgb_buf)/4,1,1);//DCMI DMA配置//DMA搬运的像素点存放的地址为数组
DCMI_Start(); //启动传输
while(1)
{
key=KEY_Scan(0);
if(key)
{
DCMI_Stop(); //停止显示
switch(key)
{
case KEY0_PRES: //对比度设置
break;
case KEY1_PRES: //饱和度Saturation
break;
case KEY2_PRES: //特效设置
break;
case WKUP_PRES:
break;
}
DCMI_Start();//重新开始传输
}
delay_ms(10);
}
}
int main(void)
{
u8 key;
u8 t;
u16 i,j;
Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(90,115200); //初始化串口波特率为115200
usart2_init(45,921600); //初始化串口2波特率为921600
LED_Init(); //初始化与LED连接的硬件接口
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
KEY_Init(); //初始化按键
usmart_dev.init(90); //初始化USMART
TIM3_Int_Init(10000-1,9000-1);//10Khz计数,1秒钟中断一次
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F4");
LCD_ShowString(30,70,200,16,16,"OV5640 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2015/12/30");
while(OV2640_Init())//初始化OV2640
{
LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
delay_ms(200);
LCD_Fill(30,130,239,170,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"OV2640 OK");
delay_ms(2000);
rgb565_test(); //开始向数组传送图像数据
while(1)
{
rgb565_test();
}
}
一周热门 更多>