打印
[STM32F1]

为什么F1跑GUI_Init();这个函数需要很长时间。

[复制链接]
786|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
19996|  楼主 | 2019-11-13 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前我使用STM32F103跑UCOSIII和STEMWIN的库,但是在执行这个函数GUI_Init();的时候特别耗时间,需要近3S。然后我程序创建任务和初始化就花了接近1S,然后创建第一个界面花了近1S。也就是说整个程序花了5S的时间启动,有谁知道什么方法可以缩减时间的吗?

特别是GUI_Init();这个函数,有谁知道怎么缩短运行时间吗?

有谁知道的,请告知一下,有点儿急,困扰了我好几天了

使用特权

评论回复
沙发
yklstudent| | 2019-11-13 22:47 | 只看该作者
跟你的屏底层驱动有关系吧,检查下看看

使用特权

评论回复
板凳
19996|  楼主 | 2019-11-14 10:09 | 只看该作者
yklstudent 发表于 2019-11-13 22:47
跟你的屏底层驱动有关系吧,检查下看看

ST7789V的驱动,然后使用的FSMC的方式。这个是一个Lib文件,咋搞?能说详细一点儿吗?非常感谢

使用特权

评论回复
地板
yklstudent| | 2019-11-14 11:01 | 只看该作者
19996 发表于 2019-11-14 10:09
ST7789V的驱动,然后使用的FSMC的方式。这个是一个Lib文件,咋搞?能说详细一点儿吗?非常感谢
...

屏的驱动不是开放用户自己写的嘛
你检查你自己的屏初始化代码

使用特权

评论回复
5
19996|  楼主 | 2019-11-14 12:54 | 只看该作者
yklstudent 发表于 2019-11-14 11:01
屏的驱动不是开放用户自己写的嘛
你检查你自己的屏初始化代码

可是屏的初始化程序跑完只需要很短的时间,我测试了一下,就这句花的时间比较多。
//////////////////////////////
CMD->LCD_REG=(0x11);

Delayms(120);       
CMD->LCD_REG=(0x36);  
DATA->LCD_RAM=(0x00); //设置坐标原点,RGB顺序(0x08:BGR)
       
CMD->LCD_REG=(0x3A);
DATA->LCD_RAM=(0x55); // 18bit  /16bit 55
       
CMD->LCD_REG=(0xB2);  
DATA->LCD_RAM=(0x0C);
DATA->LCD_RAM=(0x0C);
DATA->LCD_RAM=(0X00);
DATA->LCD_RAM=(0x33);
DATA->LCD_RAM=(0X33);

CMD->LCD_REG=(0xB7);  // VGH and VGL setting
DATA->LCD_RAM=(0x75);

CMD->LCD_REG=(0xBB);  //VCOMS setting
DATA->LCD_RAM=(0x2C);

CMD->LCD_REG=(0xC0);  
DATA->LCD_RAM=(0x2C);

CMD->LCD_REG=(0xC2);  
DATA->LCD_RAM=(0x01);
DATA->LCD_RAM=(0xFF);

CMD->LCD_REG=(0xC3);  //GVDD, GVCL setting
DATA->LCD_RAM=(0x20);

CMD->LCD_REG=(0xC4);  
DATA->LCD_RAM=(0x20);

CMD->LCD_REG=(0xC6);  
DATA->LCD_RAM=(0x0F);

CMD->LCD_REG=(0xD0);  
DATA->LCD_RAM=(0xA4);
DATA->LCD_RAM=(0xA1);

CMD->LCD_REG=(0xE0);    //Set Gamma
DATA->LCD_RAM=(0xD0);
DATA->LCD_RAM=(0x16);
DATA->LCD_RAM=(0x1B);
DATA->LCD_RAM=(0x0B);
DATA->LCD_RAM=(0x0B);
DATA->LCD_RAM=(0x26);
DATA->LCD_RAM=(0x3C);
DATA->LCD_RAM=(0x43);
DATA->LCD_RAM=(0x4F);
DATA->LCD_RAM=(0x28);
DATA->LCD_RAM=(0x13);
DATA->LCD_RAM=(0x13);
DATA->LCD_RAM=(0x2E);
DATA->LCD_RAM=(0x33);

CMD->LCD_REG=(0xE1);    //Set Gamma
DATA->LCD_RAM=(0xD0);
DATA->LCD_RAM=(0x16);
DATA->LCD_RAM=(0x1B);
DATA->LCD_RAM=(0x0B);
DATA->LCD_RAM=(0x0A);
DATA->LCD_RAM=(0x26);
DATA->LCD_RAM=(0x3B);
DATA->LCD_RAM=(0x44);
DATA->LCD_RAM=(0x4E);
DATA->LCD_RAM=(0x27);
DATA->LCD_RAM=(0x13);
DATA->LCD_RAM=(0x12);
DATA->LCD_RAM=(0x2E);
DATA->LCD_RAM=(0x33);


上面就是初始化的指令。

          FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //指定使用的内存库
          FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//指定地址和数据线是否多路复用
          FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;//链接到内存库的外部内存的类型
          FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //外部存储设备位宽
          FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//禁止突发访问模式
          FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//指定等待信号极性
          FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;//禁止打包突发访问模式
               
                //指定等待信号由内存的断言时间(在等待状态前一个时钟周期)
          FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
               
          FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//打开SMC的写操作
          FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; //禁用等待状态插入
          FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //禁用扩展模式
          FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;//异步期间禁用等待信号
          FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;//禁用突发操作
          FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
          FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

          FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  
          FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);

这个有什么问题吗?

使用特权

评论回复
6
19996|  楼主 | 2019-11-14 12:55 | 只看该作者
yklstudent 发表于 2019-11-14 11:01
屏的驱动不是开放用户自己写的嘛
你检查你自己的屏初始化代码

这个和驱动的关系,我不太明白,您能详细说明一下吗?

使用特权

评论回复
7
yklstudent| | 2019-11-14 13:26 | 只看该作者
也许跟Delayms(120);   这句有关系,你可以确认下

使用特权

评论回复
8
19996|  楼主 | 2019-11-14 14:35 | 只看该作者
yklstudent 发表于 2019-11-14 13:26
也许跟Delayms(120);   这句有关系,你可以确认下

这个没确认过,我试试。谢谢您

使用特权

评论回复
9
木木guainv| | 2019-12-9 16:52 | 只看该作者
长知识了 谢谢

使用特权

评论回复
10
晓伍| | 2019-12-9 16:56 | 只看该作者
楼主最后找到问题了吗

使用特权

评论回复
11
huangcunxiake| | 2019-12-9 17:46 | 只看该作者
底层里面不要用delay这种玩意儿。

使用特权

评论回复
12
huangcunxiake| | 2019-12-9 17:47 | 只看该作者
你可以用while判断某个调试是否成立,比如某个标志位是否完成设置或者置位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

139

帖子

0

粉丝