一、前言
D/AVE 2D 是 Renesas 微控制器中的硬件模块,主要用于2D图形加速。
- 硬件加速的2D图形绘制操作
- 支持矩形填充、线条绘制、位图传输等
- 比软件实现快得多的图形渲染速度
参考文档:
RA Flexible Software Package Documentation: D/AVE 2D Port Interface (r_drw)

二、DRW DEMO
1、配置STACKS

用到display 和 D/AVE
相关参数可以参考https://bbs.elecfans.com/jishu_2502530_1_1.html
2、使能SDAM

3、程序
1、hal_entry.c
调用了DRW_entry()
void hal_entry(void)
{
DRW_entry();
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
初始化了SDRAM
void R_BSP_WarmStart(bsp_warm_start_event_t event)
{
if (BSP_WARM_START_RESET == event)
{
#if BSP_FEATURE_FLASH_LP_VERSION != 0
R_FACI_LP->DFLCTL = 1U;
#endif
}
if (BSP_WARM_START_POST_C == event)
{
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
#if BSP_CFG_SDRAM_ENABLED
R_BSP_SdramInit(true);
#endif
}
}
2、DRW_entry.c
配置缓存、调用display初始化、drw初始化,调用demo :display_draw
void DRW_entry(void)
{
fsp_err_t err = FSP_SUCCESS;
fsp_pack_version_t version = {RESET_VALUE};
#if defined(CPKCOR_RA8D1B)
uint32_t * p_framebuffer = NULL;
#else
uint8_t * p_framebuffer = NULL;
#endif
g_hz_size = (g_display_cfg.input[ARRAY_INDEX].hsize);
g_vr_size = (g_display_cfg.input[ARRAY_INDEX].vsize);
g_buffer_size = (uint32_t) (g_hz_size * g_vr_size * BYTES_PER_PIXEL);
#if defined(CPKCOR_RA8D1B)
g_p_single_buffer = (uint32_t *) g_display_cfg.input[ARRAY_INDEX].p_base;
#else
g_p_single_buffer = (uint8_t *) g_display_cfg.input[ARRAY_INDEX].p_base;
#endif
g_p_double_buffer = g_p_single_buffer + g_buffer_size;
glcdc_init();
while(!g_vsync_flag);
g_vsync_flag = RESET_FLAG;
drw_init();
while(true)
{
p_framebuffer = (p_framebuffer == g_p_single_buffer) ? g_p_double_buffer : g_p_single_buffer;
while(!g_vsync_flag);
g_vsync_flag = RESET_FLAG;
#if defined(CPKCOR_RA8D1B)
err = R_GLCDC_BufferChange(&g_display_ctrl, (uint8_t*) p_framebuffer, DISPLAY_FRAME_LAYER_1);
#else
err = R_GLCDC_BufferChange(&g_display_ctrl, p_framebuffer, DISPLAY_FRAME_LAYER_1);
#endif
display_draw(p_framebuffer);
}
}
display初始化:
static void glcdc_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_GLCDC_Open(&g_display_ctrl, &g_display_cfg);
#if defined(CPKCOR_RA8D1B)
mipi_dsi_push_table(g_lcd_init_focuslcd);
#endif
err = R_GLCDC_Start(&g_display_ctrl);
}
drw初始化:
static void drw_init(void)
{
gp_davey = d2_opendevice(BITFIELD_VALUE);
DRW_err = d2_inithw(gp_davey, BITFIELD_VALUE);
DRW_err = d2_setalpha(gp_davey, ALPHA_VALUE);
DRW_err = d2_setalphamode(gp_davey, d2_am_constant);
DRW_err = d2_setblendmode(gp_davey, d2_bm_alpha, d2_bm_one_minus_alpha);
}
demo函数:
static void display_draw (uint32_t * framebuffer)
{
/* DRW operations happens here */
/*Animation of different figures */
drw_animation();
/* set frame buffer properties */
drw_set(framebuffer);
/* Set the render color to red */
DRW_err = d2_setcolor(gp_davey, ARRAY_INDEX, RED_COLOR_VAL);
error_handler(DRW_err, gp_davey);
/* Render a circle */
DRW_err = d2_rendercircle(gp_davey,(d2_point)(g_c_c_x1 << SHIFT_VALUE), (d2_point)(g_c_c_y1 << SHIFT_VALUE), (d2_width)(g_c_r << SHIFT_VALUE), (d2_width)(g_c_w << SHIFT_VALUE));
error_handler(DRW_err, gp_davey);
/* Set the render color to green */
DRW_err = d2_setcolor(gp_davey, ARRAY_INDEX, GREEN_COLOR_VAL);
error_handler(DRW_err, gp_davey);
/* Render a triangle */
DRW_err = d2_rendertri(gp_davey, (d2_point)( g_t_x1 << SHIFT_VALUE),(d2_point)( g_t_y1 << SHIFT_VALUE),(d2_point)( g_t_x2 << SHIFT_VALUE),(d2_point)( g_t_y2 << SHIFT_VALUE),(d2_point)( g_t_x3 << SHIFT_VALUE),(d2_point)( g_t_y3 << SHIFT_VALUE),d2_edge2_shared);
error_handler(DRW_err, gp_davey);
/* Set the render color to blue */
DRW_err = d2_setcolor(gp_davey, ARRAY_INDEX, BLUE_COLOR_VAL);
error_handler(DRW_err, gp_davey);
/* Render a box */
DRW_err = d2_renderbox(gp_davey,(d2_point)(g_b_x1 << SHIFT_VALUE), (d2_point)(g_b_y1 << SHIFT_VALUE), (d2_width)(g_b_l << SHIFT_VALUE), (d2_width)(g_b_w << SHIFT_VALUE));
error_handler(DRW_err, gp_davey);
/* Set the render color to yellow */
DRW_err = d2_setcolor(gp_davey, ARRAY_INDEX, YELLOW_COLOR_VAL);
error_handler(DRW_err, gp_davey);
/* Render a line */
DRW_err = d2_renderline(gp_davey, (d2_point) (g_l_x1 << SHIFT_VALUE), (d2_point) (g_l_y1 << SHIFT_VALUE), (d2_point) (g_l_x2 << SHIFT_VALUE), (d2_point) (g_l_y2 << SHIFT_VALUE),
(d2_width) (g_l_w << SHIFT_VALUE), d2_le_exclude_both);
error_handler(DRW_err, gp_davey);
/* End the display list, then call d2_start frame to begin execution */
DRW_err = d2_endframe(gp_davey);
error_handler(DRW_err, gp_davey);
}
代码:
*附件:drw.rar