您的位置:首页 > 其它

STM32学习笔记3:时钟系统

2017-09-07 11:14 302 查看
时钟系统结构大致如下图:

 

1.时钟树详解


 


 
先看上半部分。 
从上往下有: 
1. 独立看门狗时钟由LSI即低速内部时钟(RC时钟)产生,大致为32kHz,由于是RC电路产生,故时钟不稳定 
2. RTC可以选择上面的LSI时钟产生,也可以由低速外部时钟(LSE)产生,大小为32.768khz,具有功耗低,精度高特点 
3. MCO1/2是时钟输出管脚,每个管脚可以输出4种时钟源大小,具体可在图中看出,但最高不能超过100MHZ 
4. 系统时钟有三个来源;高速内部时钟(HSI)大小为16MHZ,高速外部时钟(HSE)通过OSC_OUT/IN接外部时钟或晶振,以及锁相(PLL)输出时钟,一般采用锁相环可以达到最大值168MHZ 
5. 主锁相环主要通过HSE(常用)或者HSI作为输入,然后*N/(M*P) 作为系统时钟的输入源之一,走/Q则供给USB,随机数发送器及SDIO时钟。 
副锁相环则是专用供给I2S(音频总线)时钟,可以来源外部时钟输入,HSE或者HSI 
6. 以太网和USB时钟

相关寄存器

一般来说,我们希望HCLK能达到最大速度即168MHZ,故我们常常采用锁相环输出。首先看CFGR寄存器:


 

HPRE是HCLK时钟分频,一般我们在此直接设为0000 

PPRE1/2为APB1/2时钟分频,其大小如下图: 


 

按需要设置即可

PLL_CFGR寄存器:


 

主要设置主/副PLL中 PQR分频系数的值和选择HSE/HSI作为时钟输入

RCC时钟控制寄存器,主要控制PLL和HSI,HSE时钟的使能和开关 


 
时钟使能寄存器:任何外设开始时候都必须使能时钟。操作非常简单,寄存器置1即使能。

实例:

<font size="2">//返回值:0,成功;1,失败。

u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq)



    u16 retry=0;

    u8 status=0;

    RCC->CR|=1<<16;             //HSE 开启 

    while(((RCC->CR&(1<<17))==0)&&(retry<0X1FFF))retry++;//等待HSE RDY

    if(retry==0X1FFF)status=1;  //HSE无法就绪

    else   

    {

        RCC->APB1ENR|=1<<28;    //电源接口时钟使能

        PWR->CR|=3<<14;         //高性能模式,时钟可到168Mhz

        RCC->CFGR|=(0<<4)|(5<<10)|(4<<13);//HCLK 不分频;APB1 4分频;APB2 2分频. 

        RCC->CR&=~(1<<24); //关闭主PLL

        RCC->PLLCFGR=pllm|(plln<<6)|(((pllp>>1)-1)<<16)|(pllq<<24)|(1<<22);//配置主PLL,PLL时钟源来自HSE

        RCC->CR|=1<<24;         //打开主PLL

        while((RCC->CR&(1<<25))==0);//等待PLL准备好 

        FLASH->ACR|=1<<8;       //指令预取使能.

        FLASH->ACR|=1<<9;       //指令cache使能.

        FLASH->ACR|=1<<10;      //数据cache使能.

        FLASH->ACR|=5<<0;       //5个CPU等待周期. 

        RCC->CFGR&=~(3<<0);        //清零

        RCC->CFGR|=2<<0;        //选择主PLL作为系统时钟   

        while((RCC->CFGR&(3<<2))!=(2<<2));//等待主PLL作为系统时钟成功. 

    } 

    return status;

}</font>

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: