ST意法半导体
直播中

康大争

7年用户 2220经验值
私信 关注
[问答]

STM32H743 DMA传输错误是什么原因?

我正在使用 STM32H743。
我使用 STM32CubeMx 来配置 DCMI。它使用 DMA 传输到内存。
调用 HAL_DCMI_Start_DMA() 时,会调用 DCMI_DMAError() 函数。
我发现存在传输错误。根据文档,总线错误是原因。
但是 MCU 的 CFSR 寄存器为零,表示没有总线错误。
有什么问题吗?
我做的事情:
  • 使用STM32CubeMX设置DCMI并启用DMA
  • 禁用缓存
  • 使用在 SRAM1 中创建缓冲区
    • __attribute__ ((section(".buffer"), 使用)) uint32_t bigbuf[30000];
    • 检查它是否存在于区域 RAM_D2 中
  • 称为 HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)bigbuf, ((752*480)/4)/4);
    • 返回 HAL_OK
    • 传感器是 752*480,我使用 8 位 DCMI(因此一个字中有 4 个)并且我使用一半的像素数和一半的行数
  • 用示波器检查 DCMI 是否正常工作(存在时钟、同步和数据信号)
知道为什么我会收到此传输错误吗?







回帖(1)

李凯

2022-12-2 14:08:30
我发现了问题!这是 STM32CubeMx 的一个错误。
STM32CubeMx 生成此代码以初始化所有外设:


  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_DCMI_Init();
  •   MX_I2C1_Init();
  •   MX_I2C2_Init();
  •   MX_UART5_Init();
  •   MX_USART1_UART_Init();
  •   MX_DMA_Init();
  •   MX_USB_DEVICE_Init();

问题是 MX_DCMI_Init() 初始化了 DMA。但是 DMA 时钟还没有启用!它由 MX_DMA_Init() 启用。
我不想更改初始化顺序,所以我在所有初始化之前启用了 DMA 时钟:


  •   /* USER CODE BEGIN SysInit */

  •   __HAL_RCC_DMA2_CLK_ENABLE();

  •   /* USER CODE END SysInit */

  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_DCMI_Init();
  •   MX_I2C1_Init();
  •   MX_I2C2_Init();
  •   MX_UART5_Init();
  •   MX_USART1_UART_Init();
  •   MX_DMA_Init();
  •   MX_USB_DEVICE_Init();

现在它起作用了!
举报

更多回帖

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