硬汉嵌入式论坛

 找回密码
 立即注册
查看: 721|回复: 1
收起左侧

[摄像头] STM32H7 DCMI 驱动 OV2640 问题

[复制链接]

14

主题

37

回帖

79

积分

初级会员

积分
79
发表于 2024-7-29 10:02:25 | 显示全部楼层 |阅读模式
问题背景:现有 ov2640 image sensor,内置 8-bit mcu 用于编码,接口为 DCMI(并行接口)
问题:现有 STM32H7 想获取 OV2640 的 mjpeg 流数据,并通过 USART 传输到 PC 软件
1.接收数据选择哪种中断,Line interrupt 还是 Frame interrupt
2.DCMI 通过 DMA 将数据转到 RAM 中的 Buffer,那么 Buffer 该如何设计,选择一块大的连续 buffer,还是需要做一个 ring buffer,避免数据覆盖和数据顺乱
3.触发中断后,是否关闭 DCMI 和 DMA

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-7-29 16:22:53 | 显示全部楼层
这个是我们的,供参考

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: CAM_Start
*	功能说明: 启动DMA和DCMI,开始传送图像数据到LCD显存
*	形    参: _uiDispMemAddr 显存地址
*	返 回 值: 无
*********************************************************************************************************
*/
void CAM_Start(uint32_t _uiDispMemAddr)
{	
	/* 使能DCMI */
	__HAL_RCC_DMA1_CLK_ENABLE();

	hdma_dcmi.Instance                 = DMA1_Stream7;           /* 使用的DMA1 Stream7 */
	hdma_dcmi.Init.Request             = DMA_REQUEST_DCMI;       /* DMA请求来自DCMI */  
	hdma_dcmi.Init.Direction           = DMA_PERIPH_TO_MEMORY;   /* 传输方向是从DCMI到存储器 */ 
	hdma_dcmi.Init.PeriphInc           = DMA_PINC_DISABLE;       /* 外设地址自增禁止 */  
	hdma_dcmi.Init.MemInc              = DMA_MINC_ENABLE;        /* 存储器地址自增使能 */  
	hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;    /* 外设数据传输位宽选择字,即32bit */  
	hdma_dcmi.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;    /* 存储器数据传输位宽选择字,即32bit */
	hdma_dcmi.Init.Mode                = DMA_CIRCULAR;           /* 循环模式 */   
	hdma_dcmi.Init.Priority            = DMA_PRIORITY_LOW;       /* 优先级低 */  
	hdma_dcmi.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;   /* 使能FIFO*/
	hdma_dcmi.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;/* 用于设置阀值 */
	hdma_dcmi.Init.MemBurst            = DMA_MBURST_SINGLE;      /* 单次突发,用于存储器突发 */
	hdma_dcmi.Init.PeriphBurst         = DMA_PBURST_SINGLE;      /* 单次突发,用于外设突发 */
	
	/* 初始化DMA */
	if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK)
	{
		Error_Handler(__FILE__, __LINE__);
	}

	/* 摄像头句柄关联DMA句柄 */
	__HAL_LINKDMA(&hdcmi, DMA_Handle, hdma_dcmi);

	/* 使能DMA1 Stream7 中断 */
	HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);		
	
	/* 启动DCMI的DMA传输 */
	HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)_uiDispMemAddr, 640*240);

	g_tCam.CaptureOk = 0;		/* 全局标志 */
}

/* 后续启动传输,仅需调用函数HAL_DCMI_Start_DMA即可 */
void CAM_Start1(uint32_t _uiDispMemAddr)
{
	HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)_uiDispMemAddr, 640*240);	

	g_tCam.CaptureOk = 0;	/* 全局标志 */
}

/*
*********************************************************************************************************
*	函 数 名: CAM_Stop
*	功能说明: 停止DMA和DCMI
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void CAM_Stop(void)
{
	HAL_DCMI_Stop(&hdcmi);
}

void DMA1_Stream7_IRQHandler(void)
{
	HAL_DMA_IRQHandler(&hdma_dcmi);
}

void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
	/* 关闭摄像 */
	CAM_Stop();
	g_tCam.CaptureOk = 1;		/* 表示DMA传输结束 */
}

评分

参与人数 1金币 +2 收起 理由
shiinakaze + 2 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-29 06:25 , Processed in 0.223856 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表