解决 stm32 fsmc lvgl v8局部刷新显示扭曲的问题

1)使用设备

  • stm32f407zgt6,fsmc模拟8080

2)问题描述

  • 如图,显示扭曲错乱

  • 采用一个个打点的刷新方式可以正常显示,但是刷屏速度太慢

3)最终解决方法

  1. 初始状态(卖家资料给的局部刷新函数,是实测可以正常刷新图片,但是lvgl刷新不正常)

  1. 改为

void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
{  
    u16 height,width;
    u16 i,j;
    width=ex-sx+1;                 //得到图片的宽度
    height=ey-sy+1;                //得到图片的高度
    Lcd_SetRegion(sx,sy,ex,ey);
    LCD_WriteGRAM();        //开始写入GRAM
     for(i=0;i<height;i++)
    {
//         LCD_SetCursor(sx,sy+i); //设置光标位置 
//        LCD_WriteGRAM();        //开始写入GRAM
        for(j=0;j<width;j++)
        {//           LCD_DATA=color[i*height+j];//写入颜色值
            LCD_DATA=*color;//写入颜色值
            color++;
        }

    }      
} 
  1. 添加函数 void Lcd_SetRegion(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end)

void Lcd_SetRegion(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end)
{
            LCD_CMD=setxcmd; 
            LCD_DATA=(x_start>>8); 
            LCD_DATA=(x_start&0XFF);     
                LCD_DATA=(x_end>>8); 
            LCD_DATA=(x_end&0XFF);    
            LCD_CMD=setycmd; 
            LCD_DATA=(y_start>>8); 
            LCD_DATA=(y_start&0XFF);
                LCD_DATA=(y_end>>8); 
            LCD_DATA=(y_end&0XFF);

}
  1. lvgl显示接口

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*/
    LCD_Draw_Picture(area->x1,area->y1,area->x2,area->y2,(u16*)color_p);
    
//        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:*/
//               LCD_Color_DrawPoint(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);
}
  1. 效果

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32 FSMC(Flexible Static Memory Controller)是STM32系列微控制器中的一个外设,它允许STM32与各种静态存储器进行数据交换。FSMC可以通过引脚连接SRAM、ROM、PSRAM、Nor Flash和Nand Flash等存储器。 在STM32F407或STM32F417系列芯片中,都带有FSMC接口。 要配置FSMC,具体的步骤和特性如下所示: 1. 配置FSMC引脚:根据具体的STM32型号和外部存储器的类型,选择合适的引脚进行连接,并将这些引脚设置为FSMC模式。 2. 配置FSMC控制器:设置FSMC控制器的控制寄存器来配置存储器类型、数据宽度、时序等参数。 3. 配置存储器:根据外部存储器的要求,设置相应的存储器控制寄存器来配置存储器的时序和操作模式。 4. 初始化FSMC:根据存储器的特性和需求,编写初始化函数来设置FSMC控制器和存储器的寄存器值,以确保正确的数据交换和访问。 FSMC的特点包括: - 灵活性:通过FSMCSTM32可以连接多种静态存储器,包括SRAM、ROM、PSRAM、Nor Flash和Nand Flash等。 - 高速数据交换:FSMC支持高速数据交换,可以实现快速的存储器读写操作。 - 多种操作模式:FSMC支持多种操作模式,包括异步模式和同步模式,以适应不同的存储器需求。 - 强大的时序配置:FSMC可以根据存储器的要求,灵活配置时序参数,以实现最佳的数据传输性能。 总之,STM32 FSMC是一种强大的外设,可以实现STM32与各种静态存储器之间的数据交换。通过配置FSMC引脚和控制器,并初始化FSMC,可以实现高速、灵活的存储器访问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32 FSMC/FMC原理保姆级讲解(一)](https://blog.csdn.net/as480133937/article/details/123740365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【STM32FSMC概述](https://blog.csdn.net/dengjin20104042056/article/details/108449814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值