OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12834|回复: 12

LCD快速刷屏与正常刷屏的疑惑(库函数版)

[复制链接]

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2011-10-1
在线时间
0 小时
发表于 2012-2-21 15:11:59 | 显示全部楼层 |阅读模式

在调试LCD屏时发现,如此定义数据端

#define LCD_LED_SET  GPIO_SetBits(GPIOC,GPIO_Pin_10)
#define LCD_CS_SET  GPIO_SetBits(GPIOC,GPIO_Pin_9)    //片选端口        PC9
#define LCD_RS_SET GPIO_SetBits(GPIOC,GPIO_Pin_8)    //数据/命令          PC8   
#define LCD_WR_SET GPIO_SetBits(GPIOC,GPIO_Pin_7)    //写数据    PC7
#define LCD_RD_SET GPIO_SetBits(GPIOC,GPIO_Pin_6)    //读数据    PC6

的刷屏速度较慢;而参考原子大哥的例程后,这样定义

#define LCD_LED_SET  GPIOC->BSRR=1<<10
#define LCD_CS_SET  GPIOC->BSRR=1<<9    //片选端口        PC9
#define LCD_RS_SET GPIOC->BSRR=1<<8    //数据/命令          PC8   
#define LCD_WR_SET GPIOC->BSRR=1<<7    //写数据    PC7
#define LCD_RD_SET GPIOC->BSRR=1<<6  //读数据    PC6

刷屏速度提高一倍;

问题是:

1.第二种为什么会比第一种方式快一倍?难道是第二种直接操作寄存器的缘故?

2.在主函数里,我用了个一般的延时函数

void Delay_ms(u32 z) //延时1ms
{
 u32 x,y;
 for(x=z;x>0;x--)
  for(y=7000;y>0;y--);
}

为什么用 快速刷屏 的方式会导致延时函数的延时时间缩短一半?

望原子大哥及大侠们指教。。。。

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-2-21 16:33:36 | 显示全部楼层
回复【楼主位】一世的约定:
---------------------------------
1,看寄存器版本的代码.ST有个快速设置IO的寄存器叫BSRR之类的.你自己看数据手册.
2,不是延时函数变了,而是IO口切换速度变了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2011-10-1
在线时间
0 小时
 楼主| 发表于 2012-2-21 16:41:50 | 显示全部楼层
IO口的切换速度会影响延时函数?延时函数不是跟单片机运算速度有关吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-2-21 17:57:03 | 显示全部楼层
回复【3楼】一世的约定:
---------------------------------
IO切换速度就像指令执行周期.比如我直接设置ODR,需要4个指令周期.
而通过BSRR设置,只需要2个.
那么很明显,你频繁的调用BSRR会产生大概2倍于设置ODR的效果.
和你延时函数无关系.
当然如果你的延时很长,尝到可以忽略BSRR和ODR设置的差别,那么你的延时函数就占主导地位了.

自己好好想想吧!!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2011-11-9
在线时间
0 小时
发表于 2012-2-22 00:56:01 | 显示全部楼层
你可以在库函数里边看到,GPIO_SetBits 就等于   GPIOx->BSRR = GPIO_Pin;
慢主要是因为函数调用开销,像这种很短的函数,你可以直接用 inline, 直接插入代码内,对代码的大小影响不大,而且速度快,不过 inline 和编译器有关,所以最保险的是用 #define 。
www.armrunc.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-2-22 08:48:08 | 显示全部楼层
有理.频繁的函数调用也是消耗时间的大户.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2011-10-1
在线时间
0 小时
 楼主| 发表于 2012-2-22 11:34:31 | 显示全部楼层
刷屏快慢的问题我知道了,还有个问题是在主函数中有个LED闪烁的功能,配置的延时函数的延时时间会因刷屏方式而变化,
void Delay_ms(u32 z) //延时1ms
 {
  u32 x,y;
  for(x=z;x>0;x--)
   for(y=7000;y>0;y--);
 }
快速IO口刷屏 的方式会导致延时函数的延时时间缩短一半,即LED的闪烁频率提高一倍,延时函数不是跟单片机运算速度有关嘛,为什么这里也会影响到,还不是很明白。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-2-22 11:57:40 | 显示全部楼层
回复【7楼】一世的约定:
---------------------------------
他们都在一个大循环里面.
肯定受影响了.
难道你用了OS?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2011-10-1
在线时间
0 小时
 楼主| 发表于 2012-2-22 12:57:16 | 显示全部楼层
没啊,我好好想想去吧。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-2-28 22:16:21 | 显示全部楼层
回复【10楼】zgzzlt:
---------------------------------
库函数我有readme.txt....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2011-11-12
在线时间
0 小时
发表于 2012-4-1 14:12:44 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
#define DATAOUT(x) GPIOB->ODR=x; //数据输出
#define DATAIN         GPIOB->IDR    //数据输入



#define DATAOUT(x)  {GPIO_Write(GPIOB,x);}
#define DATAIN               {GPIO_ReadInputData(GPIOB);}

为什么上面两句换成下面两句整个程序就跑飞了?  原子能不能给解释一下呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-4-1 16:35:20 | 显示全部楼层
我也不知道哦.呵呵.
你跟踪一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-9-8
在线时间
39 小时
发表于 2016-9-27 18:24:41 | 显示全部楼层
最近也在研究刷屏问题,感觉STM32刷屏确实很慢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 20:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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