阿波罗F429摄像头问题求助

2019-07-20 01:41发布

#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).
小白一个,不太懂。求助各位大神。我把所有金钱都给出来。跪谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
琥珀少年
2019-07-20 03:48
本帖最后由 琥珀少年 于 2019-5-26 12:18 编辑
正点原子 发表于 2019-5-26 02:33
就只报了这一个错误么?
我换了阿波罗的摄像头例程,是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();

                                                
    }
        
}


一周热门 更多>