Передача адреса в функцию 2D DMA - PullRequest
0 голосов
/ 21 октября 2019

У меня есть функция с таким прототипом:

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++;
  }
}

1 Ответ

0 голосов
/ 21 октября 2019

Третий параметр функции HAL_DMA2D_Start является не указателем, а целым числом, точнее uint32_t. Таким образом, вы должны привести &OLED_BUFFER[0] + ... к 32-битному целому числу без знака.

Обратите внимание, что в 32-битном STM32 указатель и uint32_t являются 32-битными переменными, но это не всегда так в случае другихпроцессоры.

По моему мнению, было бы чище, если бы функция HAL_DMA2D_Start принимала указатель в качестве параметра, или uintptr_t.

...