367|7

1001

帖子

3

资源

纯净的硅(中级)

【NUCLEO-L552ZE测评】+驱动LCD19264显示屏 [复制链接]

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

    下面是我的延时函数:

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--);
		}
	}
//    ;
}

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

LCD19264_01.jpg

    下图为注释掉延时代码行的时序图,竟然与上图毫无变化:

LCD19264_03.jpg

    下面是LCD写数据的函数,最后是通过操控LED来达到延时效果:

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();                     //写入完毕,取消片选
}

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

    下面是通过操控LED达到延时目的后的时序图:

LCD19264_04.jpg

    下图为测试实验时的照片:

LCD19264_00.jpg

 

    这是LCD显示的特定镜头:

LCD19264_05.jpg

 

此帖出自stm32/stm8论坛

回复

1001

帖子

3

资源

纯净的硅(中级)

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

LCD19264_06.jpg

    在代码中包含了汉字时也会报警:

LCD19264_07.jpg

    因不影响运行结果,所以我暂时忽略不管。

 


回复

749

帖子

2

资源

版主

会不会是延时被编译器优化了?

点评

    也许是吧,我使用HAL_Delay()测试延时就有效,但这个延时是以毫秒为单位,而我需要的是以微秒为单位。     我曾经添加了一个wait_us()为函数名的延时代码,结果也无效。难道编译器优化是  详情 回复 发表于 2020-12-19 16:04

回复

1001

帖子

3

资源

纯净的硅(中级)

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

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

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

点评

反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题,就会问“是不是开优化了”。  详情 回复 发表于 2020-12-19 16:31

回复

749

帖子

2

资源

版主

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

反正我基本都是把优化调成0,因为优化踩了太多坑,每次有同事有问题,就会问“是不是开优化了”。

点评

    经测试,确实是优化的原因,原来默认的是3级,我改为0级测试,LCD刷新很慢,改为1级就比较正常。  详情 回复 发表于 2020-12-19 17:00

回复

1001

帖子

3

资源

纯净的硅(中级)

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

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

options_01.jpg

点评

找到问题了就好,这种事真的是经常看到,开优化虽然减少内存,但是会带来很多问题,之前还有指针的问题,都是因为开了优化的原因。  详情 回复 发表于 2020-12-19 19:38

回复

749

帖子

2

资源

版主

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

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


回复

1万

帖子

133

资源

管理员

个人签名

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/4 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表