3028|0

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【瑞萨RA8D1开发板,基于M85内核的图形MCU测评】3.RGB-LCD [复制链接]

由于LVGL不支持RGB666,触摸的I2C和j-link串口冲突,所以上个贴子中的硬件设计需要重新设计一下
在移植LVGL之前首先进行RGB LCD驱动的编写,本次实验所用屏幕为反客4.3寸800*480分辨率RGB屏幕
本次实验实在点灯工程的基础上进行的,由于实验设置的屏幕色彩模式为RGB565,并采用双缓存,所以内部RAM空间不足,需要使用外部SDRAM,先进行外部SDRAM的驱动配置,此处参考官方程序即可,下面为IO配置
Sdram文件添加到工程中
接下来进行GLCDC接口的时钟配置
然后进行GLCDC的IO口设置,色彩模式RGB565
Stacks添加GLCDC
设置属性
添加LCD背光的PWM驱动
配置完成后点击代码生成,在工程中添加LCD驱动的。下面为部分驱动代码
static uint16_t *lcd_current_working_buffer = (uint16_t *) &fb_background[0];
static uint8_t lcd_framebuffer[LCD_BUF_SIZE] BSP_ALIGN_VARIABLE(64) BSP_PLACE_IN_SECTION(".sdram");
static void bsp_lcd_backlight_init(void);
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] 初始化
*
* @param 无
* @retval 无
*/
void bsp_lcd_init (void)
{
fsp_err_t err;
// Open the GLCDC driver
err = R_GLCDC_Open(&g_display0_ctrl, &g_display0_cfg);
//printf("err1 %d\r\n",err);
err = R_GLCDC_Start(&g_display0_ctrl);
//printf("err2 %d\r\n",err);
bsp_lcd_backlight_init();
}
/**
* @brief 初始化
*
* @param 无
* @retval 无
*/
static void bsp_lcd_backlight_init(void)
{
/* 初始化 GPT 模块 */
R_GPT_Open(&g_timer_gpt6_ctrl, &g_timer_gpt6_cfg);
/* 启动 GPT 定时器 */
R_GPT_Start(&g_timer_gpt6_ctrl);
/* 重新设置占空比为 80% */
lcd_set_brightness(100);
}
/** 自定义函数:设置PWM占空比
@param duty 占空比范围:0~100 %
*/
void lcd_set_brightness(uint8_t duty)
{
timer_info_t info;
uint32_t current_period_counts;
uint32_t duty_cycle_counts;
if (duty > 100)
duty = 100; //限制占空比范围:0~100
/* 获得GPT的信息 */
R_GPT_InfoGet(&g_timer_gpt6_ctrl, &info);
/* 获得计时器一个周期需要的计数次数 */
current_period_counts = info.period_counts;
/* 根据占空比和一个周期的计数次数计算GTCCR寄存器的值 */
duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);
/* 最后调用FSP库函数设置占空比 */
R_GPT_DutyCycleSet(&g_timer_gpt6_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCA);
}
/**
* @brief 设置显示缓存
* @param index:缓存区索引 1.第一缓存数组 2.第二缓存数组
* @retval 无
*/
static void lcd_set_display_buffer(uint8_t index)
{
/* 更改图层的帧缓冲区指针 */
R_GLCDC_BufferChange(&g_display0_ctrl, (uint8_t*)fb_background[index - 1], DISPLAY_FRAME_LAYER_1);
}
/**
* @brief 设置当前使用的缓存
* @param index:缓存区索引 1.第一缓存数组 2.第二缓存数组
* @retval 无
*/
static void lcd_set_working_buffer(uint8_t index)
{
if (index >= 1 && index <= 2)
{
lcd_current_working_buffer = (uint16_t *)fb_background[index - 1];
}
}
///**
// * @brief 使能双buffer
// * @retval 无
// */
//static void lcd_enable_double_buffer(void)
//{
// lcd_set_working_buffer(1);
// lcd_set_display_buffer(1);
//}
/**
* @brief lcd清屏
* @param color:RGB565 颜色
* @retval 无
*/
void lcd_clear(uint16_t color)
{
for (uint32_t i = 0; i < (LCD_WIDTH * LCD_HEIGHT); i++)
{
lcd_current_working_buffer[i] = color;
}
}
/**
* @brief lcd切换帧缓冲区
* @retval 无
*/
void lcd_swap_buffer(void)
{
if (lcd_current_working_buffer == (uint16_t *)fb_background[0])
{
lcd_set_working_buffer(2);
lcd_set_display_buffer(2);
}
else
{
lcd_set_working_buffer(1);
lcd_set_display_buffer(1);
}
}
/**
* @brief lcd清平
* @param color:RGB565 颜色
* @retval 无
*/
void lcd_draw_pixel(uint32_t x, uint32_t y, uint16_t color)
{
// Verify pixel is within LCD range
if ((x <= LCD_WIDTH) && (y <= LCD_HEIGHT))
{
switch (g_screen_rotation)
{
case ROTATION_ZERO:
{
lcd_current_working_buffer[(y * LCD_WIDTH) + x] = color;
break;
}
case ROTATION_180:
{
lcd_current_working_buffer[((LCD_HEIGHT - y) * LCD_WIDTH) + (LCD_WIDTH - x)] = color;
break;
}
default:
{
lcd_current_working_buffer[(y * LCD_WIDTH) + x] = color;
break;
}
}
}
else
{
printf("draw pixel outof range:%d,%d", x, y);
}
}
/**
* @brief 填充数组
* @param x_start:
* @param y_start:
* @param x_end:
* @param y_end:
* @param pcolor:
* @retval 无
*/
void lcd_fill_array(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, void *pcolor)
{
uint16_t *pixel = NULL;
uint16_t cycle_y, x_offset = 0;
pixel = (uint16_t *)pcolor;
for (cycle_y = y_start; cycle_y <= y_end;)
{
for (x_offset = 0; x_start + x_offset <= x_end; x_offset++)
{
lcd_draw_pixel(x_start + x_offset, cycle_y, *pixel++);
}
cycle_y++;
}
}
void lcd_fill_rectangle(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t pixcolor)
{
uint16_t cycle_y, x_offset = 0;
for (cycle_y = y_start; cycle_y <= y_end;)
{
for (x_offset = 0; x_start + x_offset <= x_end; x_offset++)
{
lcd_draw_pixel(x_start + x_offset, cycle_y, pixcolor);
}
cycle_y++;
}
}

 

在LED线程中测试一下
void led_thread_entry(void* pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);

bsp_dwt_init();
bsp_led_init();
bsp_uart3_init();
bsp_sdram_init();
bsp_lcd_init();
lcd_clear(BLACK);
lcd_fill_rectangle(100,100,200,400,RED);
lcd_fill_rectangle(200,100,300,400,GREEN);
lcd_fill_rectangle(300,100,400,400,BLUE);
while(1)
{
led_toggle();
vTaskDelay(20);
}
}

 

拍照有些失真,屏幕的实际观感效果还是很不错的。下一步移植LVGL_V9.1
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表
  缈昏瘧锛