打印
[应用相关]

【转】STM32 时钟

[复制链接]
573|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风萧寒|  楼主 | 2016-9-6 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

STM32有三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

1:HSI振荡器时钟(内部时钟)

2:HSE振荡器时钟 (外部时钟,即晶振所提供)

3:PLL时钟(锁相环时钟)

这些设备有以下2种二级时钟源:

(1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。

(2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。

当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。


STM32PLL时钟配置函数:

void Stm32_Clock_Init(u8 PLL)

{

  unsigned char temp=0; //当前系统时钟状态标志  

  MYRCC_DeInit();   //复位并配置向量表

  RCC->CR|=0x00010000;  //外部高速时钟使能HSEON

  while(!(RCC->CR>>17));//等待外部时钟就绪

  RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;

  PLL-=2;//抵消2个单位  //这里PLL减去2是因为倍频系数从2开始,但倍频寄存器值从 0000开始,即如果是9倍频,则倍频寄存器应写0111。

  RCC->CFGR|=PLL<<18;   //设置PLL值 2~16

  RCC->CFGR|=1<<16;   //由软件置’1’或清’0’来选择PLL输入时钟源。该位只有在PLL关闭时才 可以被写入。

  FLASH->ACR|=0x32;   //FLASH 2个延时周期


  RCC->CR|=0x01000000;  //PLLON

  while(!(RCC->CR>>25));//等待PLL锁定

  RCC->CFGR|=0x00000002;//PLL作为系统时钟  

  while(temp!=0x02)     //等待PLL作为系统时钟设置成功

  {   

  temp=RCC->CFGR>>2;

  temp&=0x03;

  }   

}

附:时钟控制寄存器RCC_CR与时钟配置寄存器RCC_CFGR配置表


1:常用配置如下

使用HSE作为PLL的输入源,将PLL的输出配置为72MHZ,然后将PLL作为系统时钟,最后将其他时钟配置为系统时钟的分频输出。

2:配置过程

-将所有和时钟相关的寄存器进行复位;

-启动HSE并等待其稳定;

-配置HCLK和SYSCLK相等;

-配置PCLK1为HCLK的2分频;(由参考手册上的时钟树得知PCLK1为低速外设时钟,最大不超过36MHZ,所以,PLL倍频不建议超过72MHZ)

-配置PCLK2和HCLK相等;(PCLK2为高速外设时钟,最大不超过72MHZ)

-根据是否使用AD及其输入信号的频率配置ADCLK为PCLK2的若干分频;

-根据是否使用USB设备接口,配置USB的时钟为48MHZ;

-配置HSE为PLL的输入,并设置两个分频比使PLL输出72MHZ频率,等待其稳定;

-将PLL输出作为系统时钟;

-根据需要来决定是否启用时钟安全系统。

注意:

1.当HSI作为PLL时钟的输入时,最高的系统时钟频率只能达到64MHz。

2.当使用USB功能时,必须同时使用HSE和PLL,CPU的频率必须是48MHz或72MHz。

3.当需要ADC采样时间为1μs时,APB2必须设置在14MHz、28MHz或56MHz。

附——STM32时钟树:

引用STM32 datasheet 上的一段话:

系统时钟的选择是在启动时进行,复位时内部8MHZ的RC振荡器被选为默认的CPU时钟,随后可以选择外部的、具失效监控的4-16MHZ时钟;当检测到外部时钟失效时,它将被隔离,系统将自动地切换到内部的RC振荡器,如果使能了中断,软件可以接收到相应的中断。同样,在需要时可以采取对PLL时钟完全的中断管理(如当一个间接使用的外部振荡器失效时)。

多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和高速APB的最高频率是72MHZ,低速APB的最高频率为36MHZ。


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

本版积分规则

68

主题

134

帖子

3

粉丝