Discuz! REAL TIME TECHNOLOGY

 找回密码
 立即注册
楼主: ahwwq
打印 上一主题 下一主题

STM32F207单片机时钟

[复制链接]

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

11#
发表于 2013-5-21 15:49:55 |只看该作者
Wjianw 发表于 2013-5-20 10:50
STM32 GPIO 置位 复位 功能实现  

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


在STM32F207中尝试使用这种方法,无法编译成功(开发板提供的文件缺少且目录结构和官方描述有差),但是通过阅读源代码,调用下面的函数:
GPIO_SetBits( GPIOD, GPIO_Pin_13);函数内部是 GPIOx->BSRRH = GPIO_Pin_13;
而GPIO_Pin_13定义为0x2000.
所以本质上是一样的。
如下图所示:


这个文件时STM32F2XX系列的标准库文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

12#
发表于 2013-5-24 00:02:46 |只看该作者
A,如果要操作GPIO,必须经历的2个步骤:
           1,配置RCC,设置系统时钟、使能总线时钟、外设时钟。
           2,选择GPIO端口的引脚号、驱动频率、输入输出模式

            之前代码为:
            GPIOE_P13_OFF;  //先低电平
            GPIOE_P13_ON;  //高电平

            这个代码执行的结果是:25M外部晶振,72M系统时钟条件下,输出最大2.5M

            后来经过修改,采用直接操作寄存器的方式进行赋值:
             GPIOE->ODR=0<<13; //在删掉上面的Delay函数之后,12M (系统时钟为72M)
             GPIOE->ODR=1<<13; //
             与上述同样条件下的测试结果是:输出10.28M。但是,当我再次精简主程序的代码的时候,得到12M输出。

B,下面是倍频之后的结果:外部时钟25M
             3倍频时(即75M系统时钟),输出 12M (这个结果有点原因,使用的是另一个倍频设置方式,暂时只能这样)
             4倍频时(即100M系统时钟),输出14.28M,去掉Delay()函数后,得到16.66M稳定输出。(可能是编译器在优化的过程中的一些不同,导致的结果)
             5倍频时(即125M系统时钟),输出17.85M,去掉Delay()函数后,得到20.83M稳定输出。
             更高的倍频还不敢尝试。以上测试,芯片的温度都没有大的变化,基本保持在37℃左右。
关于更多的GPIO翻转速度的论证资料可以参考一下链接:
http://www.mcuzx.net/thread-517-1-1.html  
这个网站中的第9楼中有关于GPIO速率的详细的论证:以及相关的资料。
http://www.amobbs.com/thread-5463674-1-1.html


以下是我手画的系统时钟配置的路径图:(关于我对系统时钟的库函数的注解文件,在压缩包中,有兴趣的可以看一下。凡是英文的都是原来官方注解,凡是中文的都是我个人做的注解(可能会有些错误)。)







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

13#
发表于 2013-5-24 11:50:19 |只看该作者
今天早上再次做了一下实验,并且将所有实验结果截图保存了。(实验过程中,将一个探头探针折断,但是还能使用。现在的实验结果是在探头套上了一个保护套之后的测量结果。总的感觉波形正确,但是毛刺电压稍大。希望师兄们引以为戒。)
图SCR04 ~ SCR09,分别代表72M(不带delay())


72M (带有2个Delay()函数),输出10.28M

   
100M (不带Delay())16.66M
   

125M (不带Delay())20.85M
   









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

14#
发表于 2013-5-24 15:52:11 |只看该作者
中午又修改了一下程序,使GPIO输出频率达到18M。实际上,采取一下形式:
  GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
   GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
  
   GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
   GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
  GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
   GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
  
   GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
   GPIOE->ODR=0<<13;
  GPIOE->ODR=1<<13;
............
............
............
大概有100行,(越长越好,越能接近18M)。这样的作用就是将“While(1)”这条指令的执行时间影响消除。
如下图:

其中,可以看到有一个亮度很弱的一个脉冲,实际上就是 While(1),跳转语句造成的移位,如果上面的置0置1程序越多,那么这个阴影显然会越淡。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

15#
发表于 2013-5-24 15:54:54 |只看该作者
得到18M的结果,可以推测我们的输出指令是占掉2个系统时钟。这样 72/4=18.所以,18M是暂时的一个极限。如果需要更大的,那么只能再进一步优化代码。有兴趣的话可以一试。
回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

16#
发表于 2013-5-24 19:34:19 |只看该作者
关键点:1)代码优化。
2),设置路径优化。(如下图)可以参考《STM32参考手册》的“GPIO的结构”章

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

17#
发表于 2013-5-24 23:35:57 |只看该作者
       经过深入学习BSRR、BRR、ODR寄存器的区别、特性,发现,BSRR与ODR的速度是一样的。所不同的是:BSRR和BRR适用于中断函数对端口的操作,而如果直接对ODR可能会引起竞争。我们可以直接对ODR进行操作,也可以通过BSRR或者BRR来进行操作。这只是两种方式,并且后者会更安全些。
       BSRR的优点在于,可以一次性对不同的位进行“位”置位和复位(也即两个不同引脚的置位复位可以并行操作)。而BRR用来专门的进行“位”复位,它的作用和BSRR的高16位是相同的。但是,有了BRR这个16位的“复位器”,我们就可以快速的进行一个IO口(16根引脚)的“复位”,而不用进行移位(因为如果要使用BSRR的“位”复位功能,那么要对这个16位的操作数移位至BSRR的高16位)。综合起来,我们应这样理解BSRR(一个32位的寄存器)与BRR(一个16位的寄存器):起初,我们为了方便对GPIO的16根引脚进行位操作,所以设计了“BSR” 和BRR这两个16位的寄存器,用来分别进行置位和复位操作,后来,为了能使不同引脚的置位/复位操作能并行执行,所以让“BSR (Bit Set Register )”寄存器设计成一个32位的寄存器(命名为BSRR,Bit Set and Reset Register),其中它的高16位用来进行“位”复位,所以最后GPIO 一共有了 BSRR 和 BRR 这两个特殊的寄存器。(注意,BSRR和BRR都是“只写型”的寄存器,也就是说,它们每次设置的时候只起一次作用。)
       之所以之前采用了看起来一样的GPIO置位复位命令,却得到2.5M的输出频率,很可能是我们的编译器编译的结果,使得我们在进行“置位/复位”时,隐含的调用了一下寄存器操作指令(后来我们就是直接用的这个寄存器操作指令,所以得到12M输出),所以多耗去几个系统时钟。另外,我在调试过程中,将
    GPIOE->BSRR=0x00002000;
    GPIOE->BSRR=0x20000000;
这两个代码换一下顺序,就导致输出的频率不一样,一个为10.28M一个为12M。具体原因不详。可能是编译器的原因。但是,“有输出”,就意味着,BSRR寄存器中如果对同一根引脚置1和置0,那么它只会置1,但是,如果分两次对同一位进行置1或置0,则会有高、低两个电平的输出变化。所以,从这可以推测,BSRR寄存器是非记忆型的(一次性使用)。
当然,这些也只是以我目前所掌握的知识量来做的推测,也许以后的应用中有了更深刻的认识,会发现其中真正的问题。综合起来看,吴文庆师兄的24M已经是STM32F207的上限频率了,但是,如果使用一个技巧(就是不断写100行置0置1代码),也许能看到36M的输出(但本质上是没有变的)。
回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

18#
发表于 2013-6-4 12:51:06 |只看该作者
利用F2xx官方的库和自带的GPIO翻转例子,测得翻转频率有60MHz。
回复

使用道具 举报

405

主题

0

好友

6581

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

19#
发表于 2013-6-4 15:25:42 |只看该作者
ahwwq 发表于 2013-6-4 12:51
利用F2xx官方的库和自带的GPIO翻转例子,测得翻转频率有60MHz。

good,把工程传上来
回复

使用道具 举报

44

主题

0

好友

4124

积分

内部组员

Rank: 8Rank: 8

20#
发表于 2013-6-4 22:54:35 |只看该作者
貌似这个达到了官方给的 STM32F207 最大GPIO速度了,不错! 以前为什么是24M ,有哪些地方做过改进?师兄把工程传上来看看。
回复

使用道具 举报

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

Archiver|手机版|Real Time Group

GMT+8, 2025-3-16 01:55 , Processed in 0.031144 second(s), 18 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部