我打開攝像頭后能實時顯示圖像,但是不能運行下面的循環(比如我下面程序led燈閃爍),我看很多大佬程序都行,請問我這情況一般是什么問題
下面是主程序
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "timer.h"
#include "ov7670.h"
#include "dcmi.h"
#include "key.h"
#include "spi.h"
#include "touch.h"
#include "w25q128xx.h"
/**************************************************************************************
項目:
STm32F407簡易攝像機
功能要求:
1、基本拍照功能
驅動OV7670攝像頭捕獲圖像 并在按下快門(某個按鍵)的同時
將當前的圖像保存(不保存 顯示屏只是暫時定格當前畫面)
拓展(將照片能通過SPI Flash--16MByte)
2、屏幕顯示功能
開啟相機但未按下快門拍照時
屏幕能實時顯示當前的畫面
拓展3、如果買到的屏幕是帶觸摸屏 驅動觸摸屏
添加拍照后照片編輯功能(涂鴉 畫筆....)
拓展4、加入無線傳輸模塊(WIfi)
能將指定的照片數據上傳到上位機
拓展5、添加陀螺儀 對拍攝的照片進行簡易的矯正(圖像處理)
1 2要求是基本 3 4 5能做多少做多少(4要買額外的模塊)
探索者STM32F407開發板
作者:李欣
創建時間:2020.8.7
版本1.0
參考:正點原子,秉火
lcdid:9341
分辨率:320*240
電阻式觸摸屏
玻璃式觸摸屏
ov7670標準SCCB,兼容IIC
DCMI DMA SCCB FSMC
步驟:
1.初始化
2.開啟攝像頭捕獲
3.使能DMA,開啟搬運數據
4.lcd顯示圖像
************************************************************************************/
//清空屏幕并在右上角顯示"RST"
void Load_Drow_Dialog(void)
{
LCD_Clear(WHITE);//清屏
POINT_COLOR=BLUE;//設置字體為藍色
LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//顯示清屏區域
POINT_COLOR=RED;//設置畫筆藍色
}
void ov7670_test(void)
{
//u8 key=0;
//DCMI_Start(); //開啟cam
u8 key;
u8 i=0;
while(1)
{
key=KEY_Scan(0);
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
{
if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
{
if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //畫圖
}
}else delay_ms(10); //沒有按鍵按下的時候
if(key==KEY0_PRES) //KEY0按下,則執行校準程序
{
LCD_Clear(WHITE); //清屏
TP_Adjust(); //屏幕校準
TP_Save_Adjdata();
Load_Drow_Dialog();
}
i++;
//if(i%20==0)LED0=!LED0;
}
}
int main(void)
{
//u32 a1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
SystemInit();
delay_Init();//初始化延時函數
usart1_init(115200);//串口1初始化
LED_Init();//初始化LED
LCD_Init();//LCD初始化
TIM1_PWM_Init();//定時器1初始化
KEY_Initxx();//初始化按鍵
EXTI_Initxx();//初始化按鍵中斷
SPI_GPIOInit();//SPI模式0
tp_dev.init(); //觸摸屏阻塞
printf("OV7670初始化開啟");
int ret=OV7670_Init();
if(ret){
LCD_ShowString(30,130,240,16,16,"OV7670 ERROR!!");
}
POINT_COLOR=RED;//設置字體為紅色
//if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//電阻屏才顯示
/*
if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//電阻屏才顯示
//delay_ms(500);
Load_Drow_Dialog(); //清屏 */
/*while()//初始化OV7670
{
LCD_ShowString(30,130,240,16,16,"OV7670 ERROR!!");
//LED0=0;
delay_ms(200);
LCD_Fill(30,130,239,170,WHITE);
//LED0=1;
delay_ms(200);
}
LCD_ShowString(40,150,200,20,20,"OV7670 OK!!!!!!");
delay_ms(300); //延時一
//OV7670_Window_Set(12,176,240,320);//OV7670設置輸出窗口*/
DCMI_Initxx(); //DCMI初始化
DCMI_DMA_Init();//初始化DMA
DCMI_Start(); //開啟cam
//ov7670_test();
while(1)
{
//LCD_ShowString(30,60,210,20,20,"INIT SUCCESS!!!!");
//a1=DCMI_ReadData();
printf("0x\r\n");
LED1(0);
delay_ms(300);
LED1(1);
delay_ms(300);
}
}
|