久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
STM32 OV2640攝像頭黑白照相機實驗的源碼資料
[打印本頁]
作者:
夢魘武士
時間:
2018-4-30 17:04
標(biāo)題:
STM32 OV2640攝像頭黑白照相機實驗的源碼資料
做黑白照相機的,希望可以給大家參考
實驗器材:
探索者STM32F4開發(fā)板
實驗?zāi)康?
學(xué)習(xí)OV2640攝像頭,BMP編碼和文件系統(tǒng)的使用,實現(xiàn)一個簡單的照相機.
硬件資源:
1,DS0(連接在PF9),DS1(連接在PF10)
2,串口1(波特率:115200,PA9/PA10連接在板載USB轉(zhuǎn)串口芯片CH340上面)
3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模塊(通過FSMC驅(qū)動,FSMC_NE4接LCD片選/A6接RS)
4,按鍵KEY0(PE4)/KEY1(PE3)/KEY_UP(PA0,也稱之為WK_UP)
5,SD卡,通過SDIO(SDIO_D0~D4(PC8~PC11),SDIO_SCK(PC12),SDIO_CMD(PD2))連接
6,蜂鳴器(PF8)
7,DCMI接口(用于驅(qū)動OV2640攝像頭模塊)
8,定時器3(用于打印攝像頭幀率等信息)
9,ALIENTEK OV2640攝像頭模塊,連接關(guān)系為:
OV2640模塊 ------------ STM32開發(fā)板
OV_D0~D7 ------------ PE6/PE5/PB6/PC11/PC9/PC8/PC7/PC6
OV_SCL ------------ PD6
OV_SDA ------------ PD7
OV_VSYNC ------------ PB7
OV_HREF ------------ PA4
OV_RESET ------------ PG15
OV_PCLK ------------ PA6
OV_PWDN ------------ PG9
實驗現(xiàn)象:
本實驗開機的時候先檢測字庫,然后檢測SD卡根目錄是否存在PHOTO文件夾,如果不存在則創(chuàng)建,如果創(chuàng)建失敗,則報錯(提示拍照功能不可用)。在找到SD卡的PHOTO文件夾后,開始初始化OV2640,在初始化成功之后,就一直在屏幕顯示OV2640拍到的內(nèi)容。
按下KEY0,可以拍bmp圖片照片(分辨率為:LCD辨率)。拍照保存成功之后,蜂鳴器會發(fā)出“滴”的一聲,提示拍照成功。
DS0還是用于指示程序運行狀態(tài),DS1用于提示DCMI幀中斷。
注意事項:
1,4.3寸和7寸屏需要比較大電流,USB供電可能不足,請用外部電源適配器(推薦外接12V 1A電源).
2,本例程在LCD_Init函數(shù)里面(在ILI93xx.c),用到了printf,如果不初始化串口1,將導(dǎo)致液晶無法顯示!!
3,該實驗須自備SD卡和ALIENTEK OV2640模塊各一個.
(攝像頭初始化為YUV422格式,輸送到LCD屏上顯示,當(dāng)按下拍照鍵后,讀取屏幕點數(shù)據(jù),把RGB565格式的雙字節(jié)提取為單字節(jié)的Y量,即亮度值,而后,逐點寫入SD卡后生成灰度BMP文件。)
單片機源程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "sram.h"
#include "malloc.h"
#include "w25qxx.h"
#include "sdio_sdcard.h"
#include "ff.h"
#include "exfuns.h"
#include "fontupd.h"
#include "text.h"
#include "piclib.h"
#include "string.h"
#include "math.h"
#include "dcmi.h"
#include "ov2640.h"
#include "beep.h"
#include "timer.h"
u8 ov2640_mode=0; //工作模式:0,RGB565模式;1,JPEG模式
#define jpeg_dma_bufsize 5*1024 //定義JPEG DMA接收時數(shù)據(jù)緩存jpeg_buf0/1的大小(*4字節(jié))
volatile u32 jpeg_data_len=0; //buf中的JPEG有效數(shù)據(jù)長度(*4字節(jié))
volatile u8 jpeg_data_ok=0; //JPEG數(shù)據(jù)采集完成標(biāo)志
//0,數(shù)據(jù)沒有采集完;
//1,數(shù)據(jù)采集完了,但是還沒處理;
//2,數(shù)據(jù)已經(jīng)處理完成了,可以開始下一幀接收
u32 *jpeg_buf0; //JPEG數(shù)據(jù)緩存buf,通過malloc申請內(nèi)存
u32 *jpeg_buf1; //JPEG數(shù)據(jù)緩存buf,通過malloc申請內(nèi)存
u32 *jpeg_data_buf; //JPEG數(shù)據(jù)緩存buf,通過malloc申請內(nèi)存
//處理JPEG數(shù)據(jù)
//當(dāng)采集完一幀JPEG數(shù)據(jù)后,調(diào)用此函數(shù),切換JPEG BUF.開始下一幀采集.
void jpeg_data_process(void)
{
u16 i;
u16 rlen;//剩余數(shù)據(jù)長度
u32 *pbuf;
if(ov2640_mode)//只有在JPEG格式下,才需要做處理.
{
if(jpeg_data_ok==0) //jpeg數(shù)據(jù)還未采集完?
{
DMA2_Stream1->CR&=~(1<<0); //停止當(dāng)前傳輸
while(DMA2_Stream1->CR&0X01); //等待DMA2_Stream1可配置
rlen=jpeg_dma_bufsize-DMA2_Stream1->NDTR;//得到剩余數(shù)據(jù)長度
pbuf=jpeg_data_buf+jpeg_data_len;//偏移到有效數(shù)據(jù)末尾,繼續(xù)添加
if(DMA2_Stream1->CR&(1<<19))for(i=0;i<rlen;i++)pbuf[i]=jpeg_buf1[i];//讀取buf1里面的剩余數(shù)據(jù)
else for(i=0;i<rlen;i++)pbuf[i]=jpeg_buf0[i];//讀取buf0里面的剩余數(shù)據(jù)
jpeg_data_len+=rlen; //加上剩余長度
jpeg_data_ok=1; //標(biāo)記JPEG數(shù)據(jù)采集完按成,等待其他函數(shù)處理
}
if(jpeg_data_ok==2) //上一次的jpeg數(shù)據(jù)已經(jīng)被處理了
{
DMA2_Stream1->NDTR=jpeg_dma_bufsize;//傳輸長度為jpeg_buf_size*4字節(jié)
DMA2_Stream1->CR|=1<<0; //重新傳輸
jpeg_data_ok=0; //標(biāo)記數(shù)據(jù)未采集
jpeg_data_len=0; //數(shù)據(jù)重新開始
}
}
}
//jpeg數(shù)據(jù)接收回調(diào)函數(shù)
void jpeg_dcmi_rx_callback(void)
{
u16 i;
u32 *pbuf;
pbuf=jpeg_data_buf+jpeg_data_len;//偏移到有效數(shù)據(jù)末尾
if(DMA2_Stream1->CR&(1<<19))//buf0已滿,正常處理buf1
{
for(i=0;i<jpeg_dma_bufsize;i++)pbuf[i]=jpeg_buf0[i];//讀取buf0里面的數(shù)據(jù)
jpeg_data_len+=jpeg_dma_bufsize;//偏移
}else //buf1已滿,正常處理buf0
{
for(i=0;i<jpeg_dma_bufsize;i++)pbuf[i]=jpeg_buf1[i];//讀取buf1里面的數(shù)據(jù)
jpeg_data_len+=jpeg_dma_bufsize;//偏移
}
}
//切換為OV2640模式
void sw_ov2640_mode(void)
{
OV2640_PWDN=0;//OV2640 Power Up
//GPIOC8/9/11切換為 DCMI接口
GPIO_AF_Set(GPIOC,8,13); //PC8,AF13 DCMI_D2
GPIO_AF_Set(GPIOC,9,13); //PC9,AF13 DCMI_D3
GPIO_AF_Set(GPIOC,11,13); //PC11,AF13 DCMI_D4
}
//切換為SD卡模式
void sw_sdcard_mode(void)
{
OV2640_PWDN=1;//OV2640 Power Down
//GPIOC8/9/11切換為 SDIO接口
GPIO_AF_Set(GPIOC,8,12); //PC8,AF12
GPIO_AF_Set(GPIOC,9,12); //PC9,AF12
GPIO_AF_Set(GPIOC,11,12); //PC11,AF12
}
//文件名自增(避免覆蓋)
//mode:0,創(chuàng)建.bmp文件;1,創(chuàng)建.jpg文件.
//bmp組合成:形如"0:PHOTO/PIC13141.bmp"的文件名
//jpg組合成:形如"0:PHOTO/PIC13141.jpg"的文件名
void camera_new_pathname(u8 *pname,u8 mode)
{
u8 res;
u16 index=0;
while(index<0XFFFF)
{
if(mode==0)sprintf((char*)pname,"0:PHOTO/PIC%05d.bmp",index);
else sprintf((char*)pname,"0:PHOTO/PIC%05d.jpg",index);
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//嘗試打開這個文件
if(res==FR_NO_FILE)break; //該文件名不存在=正是我們需要的.
index++;
}
}
//OV2640拍照jpg圖片
//返回值:0,成功
// 其他,錯誤代碼
u8 ov2640_jpg_photo(u8 *pname)
{
FIL* f_jpg;
u8 res=0;
u32 bwr;
u16 i;
u8* pbuf;
f_jpg=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //開辟FIL字節(jié)的內(nèi)存區(qū)域
if(f_jpg==NULL)return 0XFF; //內(nèi)存申請失敗.
ov2640_mode=1;
sw_ov2640_mode(); //切換為OV2640模式
dcmi_rx_callback=jpeg_dcmi_rx_callback;//回調(diào)函數(shù)
DCMI_DMA_Init((u32)jpeg_buf0,(u32)jpeg_buf1,jpeg_dma_bufsize,2,1);;//DCMI DMA配置(雙緩沖模式)
OV2640_JPEG_Mode(); //切換為JPEG模式
OV2640_ImageWin_Set(0,0,1600,1200);
OV2640_OutSize_Set(1600,1200);//拍照尺寸為1600*1200
DCMI_Start(); //啟動傳輸
while(jpeg_data_ok!=1); //等待第一幀圖片采集完
jpeg_data_ok=2; //忽略本幀圖片,啟動下一幀采集
while(jpeg_data_ok!=1); //等待第二幀圖片采集完,第二幀,才保存到SD卡去.
DCMI_Stop(); //停止DMA搬運
ov2640_mode=0;
sw_sdcard_mode(); //切換為SD卡模式
res=f_open(f_jpg,(const TCHAR*)pname,FA_WRITE|FA_CREATE_NEW);//模式0,或者嘗試打開失敗,則創(chuàng)建新文件
if(res==0)
{
printf("jpeg data size:%d\r\n",jpeg_data_len*4);//串口打印JPEG文件大小
pbuf=(u8*)jpeg_data_buf;
for(i=0;i<jpeg_data_len*4;i++)//查找0XFF,0XD8
{
if((pbuf[i]==0XFF)&&(pbuf[i+1]==0XD8))break;
}
if(i==jpeg_data_len*4)res=0XFD;//沒找到0XFF,0XD8
else//找到了
{
pbuf+=i;//偏移到0XFF,0XD8處
res=f_write(f_jpg,pbuf,jpeg_data_len*4-i,&bwr);
if(bwr!=(jpeg_data_len*4-i))res=0XFE;
}
}
jpeg_data_len=0;
f_close(f_jpg);
sw_ov2640_mode(); //切換為OV2640模式
OV2640_RGB565_Mode(); //RGB565模式
DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,1,0);//DCMI DMA配置
myfree(SRAMIN,f_jpg);
return res;
}
int main(void)
{
u8 res;
u8 *pname; //帶路徑的文件名
u8 key; //鍵值
u8 i;
u8 sd_ok=1; //0,sd卡不正常;1,SD卡正常.
u8 scale=1; //默認是全尺寸縮放
u8 msgbuf[15]; //消息緩存區(qū)
Stm32_Clock_Init(336,8,2,7);//設(shè)置時鐘,168Mhz
delay_init(168); //延時初始化
uart_init(84,115200); //初始化串口波特率為115200
LED_Init(); //初始化LED
usmart_dev.init(84); //初始化USMART
TIM3_Int_Init(10000-1,8400-1);//10Khz計數(shù),1秒鐘中斷一次
LCD_Init(); //LCD初始化
FSMC_SRAM_Init(); //初始化外部SRAM.
BEEP_Init(); //蜂鳴器初始化
KEY_Init(); //按鍵初始化
W25QXX_Init(); //初始化W25Q128
my_mem_init(SRAMIN); //初始化內(nèi)部內(nèi)存池
my_mem_init(SRAMEX); //初始化內(nèi)部內(nèi)存池
my_mem_init(SRAMCCM); //初始化CCM內(nèi)存池
exfuns_init(); //為fatfs相關(guān)變量申請內(nèi)存
f_mount(fs[0],"0:",1); //掛載SD卡
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,"Explorer STM32F4開發(fā)板",16,0);
Show_Str(30,70,200,16,"照相機實驗",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,"2014年5月16日",16,0);
res=f_mkdir("0:/PHOTO"); //創(chuàng)建PHOTO文件夾
if(res!=FR_EXIST&&res!=FR_OK) //發(fā)生了錯誤
{
Show_Str(30,150,240,16,"SD卡錯誤!",16,0);
delay_ms(200);
Show_Str(30,170,240,16,"拍照功能將不可用!",16,0);
sd_ok=0;
}
jpeg_buf0=mymalloc(SRAMIN,jpeg_dma_bufsize*4); //為jpeg dma接收申請內(nèi)存
jpeg_buf1=mymalloc(SRAMIN,jpeg_dma_bufsize*4); //為jpeg dma接收申請內(nèi)存
jpeg_data_buf=mymalloc(SRAMEX,300*1024); //為jpeg文件申請內(nèi)存(最大300KB)
pname=mymalloc(SRAMIN,30);//為帶路徑的文件名分配30個字節(jié)的內(nèi)存
while(pname==NULL||!jpeg_buf0||!jpeg_buf1||!jpeg_data_buf) //內(nèi)存分配出錯
{
Show_Str(30,190,240,16,"內(nèi)存分配失敗!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,146,WHITE);//清除顯示
delay_ms(200);
}
while(OV2640_Init())//初始化OV2640
{
Show_Str(30,190,240,16,"OV7670 錯誤!",16,0);
delay_ms(200);
LCD_Fill(30,190,239,206,WHITE);
delay_ms(200);
}
Show_Str(30,190,200,16,"OV2640 正常",16,0);
delay_ms(2000);
// OV2640_RGB565_Mode(); //JPEG模式
OV2640_YUV422_Mode();
DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,1,0);//DCMI DMA配置
OV2640_OutSize_Set(lcddev.width,lcddev.height);
DCMI_Start(); //啟動傳輸
while(1)
{
key=KEY_Scan(0);//不支持連按
if(key&&key!=KEY2_PRES)
{
DCMI_Stop(); //停止顯示
if(key==WKUP_PRES)
{
u16 i,l,color1,color2;
scale=!scale;
if(scale==0)
{
OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真實尺寸
OV2640_OutSize_Set(lcddev.width,lcddev.height);
sprintf((char*)msgbuf,"Full Size 1:1");
}else
{
OV2640_ImageWin_Set(0,0,1600,1200); //全尺寸縮放
OV2640_OutSize_Set(lcddev.width,lcddev.height);
sprintf((char*)msgbuf,"Scale");
}
LCD_ShowString(30,50,210,16,16,msgbuf);//顯示提示內(nèi)容
/*
for(i=0;i<240;i++)
{
for(l=0;l<800;l++)
{
color1=LCD_ReadPoint(l,i);
color2=(((color1>>0)&0xf800)+((color1>>5)&0x07e0)+((color1>>11)&0x001f));
LCD_Fast_DrawPoint(l,240+i,color2);
}
}*/
delay_ms(800);
}else if(sd_ok)//SD卡正常才可以拍照
{
sw_sdcard_mode(); //切換為SD卡模式
if(key==KEY0_PRES) //BMP拍照
{
camera_new_pathname(pname,0);//得到文件名
res=bmp_encode(pname,0,0,lcddev.width,lcddev.height,0);
}else if(key==KEY1_PRES)//JPG拍照
{
camera_new_pathname(pname,1);//得到文件名
res=ov2640_jpg_photo(pname);
if(scale==0)
{
OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真實尺寸
OV2640_OutSize_Set(lcddev.width,lcddev.height);
}else
{
OV2640_ImageWin_Set(0,0,1600,1200); //全尺寸縮放
}
OV2640_OutSize_Set(lcddev.width,lcddev.height);
}
sw_ov2640_mode(); //切換為OV2640模式
if(res)//拍照有誤
{
Show_Str(30,130,240,16,"寫入文件錯誤!",16,0);
}else
{
Show_Str(30,130,240,16,"拍照成功!",16,0);
Show_Str(30,150,240,16,"保存為:",16,0);
Show_Str(30+42,150,240,16,pname,16,0);
BEEP=1; //蜂鳴器短叫,提示拍照完成
delay_ms(100);
}
}else //提示SD卡錯誤
{
Show_Str(30,130,240,16,"SD卡錯誤!",16,0);
Show_Str(30,150,240,16,"拍照功能不可用!",16,0);
}
BEEP=0; //關(guān)閉蜂鳴器
if(key!=WKUP_PRES)delay_ms(1800);//非尺寸切換,等待1.8秒鐘
DCMI_Start(); //開始顯示
}
delay_ms(10);
i++;
if(i==20)//DS0閃爍.
{
i=0;
LED0=!LED0;
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
黑白照相機實驗.rar
(1008.85 KB, 下載次數(shù): 64)
2018-5-1 03:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
aestest
時間:
2018-5-2 15:36
項目需要,準(zhǔn)備著,學(xué)起來。
作者:
請喊我KK
時間:
2018-5-23 14:50
今天上午看到的,等到下載后才發(fā)現(xiàn)錯誤的下載了另一個
作者:
玲妹啊
時間:
2021-8-10 17:10
請問能實現(xiàn)簡單的照相效果嗎
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
丰满少妇高潮无套内谢
|
五月天婷婷社区
|
91美女视频
|
亚洲精品91
|
亚洲另类自拍
|
久久艳片www.17c.com
|
欧美在线免费观看
|
日韩精品久久久
|
欧美日韩激情
|
国内精品一区二区三区
|
成人午夜激情视频
|
天天干天天拍
|
免费看黄色大片
|
蜜臀av中文字幕
|
久久久免费观看
|
日韩色在线
|
欧美成人精品
|
国产精品视频久久久
|
欧美成人一区二区三区片免费
|
精品国产一区二区三
|
超碰精品在线
|
亚洲成人a v
|
一区二区高清
|
av手机在线免费观看
|
国产一级片在线播放
|
亚洲视频在线免费观看
|
欧美一级特黄视频
|
97国产精品人人爽人人做
|
99精品久久
|
法国极品成人h版
|
欧美日韩在线播放
|
jlzzjlzz欧美大全
|
亚洲区视频
|
国产激情一区二区三区
|
毛片网站在线观看
|
一级黄毛片
|
国产二区精品
|
午夜av片
|
国产亚洲视频在线观看
|
日韩精品一区二区视频
|
www.夜夜骑
|