STM32学习笔记3:时钟系统
2017-09-07 11:14
302 查看
时钟系统结构大致如下图:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/151802asrsvuz8l098yv8s.png)
1.时钟树详解
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162114gvssvbv5gb44vusv.png)
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162123vnc13zvvo6atwv15.png)
先看上半部分。
从上往下有:
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寄存器:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162131viaovjijioio33sy.png)
HPRE是HCLK时钟分频,一般我们在此直接设为0000
PPRE1/2为APB1/2时钟分频,其大小如下图:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/151955py77o0drzrll20e7.png)
按需要设置即可
PLL_CFGR寄存器:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162153g544ieqs5ayabeig.png)
主要设置主/副PLL中 PQR分频系数的值和选择HSE/HSI作为时钟输入
RCC时钟控制寄存器,主要控制PLL和HSI,HSE时钟的使能和开关
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162211h2uw1c22i11iy2z2.png)
时钟使能寄存器:任何外设开始时候都必须使能时钟。操作非常简单,寄存器置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>
复制代码
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/151802asrsvuz8l098yv8s.png)
1.时钟树详解
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162114gvssvbv5gb44vusv.png)
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162123vnc13zvvo6atwv15.png)
先看上半部分。
从上往下有:
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寄存器:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162131viaovjijioio33sy.png)
HPRE是HCLK时钟分频,一般我们在此直接设为0000
PPRE1/2为APB1/2时钟分频,其大小如下图:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/151955py77o0drzrll20e7.png)
按需要设置即可
PLL_CFGR寄存器:
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162153g544ieqs5ayabeig.png)
主要设置主/副PLL中 PQR分频系数的值和选择HSE/HSI作为时钟输入
RCC时钟控制寄存器,主要控制PLL和HSI,HSE时钟的使能和开关
![](http://www.stmcu.org/module/forum/data/attachment/forum/201707/14/162211h2uw1c22i11iy2z2.png)
时钟使能寄存器:任何外设开始时候都必须使能时钟。操作非常简单,寄存器置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>
复制代码
相关文章推荐
- STM32 FSMC学习笔记+补充(LCD的FSMC配置)
- 基于STM32的触摸屏学习笔记
- STM32学习笔记 2014年11月6日下午
- STM32学习笔记整理之(1)——MDK的设置
- STM32学习笔记1 IO口学习
- stm32通用定时器(TIMx)学习笔记
- STM32学习笔记之工程模板的建立
- STM32学习笔记 — 之GPIO端口篇
- stm32学习笔记——PWM波
- 基于STM32的USB枚举过程学习笔记(一)
- STM32学习笔记:外部中断EXTI的使用
- STM32学习笔记-3
- STM32 FSMC学习笔记
- stm32学习笔记 F1系列DMA
- STM32学习笔记:USART串口的…
- STM32学习笔记(5):通用定时器PWM输出
- STM32学习笔记之-串口中断接收不定数据buff
- STM32学习笔记-定时器中断
- stm32学习笔记——GPIO
- stm32学习笔记——外部中断的使用