• arm开发板裸板代码初始化lcd结构体为啥直接赋值不能运行。


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 目标:彩虹海! 2024-05-31 00:39 采纳率: 0% 浏览 5 首页/ 嵌入式 / arm开发板裸板代码初始化lcd结构体为啥直接赋值不能运行。 arm 学习arm开发板的LCD时,初始化lcd的参数结构体,连续赋值就不能运行,中间穿插几个延时就可以使用了,代码如下: delayms(1); tftlcd_dev.height = 600; tftlcd_dev.width = 1024; tftlcd_dev.vspw = 3; delayms(1); tftlcd_dev.vbpd = 20; tftlcd_dev.vfpd = 12; tftlcd_dev.hspw = 20; delayms(1); tftlcd_dev.hbpd = 140; delayms(1); tftlcd_dev.hfpd = 160; 源代码中没有延时函数,LCD就不能点亮,我初步定位至这里,定位时添加的printf函数,发现可以用了,就改成了延时函数,也可以正常运行。好奇这是为啥啊? 这部分不应该只是在赋值吗? 怎么会出问题呢? 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 阿里嘎多学长 2024-05-31 00:39
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      在ARM开发板裸机编程中,初始化LCD时需要考虑硬件的初始化过程和时序要求。通常,LCD控制器需要一定的时间来稳定和响应初始化设置。如果在初始化过程中没有给予足够的延时,可能会导致LCD控制器无法正确接收和处理初始化参数,从而导致LCD无法正常工作。

      以下是几个可能的原因,解释为什么在初始化LCD参数结构体时需要添加延时:

      1. 硬件时序要求:LCD控制器在接收到初始化参数后,需要一定的时间来处理这些参数并准备显示。如果参数连续赋值过快,LCD控制器可能无法在规定时间内完成初始化。

      2. 电源稳定:在LCD模块上电后,其内部电源可能需要一定的时间来稳定。如果立即进行初始化操作,可能会导致电源不稳定,影响LCD的正常工作。

      3. 时钟同步:在某些情况下,LCD控制器需要与系统时钟同步。如果初始化速度过快,可能会导致时钟同步失败。

      4. 调试信息的作用:你提到使用printf函数进行调试时,LCD能够正常工作。这可能是因为printf函数在输出调试信息时,间接地引入了延时,满足了LCD初始化的时序要求。

      5. 代码执行时间:在裸机编程中,代码的执行时间可能比预期的要长,特别是如果使用了复杂的计算或者调用了其他函数。这可能导致实际的延时比预期的要长,从而满足了LCD初始化的要求。

      为了解决这个问题,你可以:

      • 查阅LCD的数据手册:了解LCD的初始化时序要求,确保在初始化过程中满足这些要求。
      • 使用硬件调试工具:比如逻辑分析仪,来观察LCD控制器的信号,以确定是否所有的初始化参数都被正确接收和处理。
      • 逐步调试:通过逐步执行代码并观察LCD控制器的响应,来确定哪个参数或哪个延时是必要的。

      至于相关的代码实现和参考资料,这通常取决于你使用的LCD模块和开发板的具体型号。你可以查找开发板的官方文档和LCD模块的数据手册,这些文档通常会提供详细的初始化代码示例和时序要求。如果你能提供具体的型号信息,我可以帮助你查找更具体的资料。

      评论 编辑记录
      目标:彩虹海! 2024-05-31 00:53

      可是 这部分代码只是给结构体赋值,还没到将数据写入寄存器的那一步呀

      回复
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-31 00:39
      关注

      引自免费微信小程序:皆我百晓生

      看起来你在尝试配置一个基于 ARM 的开发板上的 TFT LCD 显示模块,并且通过一些延迟操作(delayms())来解决初始化问题。通常,在初始化 LCD 驱动时,我们需要确保特定的信号时序满足硬件的要求,尤其是像起始行、场同步等信号的时间长度。如果你的源代码中没有提供一个准确的延时函数,那么初始化过程可能无法按照正确的时序进行,导致 LCD 没有正确显示。

      TFT LCD 驱动的初始化通常包括设置屏幕尺寸、像素时钟以及其他关键参数。这些参数的设置本身不会影响 LCD 是否点亮,但它们是后续驱动程序正确工作所必需的。然而,如果没有适当的信号时序控制,即使你设置了正确的参数,也可能导致 LCD 不显示内容。

      在你的代码片段中,delayms() 函数似乎用于创建所需的时序间隔。这可能是由于某些信号需要在特定时间内保持高电平或低电平,而没有这个延时,这些信号可能会被过早地改变,从而破坏了 LCD 的初始化流程。

      为了修复这个问题,你需要实现一个准确的延时函数。下面是一个简单的延时函数的例子,它使用循环和系统滴答定时器来实现毫秒级的延时。请根据你的具体硬件平台调整 get_ticks_ms() 函数,它应该返回当前的系统时间(以毫秒为单位):

      #include 
      #include 
      
      // 获取当前系统时间(以毫秒为单位)
      unsigned long get_ticks_ms(void) {
          struct timespec ts;
          clock_gettime(CLOCK_MONOTONIC, &ts);
          return (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000);
      }
      
      // 延时函数
      void delayms(unsigned int ms) {
          unsigned long start_time = get_ticks_ms();
          while ((get_ticks_ms() - start_time) < ms);
      }
      

      然后,将你的初始化代码替换为使用上述 delayms() 函数的版本:

      // 添加包含延时函数的头文件
      #include "your_header_file.h"
      
      // ...
      
      // 初始化代码
      unsigned long start_time;
      
      start_time = get_ticks_ms();
      tftlcd_dev.height = 600;
      delayms(1); // 等待一段时间,允许信号稳定
      tftlcd_dev.width = 1024;
      delayms(1);
      
      tftlcd_dev.vspw = 3;
      delayms(1);
      tftlcd_dev.vbpd = 20;
      delayms(1);
      tftlcd_dev.vfpd = 12;
      delayms(1);
      
      tftlcd_dev.hspw = 20;
      delayms(1);
      tftlcd_dev.hbpd = 140;
      delayms(1);
      tftlcd_dev.hfpd = 160;
      delayms(1);
      
      // ... 其他必要的初始化代码
      
      // 确保所有延迟都完成后再继续执行其他代码
      while ((get_ticks_ms() - start_time) < 50); // 保证至少等待50ms
      

      这段代码会在每个参数赋值后插入一段延时,以确保信号有足够的稳定时间。同时,在整个初始化过程完成后,还额外等待了一段时间,以确保所有的延迟操作都已完成。这样做的目的是确保信号时序满足 LCD 控制器的要求。

      注意:这个解决方案依赖于你的系统有一个准确的滴答定时器。对于不同的操作系统和硬件平台,可能需要对 get_ticks_ms()delayms() 函数做出相应的修改。此外,你可能还需要检查 LCD 驱动的文档,了解确切的信号时序要求,以便精确调整延时时间。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Android音频——音量调节
    函数式接口 BiConsumer接口和Consumer接口
    git使用
    SAP UI5 FileUploader 控件实现本地文件上传,接收服务器端的响应时遇到跨域访问错误的试读版
    深度学习-矩阵计算
    第21章_瑞萨MCU零基础入门系列教程之事件链接控制器ELC
    应用大五人格测试,来做个人职业规划
    牛客刷SQL
    Java相关的序列化与反序列化
    Fe-safe/Isight/Tosca2022新功能
  • 原文地址:https://ask.csdn.net/questions/8111959