|
0.png (53.94 KB, 下載次數(shù): 56)
下載附件
2018-5-15 23:58 上傳
0.jpg (7.83 KB, 下載次數(shù): 40)
下載附件
2018-5-15 23:58 上傳
該文件夾下包含8個(gè)源碼:
(寄存器版本,適合探索者STM32F4開(kāi)發(fā)板)實(shí)驗(yàn)42 照相機(jī)實(shí)驗(yàn).rar
(庫(kù)函數(shù)版本,適合探索者STM32F4開(kāi)發(fā)板)實(shí)驗(yàn)42 照相機(jī)實(shí)驗(yàn).rar
(寄存器版本,適合戰(zhàn)艦V3和精英STM32開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)6 ATK-OV2640 攝像頭模塊測(cè)試實(shí)驗(yàn).rar
(庫(kù)函數(shù)版本,適合戰(zhàn)艦V3和精英STM32開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)6 ATK-OV2640 攝像頭模塊測(cè)試實(shí)驗(yàn).rar
(寄存器版本,適合阿波羅STM32F429開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)10 ATK-OV2640 攝像頭模塊測(cè)試實(shí)驗(yàn).rar
(庫(kù)函數(shù)版本,適合阿波羅STM32F429開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)10 ATK-OV2640 攝像頭模塊測(cè)試實(shí)驗(yàn).rar
(寄存器版本,適合阿波羅STM32F767開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)10 ATK-OV2640 攝像頭模塊測(cè)試實(shí)驗(yàn).rar
(庫(kù)函數(shù)版本,適合阿波羅STM32F767開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)10 ATK-OV2640 攝像頭模塊測(cè)試實(shí)驗(yàn).rar
包含多款開(kāi)發(fā)板的例程,每個(gè)例程又分為寄存器和庫(kù)函數(shù)兩個(gè)版本,請(qǐng)大家務(wù)必根據(jù)自己的開(kāi)發(fā)板,下載正確的例程!不要下載錯(cuò)了。
例程使用說(shuō)明請(qǐng)看源碼里面的readme.txt或者相關(guān)AN文檔。
單片機(jī)源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "lcd.h"
- #include "ltdc.h"
- #include "string.h"
- #include "sdram.h"
- #include "malloc.h"
- #include "w25qxx.h"
- #include "ov2640.h"
- #include "dcmi.h"
- #include "pcf8574.h"
- #include "ff.h"
- #include "exfuns.h"
- #include "string.h"
- #include "usmart.h"
- #include "sdio_sdcard.h"
- #include "fontupd.h"
- #include "text.h"
- #include "piclib.h"
- #include "string.h"
- #include "math.h"
- vu8 bmp_request=0; //bmp拍照請(qǐng)求:0,無(wú)bmp拍照請(qǐng)求;1,有bmp拍照請(qǐng)求,需要在幀中斷里面,關(guān)閉DCMI接口.
- u8 ovx_mode=0; //bit0:0,RGB565模式;1,JPEG模式
- u16 curline=0; //攝像頭輸出數(shù)據(jù),當(dāng)前行編號(hào)
- u16 yoffset=0; //y方向的偏移量
- #define jpeg_buf_size 4*1024*1024 //定義JPEG數(shù)據(jù)緩存jpeg_buf的大小(4M字節(jié))
- #define jpeg_line_size 2*1024 //定義DMA接收數(shù)據(jù)時(shí),一行數(shù)據(jù)的最大值
- u32 *dcmi_line_buf[2]; //RGB屏?xí)r,攝像頭采用一行一行讀取,定義行緩存
- u32 *jpeg_data_buf; //JPEG數(shù)據(jù)緩存buf
- volatile u32 jpeg_data_len=0; //buf中的JPEG有效數(shù)據(jù)長(zhǎng)度
- volatile u8 jpeg_data_ok=0; //JPEG數(shù)據(jù)采集完成標(biāo)志
- //0,數(shù)據(jù)沒(méi)有采集完;
- //1,數(shù)據(jù)采集完了,但是還沒(méi)處理;
- //2,數(shù)據(jù)已經(jīng)處理完成了,可以開(kāi)始下一幀接收
- //處理JPEG數(shù)據(jù)
- //當(dāng)采集完一幀JPEG數(shù)據(jù)后,調(diào)用此函數(shù),切換JPEG BUF.開(kāi)始下一幀采集.
- void jpeg_data_process(void)
- {
- u16 i;
- u16 rlen; //剩余數(shù)據(jù)長(zhǎng)度
- u32 *pbuf;
- curline=yoffset; //行數(shù)復(fù)位
- if(ovx_mode&0X01) //只有在JPEG格式下,才需要做處理.
- {
- if(jpeg_data_ok==0) //jpeg數(shù)據(jù)還未采集完?
- {
- __HAL_DMA_DISABLE(&DMADMCI_Handler);//關(guān)閉DMA
- while(DMA2_Stream1->CR&0X01); //等待DMA2_Stream1可配置
- rlen=jpeg_line_size-__HAL_DMA_GET_COUNTER(&DMADMCI_Handler);//得到剩余數(shù)據(jù)長(zhǎng)度
- pbuf=jpeg_data_buf+jpeg_data_len;//偏移到有效數(shù)據(jù)末尾,繼續(xù)添加
- if(DMADMCI_Handler.Instance->CR&(1<<19))for(i=0;i<rlen;i++)pbuf[i]=dcmi_line_buf[1][i];//讀取buf1里面的剩余數(shù)據(jù)
- else for(i=0;i<rlen;i++)pbuf[i]=dcmi_line_buf[0][i];//讀取buf0里面的剩余數(shù)據(jù)
- jpeg_data_len+=rlen; //加上剩余長(zhǎng)度
- jpeg_data_ok=1; //標(biāo)記JPEG數(shù)據(jù)采集完按成,等待其他函數(shù)處理
- }
- if(jpeg_data_ok==2) //上一次的jpeg數(shù)據(jù)已經(jīng)被處理了
- {
- __HAL_DMA_SET_COUNTER(&DMADMCI_Handler,jpeg_line_size); //傳輸長(zhǎng)度為jpeg_buf_size*4字節(jié)
- __HAL_DMA_ENABLE(&DMADMCI_Handler); //打開(kāi)DMA
- jpeg_data_ok=0; //標(biāo)記數(shù)據(jù)未采集
- jpeg_data_len=0; //數(shù)據(jù)重新開(kāi)始
- }
- }else
- {
- if(bmp_request==1) //有bmp拍照請(qǐng)求,關(guān)閉DCMI
- {
- DCMI_Stop(); //停止DCMI
- bmp_request=0; //標(biāo)記請(qǐng)求處理完成.
- }
- LCD_SetCursor(0,0);
- LCD_WriteRAM_Prepare(); //開(kāi)始寫入GRAM
- }
- }
- //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(DMADMCI_Handler.Instance->CR&(1<<19))//buf0已滿,正常處理buf1
- {
- for(i=0;i<jpeg_line_size;i++)pbuf[i]=dcmi_line_buf[0][i];//讀取buf0里面的數(shù)據(jù)
- jpeg_data_len+=jpeg_line_size;//偏移
- }else //buf1已滿,正常處理buf0
- {
- for(i=0;i<jpeg_line_size;i++)pbuf[i]=dcmi_line_buf[1][i];//讀取buf1里面的數(shù)據(jù)
- jpeg_data_len+=jpeg_line_size;//偏移
- }
- }
- //RGB屏數(shù)據(jù)接收回調(diào)函數(shù)
- void rgblcd_dcmi_rx_callback(void)
- {
- u16 *pbuf;
- if(DMADMCI_Handler.Instance->CR&(1<<19))//DMA使用buf1,讀取buf0
- {
- pbuf=(u16*)dcmi_line_buf[0];
- }else //DMA使用buf0,讀取buf1
- {
- pbuf=(u16*)dcmi_line_buf[1];
- }
- LTDC_Color_Fill(0,curline,lcddev.width-1,curline,pbuf);//DM2D填充
- if(curline<lcddev.height)curline++;
- if(bmp_request==1&&curline==(lcddev.height-1))//有bmp拍照請(qǐng)求,關(guān)閉DCMI
- {
- DCMI_Stop(); //停止DCMI
- bmp_request=0; //標(biāo)記請(qǐng)求處理完成.
- }
- }
- //切換為OV2640模式
- void sw_ov2640_mode(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- OV2640_PWDN_Set(0); //OV2640 Power Up
- //GPIOC8/9/11切換為 DCMI接口
- GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11;
- GPIO_Initure.Mode=GPIO_MODE_AF_PP; //推挽復(fù)用
- GPIO_Initure.Pull=GPIO_PULLUP; //上拉
- GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
- GPIO_Initure.Alternate=GPIO_AF13_DCMI; //復(fù)用為DCMI
- HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化
- }
- //切換為SD卡模式
- void sw_sdcard_mode(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- OV2640_PWDN_Set(1); //OV2640 Power Down
- //GPIOC8/9/11切換為 SDIO接口
- GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11;
- GPIO_Initure.Mode=GPIO_MODE_AF_PP; //推挽復(fù)用
- GPIO_Initure.Pull=GPIO_PULLUP; //上拉
- GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
- GPIO_Initure.Alternate=GPIO_AF12_SDMMC1; //復(fù)用為SDIO
- HAL_GPIO_Init(GPIOC,&GPIO_Initure);
- }
- //文件名自增(避免覆蓋)
- //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);//嘗試打開(kāi)這個(gè)文件
- if(res==FR_NO_FILE)break; //該文件名不存在=正是我們需要的.
- index++;
- }
- }
- //OV2640拍照jpg圖片
- //返回值:0,成功
- // 其他,錯(cuò)誤代碼
- u8 ov2640_jpg_photo(u8 *pname)
- {
- FIL* f_jpg;
- u8 res=0,headok=0;
- u32 bwr;
- u32 i,jpgstart,jpglen;
- u8* pbuf;
- f_jpg=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //開(kāi)辟FIL字節(jié)的內(nèi)存區(qū)域
- if(f_jpg==NULL)return 0XFF; //內(nèi)存申請(qǐng)失敗.
- ovx_mode=1;
- jpeg_data_ok=0;
- sw_ov2640_mode(); //切換為OV2640模式
- OV2640_JPEG_Mode(); //JPEG模式
- OV2640_ImageWin_Set(0,0,1600,1200);
- OV2640_OutSize_Set(1600,1200); //拍照尺寸為1600*120
- dcmi_rx_callback=jpeg_dcmi_rx_callback; //JPEG接收數(shù)據(jù)回調(diào)函數(shù)
- DCMI_DMA_Init((u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],jpeg_line_size,DMA_MDATAALIGN_WORD,DMA_MINC_ENABLE);//DCMI DMA配置
- DCMI_Start(); //啟動(dòng)傳輸
- while(jpeg_data_ok!=1); //等待第一幀圖片采集完
- jpeg_data_ok=2; //忽略本幀圖片,啟動(dòng)下一幀采集
- while(jpeg_data_ok!=1); //等待第二幀圖片采集完,第二幀,才保存到SD卡去.
- DCMI_Stop(); //停止DMA搬運(yùn)
- ovx_mode=0;
- sw_sdcard_mode(); //切換為SD卡模式
- res=f_open(f_jpg,(const TCHAR*)pname,FA_WRITE|FA_CREATE_NEW);//模式0,或者嘗試打開(kāi)失敗,則創(chuàng)建新文件
- if(res==0)
- {
- printf("jpeg data size:%d\r\n",jpeg_data_len*4);//串口打印JPEG文件大小
- pbuf=(u8*)jpeg_data_buf;
- jpglen=0; //設(shè)置jpg文件大小為0
- headok=0; //清除jpg頭標(biāo)記
- for(i=0;i<jpeg_data_len*4;i++)//查找0XFF,0XD8和0XFF,0XD9,獲取jpg文件大小
- {
- if((pbuf[i]==0XFF)&&(pbuf[i+1]==0XD8))//找到FF D8
- {
- jpgstart=i;
- headok=1; //標(biāo)記找到j(luò)pg頭(FF D8)
- }
- if((pbuf[i]==0XFF)&&(pbuf[i+1]==0XD9)&&headok)//找到頭以后,再找FF D9
- {
- jpglen=i-jpgstart+2;
- break;
- }
- }
- if(jpglen) //正常的jpeg數(shù)據(jù)
- {
- pbuf+=jpgstart; //偏移到0XFF,0XD8處
- res=f_write(f_jpg,pbuf,jpglen,&bwr);
- if(bwr!=jpglen)res=0XFE;
-
- }else res=0XFD;
- }
- jpeg_data_len=0;
- f_close(f_jpg);
- sw_ov2640_mode(); //切換為OV2640模式
- OV2640_RGB565_Mode(); //RGB565模式
- if(lcdltdc.pwidth!=0) //RGB屏
- {
- dcmi_rx_callback=rgblcd_dcmi_rx_callback;//RGB屏接收數(shù)據(jù)回調(diào)函數(shù)
- DCMI_DMA_Init((u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],lcddev.width/2,DMA_MDATAALIGN_HALFWORD,DMA_MINC_ENABLE);//DCMI DMA配置
- }else //MCU 屏
- {
- DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,DMA_MDATAALIGN_HALFWORD,DMA_MINC_DISABLE); //DCMI DMA配置,MCU屏,豎屏
- }
- 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; //默認(rèn)是全尺寸縮放
- u8 msgbuf[15]; //消息緩存區(qū)
- u16 outputheight=0;
-
- Stm32_Clock_Init(360,25,2,8); //設(shè)置時(shí)鐘,180Mhz
- HAL_Init(); //初始化HAL庫(kù)
- delay_init(180); //初始化延時(shí)函數(shù)
- uart_init(115200); //初始化USART
- usmart_dev.init(90); //初始化USMART
- LED_Init(); //初始化LED
- KEY_Init(); //初始化按鍵
- SDRAM_Init(); //SDRAM初始化
- LCD_Init(); //LCD初始化
- OV2640_Init(); //初始化OV2640
- sw_sdcard_mode(); //首先切換為SD卡模式
- PCF8574_Init(); //初始化PCF8574
- W25QXX_Init(); //初始化W25Q256
- my_mem_init(SRAMIN); //初始化內(nèi)部?jī)?nèi)存池
- my_mem_init(SRAMEX); //初始化外部SDRAM內(nèi)存池
- my_mem_init(SRAMCCM); //初始化內(nèi)部CCM內(nèi)存池
- POINT_COLOR=RED;
- exfuns_init(); //為fatfs相關(guān)變量申請(qǐng)內(nèi)存
- f_mount(fs[0],"0:",1); //掛載SD卡
- f_mount(fs[1],"1:",1); //掛載SPI FLASH.
- while(font_init()) //檢查字庫(kù)
- {
- 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開(kāi)發(fā)板",16,0);
- Show_Str(30,70,200,16,"OV2640照相機(jī)實(shí)驗(yàn)",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,"KEY2:自動(dòng)對(duì)焦",16,0);
- Show_Str(30,150,200,16,"WK_UP:FullSize/Scale",16,0);
- Show_Str(30,170,200,16,"2016年1月15日",16,0);
- res=f_mkdir("0:/PHOTO"); //創(chuàng)建PHOTO文件夾
- if(res!=FR_EXIST&&res!=FR_OK) //發(fā)生了錯(cuò)誤
- {
- res=f_mkdir("0:/PHOTO"); //創(chuàng)建PHOTO文件夾
- Show_Str(30,190,240,16,"SD卡錯(cuò)誤!",16,0);
- delay_ms(200);
- Show_Str(30,190,240,16,"拍照功能將不可用!",16,0);
- delay_ms(200);
- sd_ok=0;
- }
- dcmi_line_buf[0]=mymalloc(SRAMIN,jpeg_line_size*4); //為jpeg dma接收申請(qǐng)內(nèi)存
- dcmi_line_buf[1]=mymalloc(SRAMIN,jpeg_line_size*4); //為jpeg dma接收申請(qǐng)內(nèi)存
- jpeg_data_buf=mymalloc(SRAMEX,jpeg_buf_size); //為jpeg文件申請(qǐng)內(nèi)存(最大4MB)
- pname=mymalloc(SRAMIN,30);//為帶路徑的文件名分配30個(gè)字節(jié)的內(nèi)存
- while(pname==NULL||!dcmi_line_buf[0]||!dcmi_line_buf[1]||!jpeg_data_buf) //內(nèi)存分配出錯(cuò)
- {
- 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,"OV2640 錯(cuò)誤!",16,0);
- delay_ms(200);
- LCD_Fill(30,190,239,206,WHITE);
- delay_ms(200);
- }
- Show_Str(30,210,230,16,"OV2640 正常",16,0);
- //自動(dòng)對(duì)焦初始化
- OV2640_RGB565_Mode(); //RGB565模式
- OV2640_Light_Mode(0); //自動(dòng)模式
- OV2640_Color_Saturation(3);//色彩飽和度0
- OV2640_Brightness(4); //亮度0
- OV2640_Contrast(3); //對(duì)比度0
- DCMI_Init(); //DCMI配置
- if(lcdltdc.pwidth!=0) //RGB屏
- {
- dcmi_rx_callback=rgblcd_dcmi_rx_callback;//RGB屏接收數(shù)據(jù)回調(diào)函數(shù)
- DCMI_DMA_Init((u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],lcddev.width/2,DMA_MDATAALIGN_HALFWORD,DMA_MINC_ENABLE);//DCMI DMA配置
- }else //MCU 屏
- {
- DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,DMA_MDATAALIGN_HALFWORD,DMA_MINC_DISABLE); //DCMI DMA配置,MCU屏,豎屏
- }
- if(lcddev.height>800)
- {
- yoffset=(lcddev.height-800)/2;
- outputheight=800;
- SCCB_WR_Reg(0xff,0x01);
- SCCB_WR_Reg(0x11,0x01); //需要降低幀率
- }else
- {
- yoffset=0;
- outputheight=lcddev.height;
- }
- curline=yoffset; //行數(shù)復(fù)位
- OV2640_OutSize_Set(lcddev.width,outputheight); //滿屏縮放顯示
- LCD_Clear(BLACK);
- DCMI_Start(); //啟動(dòng)傳輸
- while(1)
- {
- key=KEY_Scan(0);//不支持連按
- if((key)&&(key!=KEY2_PRES))
- {
- if(key==KEY0_PRES)//如果是BMP拍照,則等待1秒鐘,去抖動(dòng),以獲得穩(wěn)定的bmp照片
- {
- delay_ms(300);
- bmp_request=1; //請(qǐng)求關(guān)閉DCMI
- while(bmp_request); //等待請(qǐng)求處理完成
- }else DCMI_Stop();
- if(key==WKUP_PRES) //縮放處理
- {
- scale=!scale;
- if(scale==0)
- {
- OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-outputheight)/2,lcddev.width,outputheight);//1:1真實(shí)尺寸
- sprintf((char*)msgbuf,"Full Size 1:1");
- }else
- {
- OV2640_ImageWin_Set(0,0,1600,1200); //全尺寸縮放
- sprintf((char*)msgbuf,"Scale");
- }
- OV2640_OutSize_Set(lcddev.width,outputheight);
- 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,yoffset,lcddev.width,outputheight,0);
- sw_ov2640_mode(); //切換為OV2640模式
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
TIM圖片20180515234314.png (48.98 KB, 下載次數(shù): 50)
下載附件
2018-5-15 23:43 上傳
所有資料51hei提供下載:
ATK-OV2640攝像1頭模塊.rar
(19.37 MB, 下載次數(shù): 118)
2018-5-15 23:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|