自己修改了精英的函数用在mini上,可是不知道哪里有问题,无法实现拍照,求解答!!
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "usmart.h"
#include "lcd.h"
#include "ov7670.h"
#include "ov7725.h"
#include "exti.h"
#include "timer.h"
#include "piclib.h"
#include "key.h"
#include "ff.h"
#include "exfuns.h"
#include "malloc.h"
#include "string.h"
#include "math.h"
#include "text.h"
#include "spi.h"
#include "flash.h"
//ALIENTEK Mini STM32开发板扩展实验9
//摄像头实验
//技术支持:
www.openedv.com
//广州市星翼电子科技有限公司
//传感器名字定义
#define OV7725 1
#define OV7670 2
//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define OV7725_WINDOW_WIDTH 320 // <=320
#define OV7725_WINDOW_HEIGHT 240 // <=240
extern u8 ov_sta; //在exit.c里面定义
extern u8 ov_frame; //在timer.c里面定义
FRESULT res_sd;//文件操作结果
FIL fnew; //文件对
UINT fnum; //文件成功读写数量
void camera_refresh(void)
{
u32 i,j;
u16 color;
//没有按键按下,刷新LCD
if(ov_sta)
{
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT);//将显示区域设置到屏幕中央
if(lcddev.id==0X1963)
LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//将显示区域设置到屏幕中央
LCD_WriteRAM_Prepare(); //开始写入GRAM
//读指针复位
OV7725_CS=0;
OV7725_RRST=0; //开始复位读指针
OV7725_RCK=0;
OV7725_RCK=1;
OV7725_RCK=0;
OV7725_RRST=1; //复位读指针结束
OV7725_RCK=1;
for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
{
for(j=0;j<OV7725_WINDOW_WIDTH;j++)
{
OV7725_RCK=0;
color=OV7725_DATA; //读数据
OV7725_RCK=1;
color<<=8;
OV7725_RCK=0;
color|=OV7725_DATA; //读数据
OV7725_RCK=1;
LCD_WR_DATA(color);
}
}
ov_sta=0; //清零帧中断标记
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
}
void camera_new_pathname(u8 *pname)
{
u8 res;
u16 index=0;
while(index<0XFFFF)
{
sprintf((char*)pname,"0

HOTO/PIC%05d.bmp",index);
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
if(res==FR_NO_FILE)break; //该文件名不存在=正是我们需要的.
index++;
}
}
int main(void)
{
u8 sensor=0;
u8 res;
u8 i;
u8 *pname;
u8 key;
u8 sd_ok=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(9600);
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
SPI_Flash_Init();
mem_init();
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
piclib_init(); //初始化画图
POINT_COLOR=RED;//设置字体为红 {MOD}
while(font_init()) //检查字库
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除显示
}
Show_Str(30,50,200,16,"精英STM32F1开发板",16,0);
Show_Str(30,70,200,16,"照相机实验",16,0);
Show_Str(30,90,200,16,"KEY0:拍照",16,0);
Show_Str(30,110,200,16,"正点原子@ALIENTEK",16,0);
Show_Str(30,130,200,16,"2017年11月1日",16,0);
res=f_mkdir("0:/PHOTO"); //创建PHOTO文件夹
if(res!=FR_EXIST&&res!=FR_OK) //发生了错误
{
Show_Str(30,150,240,16,"SD卡错误!",16,0);
delay_ms(200);
Show_Str(30,170,240,16,"拍照功能将不可用!",16,0);
sd_ok=0;
}else
{
Show_Str(30,150,240,16,"SD卡正常!",16,0);
delay_ms(200);
Show_Str(30,170,240,16,"KEY_UP:拍照",16,0);
sd_ok=1;
}
pname=mymalloc(30); //为带路径的文件名分配30个字节的内存
while(pname==NULL) //内存分配出错
{
Show_Str(30,190,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,146,WHITE);//清除显示
delay_ms(200);
}
while(1)//初始化OV7725
{
if(OV7725_Init()==0)
{
sensor=OV7725;
LCD_ShowString(30,150,200,16,16,"OV7725 Init OK ");
delay_ms(1500);
OV7725_Light_Mode(0);
OV7725_Color_Saturation(0);
OV7725_Brightness(0);
OV7725_Contrast(0);
OV7725_Special_Effects(0);
OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式输出
OV7725_CS=0;
break;
}
else
{
LCD_ShowString(30,150,200,16,16,"OV7725_OV7670 Error!!");
delay_ms(200);
LCD_Fill(30,150,200,246,WHITE);
delay_ms(200);
}
}
TIM3_Int_Init(10000,7199); //TIM3,10Khz计数频率,1秒钟中断
EXTI15_Init(); //使能定时器捕获
LCD_Clear(BACK_COLOR);
while(1)
{
key=KEY_Scan(0);//不支持连按
if(key==KEY0_PRES)
{
if(sd_ok)
{
LED1=0; //点亮DS1,提示正在拍照
camera_new_pathname(pname);//得到文件名
if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0))//拍照有误
{
Show_Str(40,130,240,12,"写入文件错误!",12,0);
}else
{
Show_Str(40,130,240,12,"拍照成功!",12,0);
Show_Str(40,150,240,12,"保存为:",12,0);
Show_Str(40+42,150,240,12,pname,12,0);
delay_ms(100);
}
}else //提示SD卡错误
{
Show_Str(40,130,240,12,"SD卡错误!",12,0);
Show_Str(40,150,240,12,"拍照功能不可用!",12,0);
}
LED1=1;//关闭DS1
delay_ms(1800);//等待1.8秒钟
LCD_Clear(BLACK);
}else delay_ms(5);
if(sensor==OV7725) camera_refresh(); //更新显示
i++;
if(i>=40)//DS0闪烁.
{
i=0;
LED0=!LED0;
}
}
}
自己解决了
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "usmart.h"
#include "lcd.h"
#include "ov7670.h"
#include "ov7725.h"
#include "exti.h"
#include "timer.h"
#include "piclib.h"
#include "key.h"
#include "ff.h"
#include "exfuns.h"
#include "malloc.h"
#include "string.h"
#include "math.h"
#include "text.h"
#include "spi.h"
#include "flash.h"
//ALIENTEK Mini STM32开发板扩展实验9
//摄像头实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
//传感器名字定义
#define OV7725 1
#define OV7670 2
//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define OV7725_WINDOW_WIDTH 320 // <=320
#define OV7725_WINDOW_HEIGHT 240 // <=240
extern u8 ov_sta; //在exit.c里面定义
extern u8 ov_frame; //在timer.c里面定义
FRESULT res_sd;//文件操作结果
FIL fnew; //文件对
UINT fnum; //文件成功读写数量
void camera_refresh(void)
{
u32 i,j;
u16 color;
//没有按键按下,刷新LCD
if(ov_sta)
{
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT);//将显示区域设置到屏幕中央
if(lcddev.id==0X1963)
LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//将显示区域设置到屏幕中央
LCD_WriteRAM_Prepare(); //开始写入GRAM
//读指针复位
OV7725_CS=0;
OV7725_RRST=0; //开始复位读指针
OV7725_RCK=0;
OV7725_RCK=1;
OV7725_RCK=0;
OV7725_RRST=1; //复位读指针结束
OV7725_RCK=1;
for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
{
for(j=0;j<OV7725_WINDOW_WIDTH;j++)
{
GPIOB->CRL=0X88888888;
OV7725_RCK=0;
color=OV7725_DATA; //读数据
OV7725_RCK=1;
color<<=8;
OV7725_RCK=0;
color|=OV7725_DATA; //读数据
OV7725_RCK=1;
GPIOB->CRL=0X33333333;
//ER ZHI HUA
Gray=(color&0x07E0)>>5;
LCD_WR_DATA(color);
}
}
OV7725_CS=1;
OV7725_RCK=0;
OV7725_RCK=1;
EXTI->
ov_sta=0; //清零帧中断标记
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
}
void camera_new_pathname(u8 *pname)
{
u8 res;
u16 index=0;
while(index<0XFFFF)
{
sprintf((char*)pname,"0
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
if(res==FR_NO_FILE)break; //该文件名不存在=正是我们需要的.
index++;
}
}
int main(void)
{
u8 sensor=0;
u8 res;
u8 i;
u8 *pname;
u8 key;
u8 sd_ok=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(9600);
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
SPI_Flash_Init();
mem_init();
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
piclib_init(); //初始化画图
POINT_COLOR=RED;//设置字体为红 {MOD}
while(font_init()) //检查字库
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除显示
}
Show_Str(30,50,200,16,"精英STM32F1开发板",16,0);
Show_Str(30,70,200,16,"照相机实验",16,0);
Show_Str(30,90,200,16,"KEY0:拍照",16,0);
Show_Str(30,110,200,16,"正点原子@ALIENTEK",16,0);
Show_Str(30,130,200,16,"2017年11月1日",16,0);
res=f_mkdir("0:/PHOTO"); //创建PHOTO文件夹
if(res!=FR_EXIST&&res!=FR_OK) //发生了错误
{
Show_Str(30,150,240,16,"SD卡错误!",16,0);
delay_ms(200);
Show_Str(30,170,240,16,"拍照功能将不可用!",16,0);
sd_ok=0;
}else
{
Show_Str(30,150,240,16,"SD卡正常!",16,0);
delay_ms(200);
Show_Str(30,170,240,16,"KEY_UP:拍照",16,0);
sd_ok=1;
}
pname=mymalloc(30); //为带路径的文件名分配30个字节的内存
while(pname==NULL) //内存分配出错
{
Show_Str(30,190,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,146,WHITE);//清除显示
delay_ms(200);
}
while(1)//初始化OV7725
{
if(OV7725_Init()==0)
{
sensor=OV7725;
LCD_ShowString(30,150,200,16,16,"OV7725 Init OK ");
delay_ms(1500);
OV7725_Light_Mode(0);
OV7725_Color_Saturation(0);
OV7725_Brightness(0);
OV7725_Contrast(0);
OV7725_Special_Effects(0);
OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式输出
OV7725_CS=0;
break;
}
else
{
LCD_ShowString(30,150,200,16,16,"OV7725_OV7670 Error!!");
delay_ms(200);
LCD_Fill(30,150,200,246,WHITE);
delay_ms(200);
}
}
TIM3_Int_Init(10000,7199); //TIM3,10Khz计数频率,1秒钟中断
EXTI15_Init(); //使能定时器捕获
LCD_Clear(BACK_COLOR);
while(1)
{
key=KEY_Scan(1);//不支持连按
if(key==KEY0_PRES)
{
if(sd_ok)
{
LED1=0; //点亮DS1,提示正在拍照
camera_new_pathname(pname);//得到文件名
if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0))//拍照有误
{
Show_Str(40,130,240,12,"写入文件错误!",12,0);
}else
{
Show_Str(40,130,240,12,"拍照成功!",12,0);
Show_Str(40,150,240,12,"保存为:",12,0);
Show_Str(40+42,150,240,12,pname,12,0);
delay_ms(100);
}
}else //提示SD卡错误
{
Show_Str(40,130,240,12,"SD卡错误!",12,0);
Show_Str(40,150,240,12,"拍照功能不可用!",12,0);
}
LED1=1;//关闭DS1
delay_ms(1800);//等待1.8秒钟
LCD_Clear(BLACK);
}else delay_ms(5);
if(sensor==OV7725) camera_refresh(); //更新显示
i++;
if(i>=40)//DS0闪烁.
{
i=0;
LED0=!LED0;
}
}
}
一周热门 更多>