【前言】
CPKEXP-EKRA8X1带了一个基于st7796的mipi屏,但是没有触摸屏,因此采用外接ST7796+GT911的屏来进行移植
【目标】
瑞萨RA8D1 LVGL移植,基于硬件SPI+st7796
【开发环境】
win11
【硬件】
1、CPKCOR-RA8D1B核心板
2、拓展板(CPKEXP-EKRA8X1)
3、ST7796 SPI屏
【开发工具】
1、keil+fsp
【工程准备】
准备一个基于ra8d1的led工程。
【硬件连接】
CPKEXP-EKRA8X1带有标准的arduino接口,因此采用其接口进行使用,结合开发板原图,我使用SPI1进行驱动,其连接如下:
P412——SCK
P410——MOSI
P413——CS
PA07——DC
P504——RST
P505——BLK
【RASC配置】

时钟极性配置为模式0,即空闲是SCK、MOSI均为低电平。
接下来配置DC、CS、RST、BLK为输出模式

【代码移植】
1、复制以前在瑞萨其余RA系列上驱动好的st7796的代码到工程中。
2、修改SPI实例
// SPI实例 extern spi_b_instance_ctrl_t g_spi1_ctrl;
ra8d1的spi驱动与其他的RA系列不同的是少了_b。
3、修改CS、DC、RST、BLK的宏定义
// 引脚操作宏定义 #define CS_SET R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_13, BSP_IO_LEVEL_HIGH) #define CS_CLR R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_13, BSP_IO_LEVEL_LOW) #define DC_SET R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_07, BSP_IO_LEVEL_HIGH) #define DC_CLR R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_07, BSP_IO_LEVEL_LOW) #define RST_SET R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_04, BSP_IO_LEVEL_HIGH) #define RST_CLR R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_04, BSP_IO_LEVEL_LOW) #define BL_SET R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_05, BSP_IO_LEVEL_HIGH) #define BL_CLR R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_05, BSP_IO_LEVEL_LOW)
4、修改spi发送函数
// 发送命令
static void st7796_send_command(uint8_t cmd)
{
DC_CLR; // 命令模式
CS_CLR; // 选中LCD
// 发送命令
R_SPI_B_Write(&g_spi1_ctrl, &cmd, 1, SPI_BIT_WIDTH_8_BITS);
// 等待发送完成
SPIWaitgtc();
CS_SET; // 取消选中
}【注】这里也是一样RA8D1的spi驱动有spi_b与spi_a的区别。
其余代码均不需要变动,代码我会附源码。
【添加LVGL】
在mkd的manage Run-Time Environment中钩选Essential与Porting

【注】在mdk的lvgl V9中,在编译是会报错:
assembling lv_blend_helium.S... lv_blend_helium.S: error: A3903U: Argument 'NOT_SUPPORTED' not permitted for option 'cpu'.
【lvgl配置】
1、打开lv_port_display_template.h/c的#if 1,引入st7796的驱动头文件。

2、添加画点函数
st7796_draw_pixel(x, y, color_p->full);
【测试与验证】
在hal_entry.c中添加测试标签代码:
void hal_entry(void)
{
/* LED type structure */
st7796_init();
st7796_fill_screen(BLUE);
lv_init();
lv_port_disp_init();
// --- 1. 创建标签对象 (只传入父对象) ---
lv_obj_t * label = lv_label_create(lv_scr_act());
// --- 2. 设置标签显示的文本 ---
lv_label_set_text(label, "Hello World!");
// --- 3. 让标签居中显示 ---
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
while (1)
{
lv_timer_handler();
R_BSP_SoftwareDelay(100u, BSP_DELAY_UNITS_MICROSECONDS);
}
}
【总结】
通过RA生态的图形化配置与mdk的lvgl图形化配置,可以快速的移植基于spi_lcd的驱动。
【附工程源码】
我要赚赏金
