stm32_2_rcc(时钟数)

Posted on 2023-10-23 20:02  reggie_electronic  阅读(65)  评论(0编辑  收藏  举报

在说明GPIO口之前,有必要先对rcc进行说明。以后讲解默认以f4系列为基准,如果使用f103(最小系统板)会进行标注。

一.什么是rcc

rcc是stm32的心脏,由它起震,为端口输出提供频率和周期。

二.stm32中的时钟树

 主要有两种起震的方式内部和外部。

①HSI是高速内部时钟,RC振荡器,频率为8MHz。
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③LSI是低速内部时钟,RC振荡器,频率为40kHz。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

1)

 

 外接低速晶振

2)

2.1)

 配置

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

2)、选择输出时钟源。

时钟的选择由时钟配置寄存器(RCC_CFGR)。

GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);

RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);

参数RCC_MCO为要输出的内部时钟

RCC_MCO_NoClock --- 无时钟输出

RCC_MCO_SYSCLK --- 输出系统时钟(SysCLK)

RCC_MCO_HSI --- 输出内部高速8MHz的RC振荡器的时钟(HSI)

RCC_MCO_HSE --- 输出高速外部时钟信号(HSE)

RCC_MCO_PLLCLK_Div2 --- 输出PLL倍频后的二分频时钟(PLLCLK/2)

3)

 

外部高速时钟

 4)PLL 锁相环倍频输出

这是本节的重点。现在32的配置 也基本上都是PLL的形式,作为系统时钟。

在startup启动文件之前 是系统时钟的初始化

 4.1)PLLCFG寄存器

 如果想要知道 系统时钟,需要知道1.时钟输入 2.PLLN 3.PLLM 4.PLLP

通过查阅手册可以看到 第22位,PLLSRC为0 HSI时钟作为PLL时钟输入

0x24003010

0010 0100 0000 0000 0011 0000 0001 0000

4.2)

在 SetSysClock()中 改变了PLLSRC

 我的外部晶振为 12MHz,

#define PLL_M 6

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 8

#define PLL_N 180

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2

12 * ( 180 / 6 ) / 2 = 180Mhz

五.

有了系统时钟在对其分频,我们就有了APB1\APB2 这两条高速公路 所有外设都是搭载在这两条公路上。

最后:其实要不了这么麻烦

把这个加到主函数,debug一下就可以看到你的系统时钟

RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);

 

Copyright © 2024 reggie_electronic
Powered by .NET 9.0 on Kubernetes