一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 6018|回复: 22
收起左侧

[STM8/STM32] 发现STM32 库开发比寄存器开发效率也差太多了吧

[复制链接]
发表于 2015-5-31 12:28 | 显示全部楼层 |阅读模式
这几天无聊翻出以前的无控制器单色320240,用STM32驱动着玩玩!之前的帖子https://www.yleee.com.cn/thread-17775-1-1.html
最近买了个逻辑分析仪,并优化了刷屏的代码!因为这种屏是无控制器的四位数据接口!所以使用GPIO模拟时序驱动!发现在使用同样的程序在使用库开发和寄存器开发效率相差近3倍



                while(1)
                {       
                        GPIOA->BSRR=0X00000100;     //帧起始信号=1
                        GPIOA->BSRR=0X00000004;   //行锁存=1
                        GPIOA->BSRR=0X00040000; //行锁存=0       
                        GPIOA->BSRR=0X01000000;   //帧起始信号=0
                        if(GPIOA->ODR&0x0008) GPIOA->BSRR=0X00080000;     //驱动波形的极性转换=0
                                                else         GPIOA->BSRR=0X00000008;//驱动波形的极性转换=1
                        for(ua2=0;ua2<240;ua2++)
                        {
                                        uc1=ua2*40;
                                        for(ua1=0;ua1<40;ua1++)
                                        {
                                                 GPIOA->BSRR=0X00000800;                                  //移位时钟==1
                                                 GPIOC->ODR=display[uc1+ua1];                //八位显示数据四位并行输出的低四位
                                                 GPIOA->BSRR=0X08000000;                                  //移位时钟==0
                                                 GPIOA->BSRR=0X00000800;                                  //移位时钟==1
                                                 GPIOC->ODR=display[uc1+ua1]>>4;                 //八位显示数据四位并行输出的高四位
                                                 GPIOA->BSRR=0X08000000;                                  //移位时钟==0
                                        }
                                        GPIOA->BSRR=0X00000004;                                          //行锁存=1
                                        GPIOA->BSRR=0X00040000;                                   //行锁存=0
                        }
                }


编译后  Program Size: Code=944 RO-data=336 RW-data=9608 ZI-data=1024
1.JPG


上面这个是使用操作寄存器写代码!CPU 72M全速 刷屏速度:165.44764帧/秒


          while(1)
          {       

                        GPIO_SetBits(LCD_DATA_A,LCD_FLM);     //帧起始信号=1
                        GPIO_SetBits(LCD_DATA_A,LCD_LOCLK);   //行锁存=1
                        GPIO_ResetBits(LCD_DATA_A,LCD_LOCLK); //行锁存=0
                        GPIO_ResetBits(LCD_DATA_A,LCD_FLM);   //帧起始信号=0
                        if(GPIO_ReadOutputDataBit(LCD_DATA_A,LCD_M)) GPIO_ResetBits(LCD_DATA_A,LCD_M);     //驱动波形的极性转换=0
                                else         GPIO_SetBits(LCD_DATA_A,LCD_M);//驱动波形的极性转换=1
                       
                        for(ua2=0;ua2<240;ua2++)
                        {
                                uc1=ua2*40;
                                for(ua1=0;ua1<40;ua1++)
                                {
                                         GPIO_SetBits(LCD_DATA_A,LCD_SHCLK);                      //移位时钟==1
                                         GPIO_Write(LCD_DATA_C,display[uc1+ua1]);    //八位显示数据四位并行输出的低四位
                                         GPIO_ResetBits(LCD_DATA_A,LCD_SHCLK);                    //移位时钟==0
                                         GPIO_SetBits(LCD_DATA_A,LCD_SHCLK);                      //移位时钟==1
                                         GPIO_Write(LCD_DATA_C,display[uc1+ua1]>>4);     //八位显示数据四位并行输出的高四位
                                         GPIO_ResetBits(LCD_DATA_A,LCD_SHCLK);                    //移位时钟==0
                                }
                                GPIO_SetBits(LCD_DATA_A,LCD_LOCLK);                              //行锁存=1
                                GPIO_ResetBits(LCD_DATA_A,LCD_LOCLK);                     //行锁存=0
                        }
          }



编译后:Program Size: Code=884 RO-data=336 RW-data=9608 ZI-data=1024


2.JPG


以上这个是使用的库操作 CPU 72M全速 刷屏速度:59.754856帧/秒


一模一样的程序!只是数据的操作一个使用库一个直接操作寄存器!结果差了近3倍!结果太令人失望了!真不明白库操作除了方便使用简单还有啥好处!特别是一些高速应用的场合极其不适用太慢了在要不然考虑DMA,后面考虑使用DMA刷屏,空出时间做别的
有兴趣的可以看看源程序 320240.txt (52.38 KB, 下载次数: 4, 售价: 1 人民币)
发表于 2015-5-31 12:39 | 显示全部楼层
使用库本来就是为了简单,降低开发入门难度
资源够用,速度就不是问题,
至少大家现在是这么认为的
发表于 2015-5-31 12:41 | 显示全部楼层
可以试试FSMC,这样就不用程序刷了
发表于 2015-5-31 12:46 | 显示全部楼层
用库把优化等级设置成2,把optimize for time勾上,速度就上来了
发表于 2015-5-31 13:07 | 显示全部楼层
技术不错
 楼主| 发表于 2015-5-31 13:08 | 显示全部楼层
wm20031015 发表于 2015-5-31 12:46
用库把优化等级设置成2,把optimize for time勾上,速度就上来了

试了下!只有66帧/秒,木有效果啊
 楼主| 发表于 2015-5-31 13:11 | 显示全部楼层
jigsaw 发表于 2015-5-31 12:41
可以试试FSMC,这样就不用程序刷了

FSMC不支持4位数据传输啊,而且驱动的时序也完全不一样!这个320240是无控制器的,FSMC只适合静态存储器类型的外设 如SRAM,LCD
发表于 2015-5-31 13:24 | 显示全部楼层
不错
发表于 2015-5-31 13:47 | 显示全部楼层
看过gpio的操作代码,库里面加了很多断言,每次都会读取+比较,自然会慢很多
发表于 2015-5-31 15:18 | 显示全部楼层
可以库+寄存器一起使用,拿捏好开发难度跟程序效率的点

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-11 14:21 , Processed in 0.052236 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表