认识STM32的系统时钟

STM32共有五个时钟源,分别是:

  • HSI是高速内部时钟、RC振荡器,频率为8MHz;
  • HSE是高速外部时钟,频率范围为4~6MHz; (可接石英/陶瓷谐振器或者接外部时钟源)
  • LSI是低速内部时钟,频率40kHz; (独立看门狗时钟源、可作RTC时钟源)
  • LSE是低速外部时钟,频率为32.768kHz石英晶体; (主要RTC时钟源)
  • PLL是锁相环倍频输出,频率可选择为HSI/2、HSE或者HSE/2、倍频可选择2~16倍,但其输出频率最大不超过72MHz;

      此处重点介绍系统时钟,一般其他所有的外设时钟的来源都是SYSCLK,SYSCLK通过AHB分频器分频之后送给各个模块使用。这些模块中包括APB1和APB2分频器。

  • 送给APB1分频器,输出一路供APB1外设使用(最大频率为36MHz),另一路送给定时器(Timer)2、3、4倍频器使用;
  • 送给APB2分频器,输出一路供APB2外设使用(最大频率为72MHz),另一路送个定时器(Timer)1倍频使用;

      具体如下表:

APB外设内容表
名称 类型     外设内容
APB1 低速外设

电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等

APB2 高速外设 UART1、SPI1、Timer1、ADC1、ADC2、普通IO口(PA~PE)、第二功能IO口等

      以上的时钟输出中很多都是带使能控制的,例如:

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);

是对PD和PG口进行时钟使能。

      STM32时钟系统配置初始化有函数Sys-temInit()之外,其它的配置在stm32f10x-rcc.h文件之中。

      对于系统时钟默认的情况下在SystemInit函数的SetSysClock()函数中判断的,具体如下:

      static void SetSysClock(void)
       {
         #ifdef SYSCLK_FREQ_HSE
         SetSysClockToHSE();
         #elif defined SYSCLK_FREQ_24MHz
         SetSysClockTo24();
         #elif defined SYSCLK_FREQ_36MHz
         SetSysClockTo36();
         #elif defined SYSCLK_FREQ_48MHz
         SetSysClockTo48();
         #elif defined SYSCLK_FREQ_56MHz
         SetSysClockTo56();
         #elif defined SYSCLK_FREQ_72MHz
         SetSysClockTo72();
         #endif
       }

这段代码是判定系统宏定义的时钟是多少,然后设置相应的值,系统默认为72MHz:

                                   #define SYSCLK_FREQ_72MHz  72000000

如果需要设置其他频率的时钟,只需要在stm32f10x-rcc.c文件的第115行注释掉上面代码,加入将需要的频率代码即可。

      在SystemInit()函数中设置的系统时钟的大小如下:

                  • SYSCLK(系统时钟)=72MHz;
                  • AHB总线时钟(使用系统时钟)=72MHz;
                  • APB1总线时钟(PCLK1)=36MHz;
                  • APB2总线时钟(PCLK2)=72MHz;
posted @ 2015-12-23 22:45  愤怒的小贱  阅读(2424)  评论(0编辑  收藏  举报