加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

stm32 时钟

发布时间:2020-12-15 06:44:39 所属栏目:百科 来源:网络整理
导读:在STM32中,有五个时钟源,为 HSI 、 HSE 、 LSI 、 LSE 、 PLL 。 ① HSI 是高速内部时钟,RC振荡器,频率为8MHz。 ② HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ? HSE/LSE 时钟源 ? ③ LSI 是低速内部时钟,RC
在STM32中,有五个时钟源,为 HSIHSELSILSEPLL

HSI是高速内部时钟,RC振荡器,频率为8MHz。

HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

?

HSE/LSE时钟源

?

LSI是低速内部时钟,RC振荡器,频率为40kHz。

LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。



STM32时钟系统的框图

?

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。
???
??? 在我使用的开发板上?? OSC_IN 和 OSC_OUT 外接了? 8M 晶振

要想使CPU达到最大工作频率,72M,因为 8x9 = 72

所以系统初始化时的设置位:

1:选择 HSE 作为系统时钟

STM32_RCC_CR |=((uint32_t)BIT(16));
uHseRdy = STM32_RCC_BASE;
uHseRdy = STM32_RCC_CR;
2: 等待HSE 稳定:?
//wiat until HSE is ready
do{
    uHseRdy = STM32_RCC_CR & RCC_CR_HSERDY;
}while(uHseRdy == 0);

 
3:调整 FALSH 读取速度: 

 STM32_FLASH_ACR |= FLASH_ACR_PRFTBE;
 /* Flash 2 wait state */
STM32_FLASH_ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
STM32_FLASH_ACR |= (uint32_t)FLASH_ACR_LATENCY_2; 

4:设置SYSCLK? PCLK1 PCLK2

HSE 经选择器然后经过PLL 倍频 产生 PLLCLK,PLLCLK 经选择器 ? 产生SYSCLK,系统中设置 PLLCLK = 72M 则 SYSCLK = 72M

SYSCLK 的输出三个方向:

? I2S2 的时钟

? I2S3 的时钟

? 经预分频器AHB 直接或者间接位系统大部分外围设备提供时钟


/* 以下其实应该涉及到清零的操作,不过系统启动时候默认每位都是0 (偏移地址: 0x04  复位值: 0x0000 0000 见手册上关于 RCC_CFGR 的说明)
所以都使用  | 操作就可以了  */
/* HCLK = SYSCLK BIT[7:4]=0*/
 STM32_RCC_CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
 /* PCLK2 = HCLK BIT[13-11]=0*/
STM32_RCC_CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
    
/* PCLK1 = HCLK/2 BIT[10-8]=1 分频 2  */
STM32_RCC_CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
其他时钟(ADC USB)等到用的时候再设置


5: 设置PLL 时钟(PLLCLK 值)

 /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    STM32_RCC_CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    STM32_RCC_CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

6: 时钟参数我们都设置好了,现在可以开启PLL 了,选择并等待 PLL 稳定
/* Enable PLL */
STM32_RCC_CR |= RCC_CR_PLLON;

  /* Wait till PLL is ready */
do{}while((STM32_RCC_CR & RCC_CR_PLLRDY) == 0);
7: 选择PLL 位系统时钟,并等待稳定

 /* Select PLL as system clock source */
 STM32_RCC_CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
 STM32_RCC_CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

 /* Wait till PLL is used as system clock source */
  while ((STM32_RCC_CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
 {
 }

经过以上设置以后就我们的CPU 就再 72M 的频率下工作了

一些其他设备的时钟源:

时钟
? ?
? ?
? ?

IWDG(看门狗):                          使用LSI RC(40kHz)
?                     
                                        HSE/128 = 8M/128
RTC通过设置(RCC_BDCR)                    LSE = 32.768Khz            只要VBAT维持供电,尽管VDD供电被切断,RTC仍继续工作。所以通常选用此种时钟
可以选择三种                             LSI RC 40kHz

                                         直接使用PLLCLK 通过设置 RCC_CFGR BIT[22] 来选择时钟频率 
USB CLOCK 0:                             USBCLK = PLLCLK/1.5 1: USBCLK = PLLCLK 
                                         所以PLLCLK 只能时 48 或者 72 设置位 72M 时   BIT[22] = 0


APB1 CLOCK APB1                         是用来作为外部慢速设备的时钟,最大位 36M 所以 将 RCC_CFGR BIT[10:8]=100 来2 分频 HCLK = 36M



APB2 CLOCK APB2(PCLK2)                  是系统位外部快速设备的时钟 最大 72M 所以 RCC_CFGR BIT[13:11] = 000 PCLK2 = HCLK = 72M


SDIO AHB 接口                            固定为: HCLK/2 = 36M


ADC Clock                               通过设置 RCC_CFGR BIT[15:14] 来设置 00: = PCLK2/2 = 36M 01: = PCLK2/4 = 18M 10:=PCLK2/6=12M 11: = PCLK2/8 = 9M

                                        ADC CLOCK  最大为:14MHz 所以只能选择 10 11 


TIMXCLK(2-7)                             定时器2-7 的频率依赖 APB1 的分频时钟 如果 APB1 分频 > 1 则 TIMXCLK= APB1CLK*2

                                         APB1 分频 = 1 则 TIMXCLK = APB1CLK 再上面的设置中 APB1 CLOKC = 36M 是 2分频 所以 TIMXCLK = APB1CLK*2 = 72M


                                          定时器 1 和8 依赖 APB2 分分频 如果 APB2 分频 > 1 则 TIMXCLK = APB2CLK *2 ze 

 TIMXCLK(1和8)                            如果APB2 分频 = 1 则 TIMXCLK = APB2CLK 上面设置值中 APB2 CLOCK = 72M 没有分频

                                          所以 TIM1CLK 和 TIME2CLK = 72M



MCO 输出时钟                             可选择 4 中频率来源作为其输出的时钟

                                         PLLCLK/2 HSI HSE 以及 SYSCLK 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读