Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37489
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2022-05-02 01:54
文章分类

全部博文(27)

文章存档

2022年(27)

我的朋友

分类: Windows平台

2022-05-03 15:27:27

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

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

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

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

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

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

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

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

  

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输出作为系统时钟;

 -根据需要来决定是否启用时钟安全系统。
在写系统时钟初始化代码之前可以先看《STM32参考手册》的系统时钟树:


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;
  }    
 }
MYRCC_DeInit函数原型:
 void MYRCC_DeInit(void)
{                    
 RCC->APB1RSTR = 0x00000000;//复位结束    
 RCC->APB2RSTR = 0x00000000; 
   
   RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.   
   RCC->APB2ENR = 0x00000000; //外设时钟关闭.      
   RCC->APB1ENR = 0x00000000;   
 RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                 
 RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]      
 RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
 RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP       
 RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
 RCC->CIR = 0x00000000;     //关闭所有中断
 //配置向量表      
#ifdef  VECT_TAB_RAM
 MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else   
 MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}

时钟控制寄存器:


时钟控制寄存器:


      











阅读(1926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~