我用的是正点的
STM32F103
来进行学习,板子和教程是野火的指南者
。
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。
九、RCC时钟树与时钟
- 九、RCC时钟树与时钟
- 3、使用固件库的函数来配置时钟
- bsp_rccclkconfig.c思路
- 配置HSE时钟
- 把RCC寄存器复位成复位值
- 使能HSE
- 确认HSE状态,并配置FLASH与时钟树
- 使能FLASH预取指
- 配置HCLK、PCLK1、PCLK2分频
- 配置锁相环
- 选择系统时钟
- 配置HSI时钟
- 配置MCO引脚功能
九、RCC时钟树与时钟
3、使用固件库的函数来配置时钟
bsp_rccclkconfig.c思路
配置HSE时钟
把RCC寄存器复位成复位值
RCC_DeInit();
使能HSE
RCC_HSEConfig(RCC_HSE_ON);
这个参数可以是以下值之一:
RCC_HSE_OFF
//HSE振荡器关闭RCC_HSE_ON
//HSE振荡器开启RCC_HSE_Bypass
//HSE振荡器与外部时钟旁路
确认HSE状态,并配置FLASH与时钟树
HSEStatus = RCC_WaitForHSEStartUp();if( HSEStatus == SUCCESS )
{.....代码如下文
}
else
{
/* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */
}
使能FLASH预取指
// 使能预取指
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd()函数参数如下:
FLASH_PrefetchBuffer_Enable
//使能预取指FLASH_PrefetchBuffer_Disable
//关闭预取指
FLASH_SetLatency()函数参数如下:
FLASH_Latency_0
//零等待状态FLASH_Latency_1
//一个等待状态FLASH_Latency_2
//两个等待状态
这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例
零等待状态,当0 < SYSCLK ≤ 24MHZ
一个等待状态,当24MHz < SYSCLK ≤ 48MHZ
两个等待状态,当48MHz < SYSCLK ≤ 72MHZ
配置HCLK、PCLK1、PCLK2分频
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_HCLKConfig()函数参数如下:
RCC_SYSCLK_Div1
//AHB clock = SYSCLKRCC_SYSCLK_Div2
//AHB clock = SYSCLK/2RCC_SYSCLK_Div4
//AHB clock = SYSCLK/4RCC_SYSCLK_Div8
//AHB clock = SYSCLK/8RCC_SYSCLK_Div16
//AHB clock = SYSCLK/16RCC_SYSCLK_Div64
//AHB clock = SYSCLK/64RCC_SYSCLK_Div128
//AHB clock = SYSCLK/128RCC_SYSCLK_Div256
//AHB clock = SYSCLK/256RCC_SYSCLK_Div512
//AHB clock = SYSCLK/512
RCC_PCLK1Config()函数参数如下:
RCC_HCLK_Div1
//APB1 clock = HCLKRCC_HCLK_Div2
//APB1 clock = HCLK/2RCC_HCLK_Div4
//APB1 clock = HCLK/4RCC_HCLK_Div8
//APB1 clock = HCLK/8RCC_HCLK_Div16
//APB1 clock = HCLK/16
RCC_PCLK2Config()函数参数如下:
RCC_HCLK_Div1
//APB2 clock = HCLKRCC_HCLK_Div2
//APB2 clock = HCLK/2RCC_HCLK_Div4
//APB2 clock = HCLK/4RCC_HCLK_Div8
//APB2 clock = HCLK/8RCC_HCLK_Div16
//APB2 clock = HCLK/16
配置锁相环
// 配置 PLLCLK = HSE * RCC_PLLMul_x
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);// 使能PLL
RCC_PLLCmd(ENABLE);// 等待PLL稳定
while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );
对互联型来说,RCC_PLLConfig()函数参数如下:
RCC_PLLSource_HSI_Div2
//HSI时钟除以2被选为锁相环时钟入口RCC_PLLSource_PREDIV1
//PREDIV1时钟被选为锁相环时钟
对标准型来说,RCC_PLLConfig()函数参数如下:
RCC_PLLSource_HSI_Div2
//HSI时钟除以2作为锁相环时钟入口RCC_PLLSource_HSE_Div1
//HSE时钟作为锁相环时钟入口RCC_PLLSource_HSE_Div2
//HSE时钟除以2作为锁相环时钟入口
RCC_PLLConfig()函数第二个参数如下:
RCC_PLLMul_x
//x为2到16的一个数字,设置倍频次数,理论上倍频为9,就能得到72M的PLLCLK
RCC_PLLCmd()函数参数如下:
DISABLE
ENABLE
RCC_GetFlagStatus()函数检查是否设置了指定的RCC标志
对互联型来说,RCC_GetFlagStatus()函数参数如下参数如下:
RCC_FLAG_HSIRDY
//HSI oscillator clock readyRCC_FLAG_HSERDY
//HSE oscillator clock readyRCC_FLAG_PLLRDY
//PLL clock readyRCC_FLAG_PLL2RDY
//PLL2 clock readyRCC_FLAG_PLL3RDY
//PLL3 clock readyRCC_FLAG_LSERDY
//LSE oscillator clock readyRCC_FLAG_LSIRDY
//LSI oscillator clock readyRCC_FLAG_PINRST
//Pin resetRCC_FLAG_PORRST
//POR/PDR resetRCC_FLAG_SFTRST
//Software resetRCC_FLAG_IWDGRST
//Independent Watchdog resetRCC_FLAG_WWDGRST
//Window Watchdog resetRCC_FLAG_LPWRRST
//Low Power reset
对标准型来说,RCC_GetFlagStatus()函数参数如下参数如下:RCC_FLAG_HSIRDY
//HSI oscillator clock readyRCC_FLAG_HSERDY
//HSE oscillator clock readyRCC_FLAG_PLLRDY
//PLL clock readyRCC_FLAG_LSERDY
//LSE oscillator clock readyRCC_FLAG_LSIRDY
//LSI oscillator clock readyRCC_FLAG_PINRST
//Pin resetRCC_FLAG_PORRST
//POR/PDR resetRCC_FLAG_SFTRST
//Software resetRCC_FLAG_IWDGRST
//Independent Watchdog resetRCC_FLAG_WWDGRST
//Window Watchdog resetRCC_FLAG_LPWRRST
//Low Power reset
选择系统时钟
// 选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );
RCC_SYSCLKConfig()函数参数如下参数如下:
RCC_SYSCLKSource_HSI
//sysclk选择HSIRCC_SYSCLKSource_HSE
//sysclk选择HSERCC_SYSCLKSource_PLLCLK
//sysclk选择PLL
配置HSI时钟
- 把RCC 寄存器复位成复位值
RCC_DeInit();
- 使能 HSI
RCC_HSICmd(ENABLE);
- 接下来步骤和配置HSE一样
配置MCO引脚功能
- 先设置MCO的GPIO
使能PA8,模式为复用推挽输出,时钟为50Mhz
GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);
- 配置MCO时钟来源
RCC_MCOConfig(RCC_MCO_SYSCLK);
对于标准型来说,RCC_MCOConfig()函数参数如下参数如下:
RCC_MCO_NoClock
// 不选择时钟RCC_MCO_SYSCLK
// System clockRCC_MCO_HSI
// HSIRCC_MCO_HSE
// HSERCC_MCO_PLLCLK_Div2
// PLL时钟/2
- 之后就可以用示波器测试PA8引脚,得到时钟频率。