【STM32】STM32H7 通过 DCMI 驱动 OV2640 实现 USART 传输 JPEG

STM32H750VBT6 DCMI USART

使用 STM32H750VBT6 通过 DCMI 驱动 OV2640,获取 JPEG 数据,然后用 USART 发送到 PC。

设备:

Device NameNote
STM32H750VBT6YD-STM32VBT6 Core Board
OV2640OV2640 Module
CH340USB-Serial adapter

Result

在这里插入图片描述

DCMI

就是 STM32CubeMX 的 DCMI 默认配置,选择外部同步自动配引脚。

DCMI_PIXCLKDCMI_HSYNCDCMI_VSYNCDCMI_PWDNDCMI_RESET
PA6PA4PB7PD1PD2
DCMI_D0DCMI_D1DCMI_D2DCMI_D3DCMI_D4
PC6PC7PC8PC9PE4
DCMI_D5DCMI_D6DCMI_D7
PD3PE5PE6

DCMI param

在这里插入图片描述

DCMI NVIC

在这里插入图片描述

DCMI DMA

在这里插入图片描述

USART

使用的是 USAR1

USART Param

在这里插入图片描述

USART NVIC

在这里插入图片描述

USART DMA

在这里插入图片描述

Core Code

/* USER CODE BEGIN PM */
#define JPEG_BUFFER_LENGTH 10*1024/4
#define USART_BUFFER_LENGTH JPEG_BUFFER_LENGTH*4
#define JPEG_BUFFER_NUM 2
/* USER CODE END PM */

......

/* USER CODE BEGIN PV */
uint32_t jpeg_buffer[JPEG_BUFFER_NUM][JPEG_BUFFER_LENGTH] = { 0 };
uint32_t *pjpeg_buffer = jpeg_buffer[0];
__IO uint8_t jpeg_new_frame = 0;

uint8_t *pusart_buffer = (uint8_t*) jpeg_buffer[1];
/* USER CODE END PV */
int main(void) {

	/* USER CODE BEGIN 1 */

	/* USER CODE END 1 */

	/* MPU Configuration--------------------------------------------------------*/
	MPU_Config();

	/* MCU Configuration--------------------------------------------------------*/

	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();

	/* USER CODE BEGIN Init */

	/* USER CODE END Init */

	/* Configure the system clock */
	SystemClock_Config();

	/* USER CODE BEGIN SysInit */

	/* USER CODE END SysInit */

	/* Initialize all configured peripherals */
	MX_GPIO_Init();
	MX_DMA_Init();
	MX_USART1_UART_Init();
	MX_DCMI_Init();
	/* USER CODE BEGIN 2 */
	OV2640_Init();
	HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t) pjpeg_buffer,
	JPEG_BUFFER_LENGTH);

	/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */
	while (1) {
		if (jpeg_new_frame) {
			uint8_t *ptemp_buffer = (uint8_t*) jpeg_buffer[0];
			memcpy(pusart_buffer, ptemp_buffer, USART_BUFFER_LENGTH);
			HAL_UART_Transmit_DMA(&huart1, pusart_buffer, USART_BUFFER_LENGTH);
			jpeg_new_frame = 0;
		}
		/* USER CODE END WHILE */

		/* USER CODE BEGIN 3 */
	}
	/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */

void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) {
	jpeg_new_frame = 1;
}

/* USER CODE END 4 */

Source

stm32h7_ov2640 - GitHub

### STM32OV2640摄像头模块通过DCMI接口进行图像采集 #### OV2640摄像头模块概述 OV2640是一款高分辨率CMOS传感器,支持多种输出格式和帧率设置。该模块通常用于需要高质量图像的应用场景中。其主要特点包括可编程增益控制、自动曝光调整以及白平衡等功能[^1]。 #### DCMI接口简介 Direct Camera Interface (DCMI) 是一种专为连接相机设备而设计的标准外设接口,在STM32系列微控制器中有广泛应用。它能够接收来自外部摄像机的数据流并将其传输给内部存储器或DMA通道进一步处理[^2]。 #### 配置过程说明 为了使能OV2640STM32之间的通信,需完成如下配置: - **硬件连接** - 将OV2640的VSYNC信号线接到MCU相应引脚上作为垂直同步输入; - PCLK则对应像素时钟源; - 数据总线D[7:0]应分别对接8位双向数据I/O管脚; - **初始化SCCB/I²C协议** - SCCB是一种类似于IIC/TWI两线制串行通讯标准,用来访问CAM内的寄存器地址空间。 - **设定工作模式** - 根据实际需求选择合适的视频参数(如JPEG压缩质量等级),并通过写入特定命令字节序列到指定位置来改变默认出厂状态下的各项属性值。 - **启动捕获流程** - 当一切准备就绪之后就可以调用库函数开启一次性的抓拍动作或是连续不断的实时预览功能了。 ```c #include "stm32f4xx_hal.h" // 假定已经定义好了必要的结构体变量 hscib 和 hdcmi void OV2640_Init(void){ /* 初始化 I2C */ HAL_I2C_MspInit(&hscib); // 设置摄像头参数... } uint8_t OV2640_ReadReg(uint8_t reg_addr, uint8_t *data){ return HAL_I2C_Mem_Read(&hscib, OV2640_ADDRESS<<1 ,reg_addr, 1,data,1,HAL_MAX_DELAY); } void OV2640_WriteReg(uint8_t reg_addr,uint8_t data){ HAL_I2C_Mem_Write(&hscib, OV2640_ADDRESS<<1 ,reg_addr, 1,&data,1,HAL_MAX_DELAY); } int main(){ // 初始化系统时钟等基础环境... OV2640_Init(); while(1){ if(HAL_DCMI_Start_DMA(&hdcmi,(uint32_t*)Buffer,DMA_BUFFER_SIZE)==HAL_OK){ // 成功开始DMA传输后等待中断标志触发再做后续操作 } } } ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值