MT9D111调试----保存JPG格式图像

2019-12-31 19:13发布

各位高手:
   小弟现在使用STM32驱动MT9D111摄像头进行拍照,目前已配置图像输出大小为320*240,图片输出格式为RGB565。但是老总要求保存图片格式为JPG,MT9D111的手册我已经看了好几遍了,可能还是没有看懂。我觉得配置JPG格式太麻烦了,一时有点无从下手。希望哪位大侠能够指点迷津!
   另外还有一个问题:我是用STM32直接驱动,在每个像素时钟PCLK上升沿读取数据,由于STM32的速度不够快。这样读数据就会丢大量的数据。我想问下,怎样给STM32分频,MT9D111我用STM32的PA8提供8MHZ时钟频率的。我现在想知道,怎样配置寄存器,使PCLK的输出速率降下来,使STM32能够直接处理。
   拜托了!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
22条回答
dongfengge555
2020-01-02 01:18
现在遇到难题了哦。我现在在调MT9D111摄像头的BMP图片。我把图片送入TFT上显示,另加一个拍照键。当我按下拍照键,我会从屏的GRAM缓冲区中将屏上显示的图片数据读取出来,然后保存至SD中。
    但是这时候问题就出现了,有时候按下拍照键,会出现突然白屏的现象。数据也无法保存。一直没找到原因在哪。求高手指教!!!
static const u8 bmp_tou[54]={//构造bmp首部
        0x42, 0x4D, 0x36, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
        0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };

     //文件系统结构体定义
    FATFS fs;         /* Work area (file system object) for logical drives */
    FIL fsrca;     /* file objects */
    //BYTE buffer[1024];   /* file copy buffer */
    FRESULT res;         /* FatFs function common result code */
    UINT br, bw;         /* File read/write count */
    char buffer[960],i=0;
    XCHAR file_name[]="IMG00000.bmp";
    int tx,ty,rgb_datr;
    char R,G,B;
    int TPX=0,TPY=0;
    u8 RTC_FG=0;
    DIR dirs;
/*=================================变量定义=============================*/

#define key_state  GPIOC->IDR&GPIO_Pin_12
uint8_t key_val1,key_val2,key_val3;
/*=================================函数申明=============================*/
void RCC_Configuration(void);

/*===================================中断===============================*/
void EXTI2_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line2) != RESET)
     {
        if(key_state)
                {
                    key_val2++;
                    if(key_val2>3)
                    key_val2=3;
                }
                else if(key_val2>2)
                {
                 key_val1=1;
                     key_val2=0;
        }  
        if(key_val1==0)
                {
                  led_off;
                  pclk_on_l;//禁止外部CLK,使单片机WR与TFT WR相连       
                  cmos_cs_h;//禁止外部数据线,使单片机数据与TFT数据线相连       
                  tft_gpio_output();//数据线输出,准备连数据线到TFT
                 
                  LCD_WR_REG(0x0020,239);//
                  LCD_WR_REG(0x0021,0);//
                  LCD_WR_REG(0x0003,0x1028);

                  LCD_WR_REG(0x0020,0);//
                          LCD_WR_REG(0x0021,90);//改变坐标位置,移动图像位置
                          LCD_WR_REG(0x0003,0x1038);

                  LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
                  LCD_WR_REG(0x0051,239);//水平GRAM终止位置
                  LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
                  LCD_WR_REG(0x0053,319);//垂直GRAM终止位置         
                         
                        LCD_WR_REG16(0x0022);
                         
                        tft_gpio_input();//数据线输入,准备连接外部数据线到TFT                 
                          lcd_rs_h;//数据使能
                          lcd_wr_l;//使能外部时钟         

                          pclk_on_h;//使能外部CLK
                          cmos_cs_l;//使能外部数据线,与TFT数据线相连
                  lcd_cs_l;//
        }
        else
        {
            led_on;
            pclk_on_l;//禁止外部CLK,使单片机WR与TFT WR相连       
            cmos_cs_h;//禁止外部数据线,使单片机数据与TFT数据线相连       
                        EXTI->IMR &= 0<<2;//屏蔽场中断         
        }
        EXTI_ClearITPendingBit(EXTI_Line2);
     }
}

/*==================================主函数==============================*/
int main(void)
{
    RCC_Configuration();
        SPI_Configuration();
        LCD_Init();
        LCD_write_english_string(5,66+16,"MT9D111 Init......",0Xf800,0X0000);
               
        if(key_state)
        {
            while(canmera_9d111_init()!=1);
                while(canmera_9d111_init()!=1);
            LCD_write_english_string(5,66+16,"MT9D111 Init......ok",0Xf800,0X0000);
                delay_ms(1500);
                exti_interrupt_open(); //open vsync interrupt pd2
        }                                                                                                                                                                                                                

        while(1)
        {
                if(key_val1==1)
                {       
                        cmos_cs_h;//禁止外部数据线,使单片机数据与TFT数据线相连       
                pclk_on_l;//禁止外部CLK,使单片机WR与TFT WR相连       
                LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
                LCD_WR_REG(0x0051,239);//水平GRAM终止位置
                LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
                LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
                
                file_name[7]++;//更新文件名字
                if(file_name[7]>'9')
                {
                    file_name[7]='0';
                    file_name[6]++;
                    if(file_name[6]>'9')
                    {
                        file_name[6]='0';
                        file_name[5]++;
                        if(file_name[5]>'9')
                        {
                             file_name[5]='0';
                             file_name[4]++;
                             if(file_name[4]>'9')
                             {
                                 file_name[4]='0';
                                 file_name[3]++;            
                             }
                         }
                     }
                 }   
                 f_mount(0, &fs);
                 res = f_open(&fsrca,file_name, FA_CREATE_ALWAYS | FA_WRITE);  
                 res = f_write(&fsrca, bmp_tou,54, &bw);  
                 ////////////////////////////////////////////
                     for (ty = 0; ty < 240; ty++)
                 {
                         for(tx=319;tx>=0;tx--)
                     {              
                         LCD_WR_REG(0x0020,ty);//
                             LCD_WR_REG(0x0021,320-tx);//
                         LCD_WR_REG16(0x0022);
                         lcd_wr_h;
                         lcd_rs_h;
                         tft_gpio_input();
                         lcd_cs_l;
             
                         rgb_datr=LCD_RD_DATA16();//无用的读取////              
                         rgb_datr=LCD_RD_DATA16();//读GRAM//////////  
                         lcd_cs_h;
                         tft_gpio_output();
                         ///////R G B {MOD}空域变换/////////////
                         B = (rgb_datr>>8)&0xF8;
                         G = (rgb_datr>>3)&0xFC;
                         R = (rgb_datr<<3)&0xF8;
                                 buffer[tx*3+2] = R;
                                 buffer[tx*3+1] = G;
                                 buffer[tx*3+0] = B;
                         }
                     res = f_write(&fsrca, buffer, 960, &bw);   
                } /**/
                f_close(&fsrca);   
                f_mount(0,0);// Unregister a work area before discard it   
                        key_val1=0;
                        EXTI->IMR |= 1<<2;//中断屏蔽寄存器开启 连续采集
                }  
        }
}

一周热门 更多>