在函数 2D DMA 中传递地址

Passing an address in a function 2D DMA

我有一个具有该原型的函数:

HAL_StatusTypeDef HAL_DMA2D_Start(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width,  uint32_t Height)

它应该在帧缓冲区上绘制一个像素

HAL_DMA2D_Start(&hdma2d, c,
                &OLED_BUFFER[0] +
                    (PIXELWINDOW.pos.x + PIXELWINDOW.pos.y * 320) * 2,
                1, 1);

那条线的问题

 &OLED_BUFFER[0] +
                        (PIXELWINDOW.pos.x + PIXELWINDOW.pos.y * 320) * 2

我收到警告

warning: passing argument 3 of 'HAL_DMA2D_Start' makes integer from pointer without a cast

OLED_BUFFER 是一个 uint16_t 类型的数组,每个像素帧缓冲区 2 个字节

完整函数如下:

void PIXELDATA(uint16_t c) {
  DMA2D_HandleTypeDef hdma2d;
  hdma2d.Instance = DMA2D;
  hdma2d.Init.Mode = DMA2D_R2M;
  hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
  hdma2d.Init.OutputOffset = 320 - 1;
  HAL_DMA2D_Init(&hdma2d);
  if (PIXELWINDOW.pos.x <= PIXELWINDOW.end.x &&

      PIXELWINDOW.pos.y <= PIXELWINDOW.end.y) {
    HAL_DMA2D_Start(&hdma2d, c,
                    (uint16_t)&OLED_BUFFER +
                        (PIXELWINDOW.pos.x + PIXELWINDOW.pos.y * 320) * 2,
                    1, 1);
    HAL_DMA2D_PollForTransfer(&hdma2d, 10);

  }
  PIXELWINDOW.pos.x++;

  if (PIXELWINDOW.pos.x > PIXELWINDOW.end.x) {
    PIXELWINDOW.pos.x = PIXELWINDOW.start.x;

    PIXELWINDOW.pos.y++;
  }
}

函数的第三个参数HAL_DMA2D_Start不是一个指针而是一个整数,更准确地说是一个uint32_t。所以你必须将 &OLED_BUFFER[0] + ... 转换为 32 位无符号整数。

注意在32位的STM32上,一个指针和一个uint32_t都是32位的变量,但在其他处理器上并不总是这样。

在我看来,函数 HAL_DMA2D_Start 将指针作为参数或 uintptr_t 会更简洁。