2301_76906428 2024-06-02 21:39 采纳率: 0%
浏览 255
已结题

stm32 lvgl+DMA,屏幕显示不全有条纹

现象:

img


stm32f103zet6 使用hal库开发,普中玄武的板子
本来用画点的方法没有问题,但是刷新太慢,于是尝试用DMA传输,就遇到了这个问题。
lv_port_disp.c

static void disp_init(void)
{
    /*You code here*/
    TFTLCD_Init();
    HAL_DMA_RegisterCallback(
            &hdma_memtomem_dma1_channel1,
            HAL_DMA_XFER_CPLT_CB_ID,
            LVGL_LCD_FSMC_DMA_pCallback);//注册LVGL_LCD_FSMC_DMA_pCallback函数,用于通知DMA传输完成
}
static void disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
    if (disp_flush_enabled)
    {
        LCD_Address_Set(area->x1, area->y1, area->x2, area->y2);
        HAL_DMA_Start_IT(&hdma_memtomem_dma1_channel1, (uint32_t)color_p, (uint32_t)&(TFTLCD->LCD_DATA),
                                         ((area->x2 + 1) - area->x1) * ((area->y2 + 1) - area->y1));
    }
}
void LVGL_LCD_FSMC_DMA_pCallback(DMA_HandleTypeDef *_hdma)
{
    lv_disp_flush_ready(&disp_drv);
}
//TFT_LCD定义
typedef struct
{
    uint16_t LCD_CMD;
    uint16_t LCD_DATA;
} TFTLCD_TypeDef;

// 使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线
// 注意设置16位总线时STM32内部会右移一位对齐!
#define TFTLCD_BASE ((uint32_t)(0x6C000000 | 0x000007FE))
#define TFTLCD ((TFTLCD_TypeDef *)TFTLCD_BASE)

cubemx配置:

img


Data Width都试过了,按理说应该配置为Half word,但是显示却是这样的:

img


我放了一个方形的按钮部件在中间,设置为Byte勉强能看出来有个完整的按钮,设置为half word按钮直接裂开了(字面意思),如果改成word就什么都不显示了,我经过调试,y1,y2有在正常增加,没有跳过,也没看出来是不是DMA的问题,实在解决不了。

  • 写回答

22条回答 默认 最新

  • 关注
    获得0.45元问题酬金

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    从你提供的代码来看,问题可能出在以下几个方面:

    1. LCD地址设置不正确:在disp_flush函数中,你调用了LCD_Address_Set函数来设置LCD的地址,但是在代码中没有看到这个函数的定义和实现,所以存在地址设置不正确的可能性。你需要确保使用正确的地址来设置LCD的显示区域。

    2. DMA传输设置有误:在disp_flush函数中,你调用了HAL_DMA_Start_IT函数来启动DMA传输,但是传输的参数可能有问题。你需要确保传输的源地址和目的地址都是正确的,并且传输的数据宽度也需要正确设置。

    3. 数据位宽设置不正确:在TFT_LCD的定义中,你将LCD_CMD和LCD_DATA都定义为16位的变量,但是根据你的描述,显示效果并不正确。这可能是因为数据位宽设置不正确导致的。你可以尝试将数据位宽设置为正确的值,如8位或16位。

    解决方案:

    1. 确保LCD地址设置正确,可以参考LCD的规格书或者LCD驱动程序的示例代码来设置正确的显示区域。

    2. 检查DMA传输设置是否正确,确保传输的源地址和目的地址都是正确的,并且传输的数据宽度也需要正确设置。

    3. 确保数据位宽设置正确,根据LCD的规格书或者驱动程序的要求,将数据位宽设置为正确的值。

    4. 如果以上步骤都没有解决问题,可以尝试调试DMA传输相关的代码,查看传输过程中是否存在数据丢失或者地址设置错误的情况。

    注意:在做任何修改前,请先备份原始代码,以防修改后导致其他问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 创建了问题 6月2日

悬赏问题

  • ¥15 soildworks装配体的尺寸问题
  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑