STM32/STM8技术论坛
直播中

董珂超

未满1年用户 1经验值
擅长:嵌入式技术
私信 关注
[问答]

使用NUCLEO-H743ZI2时,DCMI-DMA传输停止是为什么

移植正点原子阿波罗H743的例程源码,按照手册修改了引脚,其它都没有改动,DMA无法访问DTCM,也更改了,勾选了IRAM2,但是使用该函数HAL_DCMI_Start_DMA(&g_atk_mc5640_dcmi_sta.dcmi,

DCMI_MODE_SNAPSHOT, dts_addr, len);启动DMA传输后,能发送数据,但是很快就停止发送,监测对应数组发现只有部分数据传输屏幕截图 2025-03-14 004834.png

并且DCMI的DR寄存器的值也固定在0x06060608停止更新,读取MIS寄存器的FRAME_MIS位为零,无法捕获到完整的数据,求解。

附上代码
*附件:H743+OV5640.zip

困扰许久,感谢各位大佬帮忙解答

回帖(1)

贾伟刚

2025-3-3 11:56:22

针对DCMI-DMA传输停止的问题,以下是逐步解决方案:




  1. 确认DMA缓冲区位置  



    • 确保缓冲区位于DMA可访问的内存区域(如AXI SRAM 0x24000000 或 SRAM1 0x30000000),而非DTCM。  

    • 在代码中显式指定缓冲区地址,例如:  
      uint8_t dma_buffer[BUFFER_SIZE] __attribute__((section(".RxBufferSection")));
      /* 并在链接脚本中定义RxBufferSection到0x24000000区域 */




  2. 检查DCMI同步信号极性  



    • 核对OV5640的VSYNC、HSYNC和PCLK极性配置与DCMI初始化参数是否匹配。例如,若OV5640输出高电平有效的VSYNC,则设置:  
      hdcmi.Init.VSPolarity  = DCMI_VSPOLARITY_HIGH;
      hdcmi.Init.HSPolarity  = DCMI_HSPOLARITY_HIGH;
      hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;




  3. 验证DMA传输长度和分辨率设置  



    • 计算一帧数据的正确长度(如分辨率320x240的RGB565格式为320*240*2=153600字节),确保len参数正确。




  4. 检查DCMI时钟配置  



    • 确认DCMI的时钟源(通常来自PLL2)频率满足OV5640的像素时钟要求,避免数据溢出。调整时钟分频器以确保匹配。




  5. 排查溢出错误  



    • 在传输停止后读取DCMI->SR寄存器,检查溢出标志OVR_RIS。若存在溢出,需优化DMA优先级或降低摄像头输出速率。




  6. 调试中断处理  



    • 确保DCMI帧中断(若有)正确清除标志位,避免阻塞后续传输。例如,在中断服务函数中调用:  
      HAL_DCMI_IRQHandler(&hdcmi);




  7. 硬件检查  



    • 使用示波器或逻辑分析仪检查OV5640的时钟和数据信号,确认信号完整性,排除接触不良或干扰问题。




  8. 调整DMA配置  



    • 确认DMA数据宽度与摄像头输出一致(如OV5640的8位数据模式对应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传输异常停止的问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分