这个是我们的,供参考
[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传输结束 */
} |