⼝协议)上传服务器显⽰
采⽤秉⽕STM32开发板 Cortex-M4⼩型系统板 STM32F407ZGT6核⼼板
ov2640介绍:
OV2640是OmniVision公司⽣产的⼀颗1/4⼨的CMOS UXGA(1632*1232)图像传感器。该传感器体积⼩、⼯作电压低,提供单⽚UXGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、⼦采样、缩放和取窗⼝等⽅式的各种分辨率8/10位影像数据。UXGA最⾼15帧/秒(SVGA可达30帧,CIF可达60帧)。
注:SCCB总线可以看成IIC总线的简化版
摄像头操作:
⼀.初始化时钟
⼆.初始化OV2640:
1. 初始化IO⼝
2. 上电,并复位
3. 执⾏初始化序列
三.设置图像窗⼝设置和图像输出⼤⼩设置,可以调整图像⼤⼩或者缩放模式
服饰搭配技巧四.初始化DCMI:
1. 配置相关引脚的复⽤功能,使能DCMI时钟。
2. 设置DCMI⼯作模式及PCLK/HSYNC/VSYNC等参数。
3. 设置DMA
4. 启动DCMI传输。即设置DCMI->CR的最低位为1
esp8266介绍:
esp8266是wifi串⼝模块,功能简单来讲就是:从wifi接收到数据,串⼝输出;从串⼝接收数据,wifi输出数据。
esp8266三个模式
1、串⼝⽆线 WIFI(COM-AP) 串⼝⽆线 WIFI(COM-AP)模式,模块作为⽆线 WIFI 热点,允许其他 WIFI 设备连接 到本模块,实现串⼝与其他设备之间的⽆线(WIFI)数据转换互传。该模式下,根
据应⽤场景的不同,可以设置 3 个⼦模式:TCP 服务器、TCP 客户端,UDP。这三个⼦模式先不细究。总之都可以进⾏数据传输。
2、串⼝⽆线 STA(COM-STA)模式,模块作为⽆线 WIFI STA,⽤于连接到⽆线⽹络,实 现串⼝与其他设备之间的⽆线(WIFI)数据转换互传。该模式下,根据应⽤场景的不同, 可以设置 3 个⼦模式:TCP 服务器、TCP 客户端,UDP。
3、串⼝⽆线 AP+STA(COM-AP+STA)模式,模块既作⽆线 WIFI AP,⼜作⽆线 STA, 其他 WIFI 设备可以连接到该模块,模块也可以连接到其他⽆线⽹络,实现串⼝与其他设备 之间的⽆线(WIFI)数据转换互传。该模式下,根据应⽤场景的不同,可以设置 9 个⼦模式:(TCP 服务器、TCP 客户端,UDP)||(TCP 服务器、TCP 客户端,UDP)。
⼀、把ov2640摄像头、esp8266模块与stm32f4核⼼板连接起来,如下图
⼆、main.c代码
#include "stm32f4xx.h"
#include "ov2640.h"
#include "SysTick.h"
#include "esp8266_drive.h"
#include "sta_tcpclent_test.h"
#include "esp8266_public.h"
#include "system.h"
#include "SysTick.h"
#include "dcmi.h"
#define jpeg_buf_size 31*1024 //定义JPEG数据缓存jpeg_buf的⼤⼩(*4字节)
__align(4) u32 jpeg_buf[jpeg_buf_size]; //JPEG数据缓存buf
volatile u32 jpeg_data_len=0; //buf中的JPEG有效数据长度
volatile u8 jpeg_data_ok=0; //JPEG数据采集完成标志
/
/0,数据没有采集完;
//1,数据采集完了,但是还没处理;
//2,数据已经处理完成了,可以开始下⼀帧接收
//处理JPEG数据
//当采集完⼀帧JPEG数据后,调⽤此函数,切换JPEG BUF.开始下⼀帧采集.
void jpeg_data_process(void)
{
if (jpeg_data_ok==0) //jpeg数据还未采集完?
{
DMA_Cmd(DMA2_Stream1, DISABLE);//停⽌当前传输
while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置
jpeg_data_len = jpeg_buf_size - DMA_GetCurrDataCounter(DMA2_Stream1);//得到此次数据传输的长度
jpeg_data_ok=1; //标记JPEG数据采集完按成,等待其他函数处理
}
2022法定节假日if (jpeg_data_ok==2) //上⼀次的jpeg数据已经被处理了
{
DMA2_Stream1->NDTR=jpeg_buf_size;
DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size);//传输长度为jpeg_buf_size*4字节
DMA_Cmd(DMA2_Stream1, ENABLE); //重新传输
jpeg_data_ok=0; //标记数据未采集
}
}
//JPEG测试
//JPEG数据,通过esp8266_wifi 串⼝3发送给电脑.
void jpeg_test(void)
{
u32 i=0;
林心如年龄u8 *p=0;
ESP8266_Init(115200); //初始化esp8266
ESP8266_STA_TCPClient_Test();//连接服务器
于途因为英雄池深delay_ms(100);
OV2640_JPEG_Mode(); //jpeg模式
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置 OV2640_OutSize_Set(800,600);
DCMI_Start(); //启动传输
delay_ms(500);
while(1)
{
{
if(jpeg_data_ok==1) //已经采集完⼀帧图像了
{
自动化就业方向及前景GPIO_ResetBits(GPIOC, GPIO_Pin_3);
p=(u8*)jpeg_buf;
ESP8266_USART("S%dS",jpeg_data_len*4);
for(i=0; i<jpeg_data_len*4; i++) //dma传输1次等于2字节,所以乘以2.
{
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //循环发送,直到发送完毕 USART_SendData(USART3, p[i]);
}
GPIO_SetBits(GPIOC, GPIO_Pin_3);
jpeg_data_ok=2; //标记jpeg数据处理完了,可以让DMA去采集下⼀帧了.
delay_ms(20);
}
}
}
int main(void)
元宵节放假{
/*系统定时器初始化*/
SysTick_Init(168);
TIM3_Int_Init(10000-1,8400-1); //10Khz计数,1秒钟中断⼀次
while(OV2640_Init()); //初始化ov2640摄像头
jpeg_test();
}
程序源码:
三、测试结果(速度只能达到两秒⼀帧)
发布评论