各位高手:
小弟现在使用STM32驱动MT9D111摄像头进行拍照,目前已配置图像输出大小为320*240,图片输出格式为RGB565。但是老总要求保存图片格式为JPG,MT9D111的手册我已经看了好几遍了,可能还是没有看懂。我觉得配置JPG格式太麻烦了,一时有点无从下手。希望哪位大侠能够指点迷津!
另外还有一个问题:我是用STM32直接驱动,在每个像素时钟PCLK上升沿读取数据,由于STM32的速度不够快。这样读数据就会丢大量的数据。我想问下,怎样给STM32分频,MT9D111我用STM32的PA8提供8MHZ时钟频率的。我现在想知道,怎样配置寄存器,使PCLK的输出速率降下来,使STM32能够直接处理。
拜托了!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
另外,要告诉大家一个好消息。昨天我终于把MT9D111调通了,配置图像输出大小为320*240,输出格式为RGB565,BMP的。图像送到TFT屏上显示。200万像素的MT9D111,显示在屏上的图像还不错。唯一的缺陷就是图像不是太流畅。呵呵
希望有朋友和我一起研究MT9D111的JPEG图像格式的配置。
但是这时候问题就出现了,有时候按下拍照键,会出现突然白屏的现象。数据也无法保存。一直没找到原因在哪。求高手指教!!!
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;//中断屏蔽寄存器开启 连续采集
}
}
}
-----------------------------------------------------------------------
楼主 请问你是用的stm32f103的吗 怎样使PCLK的输出速率降下来,使STM32能够直接处理?谢谢了
一周热门 更多>