weixin_58085011 2024-02-29 16:57 采纳率: 75%
浏览 41
已结题

STM32 LCD屏幕抖动

用STM32F429编程,其中需要每0.2秒或0.5秒(用DMA2D)显示一次ADC数据(数字和字符),此时屏幕发生不规则的抖动,长时间看屏幕眼睛非常不舒服。
请有经验人士指教,最好有例程,谢谢

  • 写回答

4条回答 默认 最新

  • 关注

    weixin_58085011 下午好🌅🌅🌅
    本答案参考通义千问

    问题: STM32 LCD屏幕发生抖动,如何解决?

    原因:

    1. DMA2D更新频率过高:当你使用DMA2D每0.2秒或0.5秒更新一次LCD时,如果刷新率超过了LCD的刷新极限,可能会导致屏幕抖动。
    2. 时序控制问题:LCD接口的信号传输可能没有正确同步,特别是在高速更新时,可能导致显示不稳定。
    3. 硬件冲突:其他外设或中断可能影响了LCD的数据传输。

    解决方案:

    1. 调整DMA2D周期

      • 降低DMA2D的更新频率,例如将0.2秒改为1秒,以降低对LCD的压力。
      DMA_HandleTypeDef hdma2d1;
      hdma2d1.Init.PeriphInc = DMA_PERIPHINC_DISABLE; // 不增加外设地址
      hdma2d1.Init.MemInc = DMA_MEMINC_ENABLE; // 增加内存地址
      hdma2d1.Init.Mode = DMA_NORMAL; // 普通模式
      hdma2d1.Init.Priority = DMA_PRIORITY_HIGH; // 高优先级
      hdma2d1.Init.Direction = DMA_MEMORY_TO_PERIPH; // 内存到外设
      hdma2d1.Init.Channel = DMA_CHANNEL_1; // DMA1通道1
      hdma2d1.Init.Request = DMA_REQUEST_ADC1; // DMA请求来自ADC1
      hdma2d1.Instance = DMA2D1; // DMA2D1实例
      
      HAL_DMA_Init(&hdma2d1);
      
    2. 优化时序

      • 确保LCD驱动程序正确配置,包括信号延迟和等待时间。
      • 使用LCD库提供的函数来设置刷新频率,避免手动操作。
    3. 检查硬件冲突

      • 关闭不必要的中断或外设,确保LCD数据传输不会被中断。
      • 在代码中添加适当的延时,确保DMA操作完成后才进行下一次数据更新。
    4. 使用中断管理

      • 如果可能,考虑使用中断来触发LCD更新,而不是持续不断地使用DMA。
    5. 增加缓冲区

      • 为显示数据创建一个缓冲区,减少频繁的数据传输,减小抖动。
    6. 检查电源稳定性

      • 确保供电稳定,电源纹波过大也可能导致显示问题。

    注意: 以上代码片段仅供参考,具体实现可能需要根据你的硬件和库文件进行调整。建议在开发板上逐步调试,观察和测试LCD的刷新效果,找出问题根源。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 2月29日

悬赏问题

  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题