在说明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);