呸是什么意思| 补血吃什么药| 中国梦是什么意思| 孕妇吸二手烟对胎儿有什么影响| 2月15是什么星座| 杜比全景声是什么意思| 鱼和什么不能一起吃| 煮茶叶蛋用什么茶| 眼缘是什么意思| 放化疗期间吃什么好| youtube是什么软件| 大便阳性说明什么问题| 三十六计最后一计是什么| 常喝苦荞茶有什么好处| 上日下文念什么| 什么是礼仪| 4月28日是什么日子| 网络诈骗打什么电话| 遗憾是什么| 血压高压低是什么原因| 子宫内膜异位是什么原因造成的| 孩子拉肚子吃什么药| 宫腔回声不均匀什么原因| 一个女一个以念什么| 冻梨是什么梨| 梦见捉黄鳝是什么意思| 属虎和什么属相相冲| 鲁是什么意思| 乔治白属于什么档次| 指甲看什么科| 老子是什么朝代的人| 职业测试你适合什么工作| 北京五行属什么| 甘草不能和什么一起吃| 脑炎是什么病严重吗| 周瑜为什么打黄盖| 三个毛念什么| 流产了有什么症状| 阑尾炎是什么原因引起的| 苏州有什么特产可以带回家| zzy是什么意思| 什么床垫好| 仙人掌有什么功效| 四川有什么烟| 霉菌性阴炎用什么药好得快| 喝普洱茶有什么功效| 烂漫什么意思| 吐痰带血是什么原因| 颈椎退行性变是什么意思| 吃了安宫牛黄丸要禁忌什么不能吃| 上海的市花是什么| champion什么意思| 球麻痹是什么病| 指甲凹凸不平是什么原因| adh医学上是什么意思| 石乐读什么| 肉桂是什么味道| 每天吃一个西红柿有什么好处| 完璧归赵发生在什么时期| 一箭双雕是什么意思| 硬下疳长什么样| 萧墙是什么意思| 四川大学校长什么级别| 蜡烛燃烧会产生什么| 假卵是什么样子的| 滋阴润燥是什么意思| 胃病吃什么药最好根治| 中耳炎挂什么科| 湿气重会有什么症状| 火碱是什么| 双侧卵巢显示不清是什么意思| 减肥吃什么玉米| 吃茄子有什么好处和坏处| 三点水加累读什么| 1974年属虎的是什么命| 女神是什么意思| 尿酸高什么不能吃| 脸上长痘挂什么科| 啤酒是什么味道| 泡温泉穿什么衣服| 政绩是什么意思| 感染幽门螺旋杆菌吃什么药| 开心的动物是什么生肖| 什么是电解质饮料| 子宫瘢痕是什么意思| 坐北朝南什么意思| 月经一直不干净吃什么药| 什么树林| april是什么意思| 女性尿频尿急是什么原因| 什么的雪人| 草莓是什么意思| davena手表什么牌子| 生日送什么花合适| 稷字五行属什么| 白细胞阳性是什么意思| laura是什么意思| 为什么孕酮会低| 三七粉什么时间吃最好| 血糖高要忌口什么| 石乐读什么| 伤官是什么| 9.27日是什么星座| 黛力新主治什么病| 昶字五行属什么| 满族不吃什么肉| 真丝丝绒是什么面料| 阴虚吃什么好| 蛇鼠一窝是什么生肖| 兵马俑在什么地方| 龙凤胎是什么意思| 血糖血脂挂什么科| 草字头内念什么| 金银花什么时候开花| 肝火旺盛吃什么食物| 什么叫吐槽| 什么是鸡冠油| 皮肤黑穿什么颜色的衣服| 鱼什么时候产卵| 中医治未病是什么意思| 什么是宾格| 男人眉骨高代表什么| 3月9日是什么星座| 脸上浮肿是什么原因导致的| 血常规血红蛋白偏高是什么原因| 阑尾在什么位置| 低压偏高是什么原因引起的| 胆红素高挂什么科检查| 但闻人语响的但是什么意思| 4月8日是什么星座| 休学需要什么条件| 暗代表什么生肖| 代孕是什么| 什么什么不平| 牛蛙和青蛙有什么区别| 鼻子上长脓包型痘痘是什么原因| 酷暑是什么意思| 两横两竖是什么字| 嗓子痛挂什么科| 蝴蝶兰什么时候开花| 吃葵花籽有什么好处和坏处吗| 基底是什么意思| 血常规五项能检查出什么病| 晕车喝什么饮料| 伏是什么意思| 喉咙嘶哑吃什么药| 爱屋及乌什么意思| 金牛座女和什么星座最配| 老人头晕吃什么药效果好| 南京市徽为什么是貔貅| 大鱼际发青是什么原因| 7月30号是什么星座| 80属什么| 安全感是什么| 出家当尼姑需要什么条件| 痰中带血吃什么药| 九条鱼代表什么意思| 签证和护照有什么区别| 右眼睛跳是什么意思| 本命年为什么不能结婚| 什么花是红色的| 腱鞘囊肿是什么原因| 眼睛充血是什么原因造成的| o型阴性血是什么意思| 唇炎用什么药| 骨折吃什么恢复得快| 七月十日是什么日子| 农历7月25日是什么星座| 干呕是什么原因| 86岁属什么| 容易手麻脚麻是什么原因| 左手中指戴戒指什么意思| 六月二十六是什么星座| 婴幼儿湿疹用什么药膏最有效| 嘴里发咸是什么原因| 大力念什么| 8月28日什么星座| 夕阳无限好只是近黄昏是什么意思| 女性气血不足吃什么调理| 肾阴虚吃什么食物补| 现在是什么年代| 老公护着家人说明什么| 大便不成形是什么原因造成的| 见到黑猫代表什么预兆| 晚上睡觉遗精是什么原因| 颠了是什么意思| sam是什么意思| 睡觉起来口苦是什么原因| 猪八戒有什么优点| 彩超无回声是什么意思| 肝脏钙化灶什么意思| 6.8是什么星座| adh是什么| 全血铅测定是什么意思| 145什么意思| 勰读什么| 你为什么背着我爱别人| 33周岁属什么生肖| 逍遥丸主治什么病| 肝肾亏虚吃什么药| 金牛男喜欢什么类型的女生| 狗取什么名字好| 房性期前收缩是什么意思| 补脑吃什么食物| app是什么意思啊| mf是什么意思| 包粽子用什么叶子| 6月3号是什么星座| 8岁属什么| asmr是什么| 世界什么| 小虾吃什么食物| 真人是什么意思| 嘴唇发紫什么原因| 麦粒肿吃什么消炎药| 四肢发麻是什么原因| 芦荟胶有什么作用| 胆囊炎不能吃什么| 最近有什么新闻| 五月初五是什么星座| 合财是什么意思| 樱花的花语是什么| 得了幽门螺旋杆菌有什么症状| reald厅什么意思| 叔叔的女儿叫什么| 猫发出咕噜咕噜的声音是什么意思| 木安读什么| 夏天适合种植什么蔬菜| 什么是纸片人| 斛是什么意思| 做梦梦见鱼是什么意思| 阴虚火旺喝什么茶好| 小鸡仔吃什么| 焯水是什么意思| 甲状腺炎吃什么药好得快| 火疖子吃什么药| 梦见别人给我介绍对象是什么意思| 四不伤害是指什么| 口有什么字| 滋养细胞疾病是什么病| 痛心疾首的疾是什么意思| 为什么润月| 5.13是什么星座| 六月十六是什么星座| 两个人在一起的意义是什么| bj是什么| 膜性肾病什么意思| 素字五行属什么| 甲炎是什么病| 无花果和什么不能一起吃| 负罪感是什么意思| 什么叫基因突变| 早上8点到9点是什么时辰| 圣诞节礼物什么时候送| 什么牌子的蓝牙耳机好| 上海月薪三万什么水平| 下午1点是什么时辰| 什么是生化流产| 什么发型好看| 血小板分布宽度低是什么原因| 血涂片检查什么病| 南京有什么美食| 百年灵手表什么档次| 脑软化灶是什么意思| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 活动中心 ? 板卡试用 ? 【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示

共1条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示

工程师
2025-08-04 15:23:37   被打赏 26 分(兑奖)     打赏
百度 AnexhibitfocusingonChinasLunarExplorationProgram(CLEP)beganSaturdayintheSwisscityofBasel,highlightingsomeofthemagnificentachievementsofChina,whentheCLEPofficiallystarted,Chinahasmadesignificantprogressintheexplorationofthemoon,XuXingli,generalmanagerofChangeAerospaceTechnology(Beijing)LLC,saidattheopeningceremonyoftheexhibit."In2007,ChinasfirstlunarprobeChange-1isthefirstlunarprobetotransmitbackthemostcomplete3-Dmapofthelunarsurface,makingChinaoneofthecountriescapableofouterspaceexploration,"hesaid."SincethesecondphaseoftheCLEPwasapprovedandinitiatedin2008,Change-2andlunarprobesweresuccessfullylaunchedandcompletedtheirmissions,"sprogressinthepastdecadealsoincludessendingtheCE-2lunarprobedirectlyintotheEarth-moontransferorbitin2010,thesoftlandingandpatrolsurveyonanextraterrestrialcelestialbodybyCE-3in2013,andthesuccessfullandingofthereturnandre-entrytestspacecraftinthescheduledareain2014."CLEPe-4lunarmissionthisyear,andwillbethefirst-eversoftlandingandrovingsurveyonthefarsideofthemoon,"ZuoWei,deputychiefdesigneroftheCLEPGroundApplicationSystem,,thebiggestchallengefortheCE-4missionisg,shesaid,ChinaplanstolauncharelaysatelliteinMandwillbethefirstintheworldtousetheunmannedlunarorbitalrendezvousanddockingmodetoachievelunarsurfacesamplingreturn.

【前言】

LVGL是一个开源的、免费的图形库,旨在为嵌入式系统提供轻量级且功能丰富的图形用户界面(GUI)解决方案。他的移植有很多文章都有介绍,但是一些对接LCD的显示优化的文章较小,今天我在移植完lvgl正常显示后,对显示的刷新方法进行了优化。现记录并分享如下:

1、最原始的方法,就是直接调用LCD的画点函数,比如我的工程里面就是lcd_draw_point(x, y, color_p->full);其刷新代码如下:

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    if(disp_flush_enabled) {
        /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

         int32_t x;
         int32_t y;
         for(y = area->y1; y <= area->y2; y++) {
             for(x = area->x1; x <= area->x2; x++) {
                 /*Put a pixel to the display. For example:*/
                 /*put_px(x, y, *color_p)*/
                 lcd_draw_point(x, y, color_p->full);
                 color_p++;
             }
         }

    }
    
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

这样,功能是可以实现,但是显示速度是非常慢的。

2、为了改进刷新速度,我们可以先获取disp_flush函数中,传入的一个显示块,即获取起始x、y坐标,结束x、y坐标。在disp_flush函数的参数中的指针const lv_area_t * area,即包含了他的这些全部信息,他的结构化原型为:

/** Represents an area of the screen.*/
typedef struct {
    lv_coord_t x1;
    lv_coord_t y1;
    lv_coord_t x2;
    lv_coord_t y2;
} lv_area_t;

这样我就可以得知他需要显示的区域是多少,使用LCD的设置坐标函数来设置他的显示区域即:

	lcd_set_address(startX, startY, endX, endY);

3、颜色参数信息是在lv_color_t * color_p 中传递过来的,我们找到他的原型如下:

image.png

他的颜色始为full这里。

常规的方法是,把full拆开两个8bit,然后再使用spi发送出去,由于我们的spi是可以一次传输16bit数据的,因此我们可以使用uint16_t来组织数据,并使用spi 的16bit方式来传递出去,这样速度就会大大的增加。

这个在我的另一篇帖子里【分享开发笔记,赚取电动螺丝刀】STM32F769驱动ST7789以及显示优化-电子产品世界论坛有详细的记录。

根据这样,我对代码进行了改进:

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    if(disp_flush_enabled) {
        /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

        // int32_t x;
        // int32_t y;
        // for(y = area->y1; y <= area->y2; y++) {
        //     for(x = area->x1; x <= area->x2; x++) {
        //         /*Put a pixel to the display. For example:*/
        //         /*put_px(x, y, *color_p)*/
        //         lcd_draw_point(x, y, color_p->full);
        //         color_p++;
        //     }
        // }
        uint32_t width = area->x2 - area->x1 + 1;
        uint32_t height = area->y2 - area->y1 + 1;
        uint32_t pixel_count = width * height;

        // 确保缓冲区足够大
        printf(" pixel_count = %ld\r\n", pixel_count);
        uint16_t *buffer = (uint16_t *)malloc(pixel_count);
        if (buffer == NULL)
        {
            free(buffer);
            printf("malloc failed\r\n");
            return;
        }
        // 将像素数据复制到缓冲区
        for (uint32_t i = 0; i < pixel_count; i++){
            buffer[i] = color_p[i].full;
        }

        lcd_draw_block(area->x1, area->y1, area->x2, area->y2, buffer, pixel_count);
        free(buffer);
    }
    
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

在最初,我对通过x、y的起始坐标,计算出这一次刷新数据的大小,并申请内存。然后对color数据进行组装,最后通过lcd_draw_block转发出去。

在lcd中,我组织函数代码如下:

void lcd_draw_block(uint16_t startX, uint16_t startY, uint16_t endX, uint16_t endY, uint16_t *color_buffer, uint32_t size)
{

	lcd_set_address(startX, startY, endX, endY);
	lcd_write_ram();
	lcd_write_data_dma(color_buffer, size*2);  //长度需要*2 不然dma写入不完整 
}

对应的lcd_write_data_dma原型如下:

void lcd_write_data_dma(uint16_t *data, uint16_t size)
{
	// 配置 SPI 为 16 位数据大小
	hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
	if (HAL_SPI_Init(&hspi2) != HAL_OK)
	{
		printf("SPI re-init failed for 16-bit mode\r\n");
		return;
	}
	LCD_CS(0);
	LCD_WR(1);
	// 使用 DMA 发送数据
	if (HAL_SPI_Transmit_DMA(&hspi2, (uint8_t *)data, size) != HAL_OK)
	{
		printf("DMA transmission failed\r\n");
	}
	// 等待DMA传输完成
	// while (HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY)
	// 	;
	while(spi2_dma_tx_flag == 0)
	   ;
	spi2_dma_tx_flag = 0;  //重置标志
	// 配置 SPI 为 8 位数据大小
	hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
	if (HAL_SPI_Init(&hspi2) != HAL_OK)
	{
		printf("SPI re-init failed for 8-bit mode\r\n");
	}
}

在这里,由先把数据传输的宽度修改为16bit,传送结束后,再换成8bit。

【总结】

通过上述代码的优化,提高了数据的传速速度,从而提高了刷新速度。




关键词: STM32F769LVGL     优化     显示    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
申是什么意思 安乐死是什么 吃什么补肺养肺比较好 药流用什么药 什么人容易得圆锥角膜
口羊读什么 肝阳上亢吃什么药 什么地摇动 晚上吃什么不会胖 什么叫胆固醇
辽源有什么好玩的地方 肾病到什么程度腿会肿 198什么意思 血糖和血脂有什么区别 地屈孕酮片什么时候吃
横纹肌溶解什么意思 碱性磷酸酶偏高吃什么能降下来呢 胰腺炎是什么原因引起的 菩提是什么 喝豆浆拉肚子什么原因
四十属什么hcv8jop8ns5r.cn 九一年属什么生肖hcv8jop0ns1r.cn 6月23号是什么星座bjcbxg.com 宫颈炎盆腔炎吃什么药效果最好hcv8jop7ns6r.cn 聂的拼音是什么hcv9jop3ns6r.cn
地面铺什么最环保hcv9jop7ns0r.cn 斩衰是什么意思hcv7jop9ns5r.cn 颈部彩超能检查出什么hcv8jop2ns1r.cn 后羿代表什么生肖hcv7jop6ns8r.cn 入职是什么意思hcv7jop4ns8r.cn
末次月经是什么意思hcv9jop7ns3r.cn 牛肉饺子馅配什么蔬菜hcv8jop3ns2r.cn 什么鲸鱼最大hcv9jop1ns3r.cn 黄芪什么功效hcv8jop4ns2r.cn 感同身受什么意思hcv9jop5ns9r.cn
回复1是什么意思xscnpatent.com 失眠多梦用什么药hcv8jop8ns9r.cn 炖牛肉放什么容易烂hcv9jop0ns4r.cn 蕨根粉是什么做的hcv9jop6ns4r.cn 正局级是什么级别hcv8jop2ns5r.cn
百度