【NUCLEO-L552ZE测评】+驱动LCD19264显示屏
<div class='showpostmsg'><p> 为了方便的观察测试结果,我习惯使用LCD来显示,代码是从之前测试其他开发板移植过来的,按惯例只要修改引脚宏定义,然后调整一下时钟的延时就OK了,其他代码都是多次测试通过了的。可这次却遇到了一个奇怪的问题——调整延时丝毫不起作用,无论我如何修改延时的空循环次数,引脚的时序却一成不变。改换延时函数名称、改变延时函数的位置,各种方法都尝试过,依旧不能解决问题,最后只好用多个控制LED亮灭的代码才实现延时的目的。</p><p> 下面是我的延时函数:</p>
<pre>
<code class="language-cs">void Delay(uint8_t xms)
{
uint8_t x,y,z;
for(x=xms;x>0;x--){
for(y=200;y>0;y--){
for(z=200;z>0;z--);
}
}
// ;
}</code></pre>
<p> 在其他项目中只有两个循环,第二个循环一般在110之内,这次测试改成200次都无效果,再加一个循环也无济于事,甚至于我注释掉循环代码,时序毫无变化,就如同这行代码从未执行一样。下图为逻辑分析仪抓取的时序图,时钟高电平时间为0.625微秒,低电平时间为0.2917微秒,正常情况应该分别为5微秒。</p>
<p></p>
<p> 下图为注释掉延时代码行的时序图,竟然与上图毫无变化:</p>
<p></p>
<p> 下面是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<8;i++) //循环发送8位数据
{
if((dat&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<<=1; //左移一位 准备写入下一位
}
CS_1(); //写入完毕,取消片选
}</code></pre>
<p> LCD驱动虽然完成了,但这个延时函数无效的原因仍未找到,不知道其他坛友会不会也遇到类似问题。</p>
<p> 下面是通过操控LED达到延时目的后的时序图:</p>
<p></p>
<p> 下图为测试实验时的照片:</p>
<p></p>
<p> </p>
<p> 这是LCD显示的特定镜头:</p>
<p></p>
<p> </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> <p> 在项目代码的编译过程中还遇到汉字识别的警告提示,也许是项目属性中的字符集没有设置好的缘故,如下图:</p>
<p></p>
<p> 在代码中包含了汉字时也会报警:</p>
<p></p>
<p> 因不影响运行结果,所以我暂时忽略不管。</p>
<p> </p>
<p>会不会是延时被编译器优化了?</p>
w494143467 发表于 2020-12-19 15:25
会不会是延时被编译器优化了?
<p> 也许是吧,我使用HAL_Delay()测试延时就有效,但这个延时是以毫秒为单位,而我需要的是以微秒为单位。</p>
<p> 我曾经添加了一个wait_us()为函数名的延时代码,结果也无效。难道编译器优化是按照代码的实际运行效果进行优化的?</p>
hujj 发表于 2020-12-19 16:04
也许是吧,我使用HAL_Delay()测试延时就有效,但这个延时是以毫秒为单位,而我需要的是以 ...
<p>反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题,就会问“是不是开优化了”。</p>
<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&goto=findpost&pid=3031948&ptid=1152455" target="_blank"><font color="#999999">w494143467 发表于 2020-12-19 16:31</font></a></font> 反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题,就会问“是不是开优化了&rdquo ...</blockquote>
</div>
<p> 经测试,确实是优化的原因,原来默认的是3级,我改为0级测试,LCD刷新很慢,改为1级就比较正常。</p>
<p></p>
hujj 发表于 2020-12-19 17:00
w494143467 发表于 2020-12-19 16:31 反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题 ...
<p>找到问题了就好,这种事真的是经常看到,开优化虽然减少内存,但是会带来很多问题,之前还有指针的问题,都是因为开了优化的原因。</p>
<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]