hujj 发表于 2020-12-19 14:38

【NUCLEO-L552ZE测评】+驱动LCD19264显示屏

<div class='showpostmsg'><p>&nbsp; &nbsp; 为了方便的观察测试结果,我习惯使用LCD来显示,代码是从之前测试其他开发板移植过来的,按惯例只要修改引脚宏定义,然后调整一下时钟的延时就OK了,其他代码都是多次测试通过了的。可这次却遇到了一个奇怪的问题&mdash;&mdash;调整延时丝毫不起作用,无论我如何修改延时的空循环次数,引脚的时序却一成不变。改换延时函数名称、改变延时函数的位置,各种方法都尝试过,依旧不能解决问题,最后只好用多个控制LED亮灭的代码才实现延时的目的。</p>

<p>&nbsp; &nbsp; 下面是我的延时函数:</p>

<pre>
<code class="language-cs">void Delay(uint8_t xms)
{
    uint8_t x,y,z;
    for(x=xms;x&gt;0;x--){
      for(y=200;y&gt;0;y--){
                        for(z=200;z&gt;0;z--);
                }
        }
//    ;
}</code></pre>

<p>&nbsp; &nbsp; 在其他项目中只有两个循环,第二个循环一般在110之内,这次测试改成200次都无效果,再加一个循环也无济于事,甚至于我注释掉循环代码,时序毫无变化,就如同这行代码从未执行一样。下图为逻辑分析仪抓取的时序图,时钟高电平时间为0.625微秒,低电平时间为0.2917微秒,正常情况应该分别为5微秒。</p>

<p></p>

<p>&nbsp; &nbsp; 下图为注释掉延时代码行的时序图,竟然与上图毫无变化:</p>

<p></p>

<p>&nbsp; &nbsp; 下面是LCD写数据的函数,最后是通过操控LED来达到延时效果:</p>

<pre>
<code class="language-cs">void WriteData(unsigned char data, unsigned char C)
{
    unsigned char i,dat;      //i用于循环写入8位数据,dat用于缓存数据
    CS_0();                     //使能片选
    if(C==1)                  //判断要写入的是指令还是数据
    {
      CD_1();               //等于1 就是数据
    }
    else
    {
      CD_0();               //等于0 就是指令
    }
    dat=data;                   //缓存数据
    for(i=0;i&lt;8;i++)            //循环发送8位数据
    {
      if((dat&amp;0x80)==0x80)    //判断最高位是否为1
      {
            SDT_1();            //为1 拉高总线写入1
      }
      else
      {
            SDT_0();            //为0 拉低总线写入0
                }
      SCK_0();                //产生一个时钟
//      Delay(5);
                LED_On(1);
                LED_Off(1);
                LED_On(1);
                LED_Off(1);
                LED_Toggle(1);
                LED_On(1);
                LED_Off(1);
               
      SCK_1();                //时钟结束
//      Delay(8);
                LED_On(1);
                LED_Off(1);
                LED_On(1);
                LED_Toggle(1);
                LED_On(1);
                LED_Off(1);
               
      dat&lt;&lt;=1;                //左移一位 准备写入下一位
    }
    CS_1();                     //写入完毕,取消片选
}</code></pre>

<p>&nbsp; &nbsp; LCD驱动虽然完成了,但这个延时函数无效的原因仍未找到,不知道其他坛友会不会也遇到类似问题。</p>

<p>&nbsp; &nbsp; 下面是通过操控LED达到延时目的后的时序图:</p>

<p></p>

<p>&nbsp; &nbsp; 下图为测试实验时的照片:</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; 这是LCD显示的特定镜头:</p>

<p></p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

hujj 发表于 2020-12-19 15:14

<p>&nbsp; &nbsp; 在项目代码的编译过程中还遇到汉字识别的警告提示,也许是项目属性中的字符集没有设置好的缘故,如下图:</p>

<p></p>

<p>&nbsp; &nbsp; 在代码中包含了汉字时也会报警:</p>

<p></p>

<p>&nbsp; &nbsp; 因不影响运行结果,所以我暂时忽略不管。</p>

<p>&nbsp;</p>

w494143467 发表于 2020-12-19 15:25

<p>会不会是延时被编译器优化了?</p>

hujj 发表于 2020-12-19 16:04

w494143467 发表于 2020-12-19 15:25
会不会是延时被编译器优化了?

<p>&nbsp; &nbsp; 也许是吧,我使用HAL_Delay()测试延时就有效,但这个延时是以毫秒为单位,而我需要的是以微秒为单位。</p>

<p>&nbsp; &nbsp; 我曾经添加了一个wait_us()为函数名的延时代码,结果也无效。难道编译器优化是按照代码的实际运行效果进行优化的?</p>

w494143467 发表于 2020-12-19 16:31

hujj 发表于 2020-12-19 16:04
&nbsp; &nbsp; 也许是吧,我使用HAL_Delay()测试延时就有效,但这个延时是以毫秒为单位,而我需要的是以 ...

<p>反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题,就会问&ldquo;是不是开优化了&rdquo;。</p>

hujj 发表于 2020-12-19 17:00

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3031948&amp;ptid=1152455" target="_blank"><font color="#999999">w494143467 发表于 2020-12-19 16:31</font></a></font> 反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题,就会问&ldquo;是不是开优化了&amp;rdquo ...</blockquote>
</div>

<p>&nbsp; &nbsp; 经测试,确实是优化的原因,原来默认的是3级,我改为0级测试,LCD刷新很慢,改为1级就比较正常。</p>

<p></p>

w494143467 发表于 2020-12-19 19:38

hujj 发表于 2020-12-19 17:00
w494143467 发表于 2020-12-19 16:31 反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题 ...

<p>找到问题了就好,这种事真的是经常看到,开优化虽然减少内存,但是会带来很多问题,之前还有指针的问题,都是因为开了优化的原因。</p>

okhxyyo 发表于 2020-12-21 14:45

<p><strong><a href="https://bbs.eeworld.com.cn/elecplay/content/153" target="_blank">ST新品NUCLEO-L552ZE-Q(Cortex-M33)</a></strong></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1152571-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1152571-1-1.html</a></p>
页: [1]
查看完整版本: 【NUCLEO-L552ZE测评】+驱动LCD19264显示屏