移植正点原子阿波罗H743的例程源码,按照手册修改了引脚,其它都没有改动,DMA无法访问DTCM,也更改了,勾选了IRAM2,但是使用该函数HAL_DCMI_Start_DMA(&g_atk_mc5640_dcmi_sta.dcmi,
DCMI_MODE_SNAPSHOT, dts_addr, len);启动DMA传输后,能发送数据,但是很快就停止发送,监测对应数组发现只有部分数据传输
并且DCMI的DR寄存器的值也固定在0x06060608停止更新,读取MIS寄存器的FRAME_MIS位为零,无法捕获到完整的数据,求解。
困扰许久,感谢各位大佬帮忙解答
针对DCMI-DMA传输停止的问题,以下是逐步解决方案:
确认DMA缓冲区位置
0x24000000 或 SRAM1 0x30000000),而非DTCM。 uint8_t dma_buffer[BUFFER_SIZE] __attribute__((section(".RxBufferSection")));
/* 并在链接脚本中定义RxBufferSection到0x24000000区域 */检查DCMI同步信号极性
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;验证DMA传输长度和分辨率设置
320*240*2=153600字节),确保len参数正确。检查DCMI时钟配置
排查溢出错误
DCMI->SR寄存器,检查溢出标志OVR_RIS。若存在溢出,需优化DMA优先级或降低摄像头输出速率。调试中断处理
HAL_DCMI_IRQHandler(&hdcmi);硬件检查
调整DMA配置
hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;示例代码修正:
在DCMI初始化后添加极性配置和内存地址检查:
// 确认DMA缓冲地址位于AXI SRAM
if ((uint32_t)dts_addr < 0x24000000 || (uint32_t)dts_addr >= 0x24080000) {
// 处理地址错误
}
// 在DCMI初始化结构体中明确同步信号极性
g_atk_mc5640_dcmi_sta.dcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
g_atk_mc5640_dcmi_sta.dcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;
g_atk_mc5640_dcmi_sta.dcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
HAL_DCMI_Init(&g_atk_mc5640_dcmi_sta.dcmi);通过以上步骤逐一排查,应能定位并解决DCMI-DMA传输异常停止的问题。
举报
更多回帖