用STM32F429编程,其中需要每0.2秒或0.5秒(用DMA2D)显示一次ADC数据(数字和字符),此时屏幕发生不规则的抖动,长时间看屏幕眼睛非常不舒服。
请有经验人士指教,最好有例程,谢谢
STM32 LCD屏幕抖动
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-02-29 16:58关注
weixin_58085011 下午好🌅🌅🌅
本答案参考通义千问问题: STM32 LCD屏幕发生抖动,如何解决?
原因:
- DMA2D更新频率过高:当你使用DMA2D每0.2秒或0.5秒更新一次LCD时,如果刷新率超过了LCD的刷新极限,可能会导致屏幕抖动。
- 时序控制问题:LCD接口的信号传输可能没有正确同步,特别是在高速更新时,可能导致显示不稳定。
- 硬件冲突:其他外设或中断可能影响了LCD的数据传输。
解决方案:
-
调整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);
-
优化时序:
- 确保LCD驱动程序正确配置,包括信号延迟和等待时间。
- 使用LCD库提供的函数来设置刷新频率,避免手动操作。
-
检查硬件冲突:
- 关闭不必要的中断或外设,确保LCD数据传输不会被中断。
- 在代码中添加适当的延时,确保DMA操作完成后才进行下一次数据更新。
-
使用中断管理:
- 如果可能,考虑使用中断来触发LCD更新,而不是持续不断地使用DMA。
-
增加缓冲区:
- 为显示数据创建一个缓冲区,减少频繁的数据传输,减小抖动。
-
检查电源稳定性:
- 确保供电稳定,电源纹波过大也可能导致显示问题。
注意: 以上代码片段仅供参考,具体实现可能需要根据你的硬件和库文件进行调整。建议在开发板上逐步调试,观察和测试LCD的刷新效果,找出问题根源。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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跨节点无法访问问题