在函数 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
会更简洁。
我有一个具有该原型的函数:
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
会更简洁。