(STM32笔记)九、RCC时钟树与时钟 第三部分

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。

之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

九、RCC时钟树与时钟

九、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与时钟树
c 复制代码
HSEStatus = RCC_WaitForHSEStartUp();

if( HSEStatus == SUCCESS )
{
    .....代码如下文
}
else
{
/* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */
}
使能FLASH预取指
c 复制代码
// 使能预取指
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分频
c 复制代码
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_HCLKConfig()函数参数如下:

  • RCC_SYSCLK_Div1 //AHB clock = SYSCLK
  • RCC_SYSCLK_Div2 //AHB clock = SYSCLK/2
  • RCC_SYSCLK_Div4 //AHB clock = SYSCLK/4
  • RCC_SYSCLK_Div8 //AHB clock = SYSCLK/8
  • RCC_SYSCLK_Div16 //AHB clock = SYSCLK/16
  • RCC_SYSCLK_Div64 //AHB clock = SYSCLK/64
  • RCC_SYSCLK_Div128 //AHB clock = SYSCLK/128
  • RCC_SYSCLK_Div256 //AHB clock = SYSCLK/256
  • RCC_SYSCLK_Div512 //AHB clock = SYSCLK/512

RCC_PCLK1Config()函数参数如下:

  • RCC_HCLK_Div1 //APB1 clock = HCLK
  • RCC_HCLK_Div2 //APB1 clock = HCLK/2
  • RCC_HCLK_Div4 //APB1 clock = HCLK/4
  • RCC_HCLK_Div8 //APB1 clock = HCLK/8
  • RCC_HCLK_Div16 //APB1 clock = HCLK/16

RCC_PCLK2Config()函数参数如下:

  • RCC_HCLK_Div1 //APB2 clock = HCLK
  • RCC_HCLK_Div2 //APB2 clock = HCLK/2
  • RCC_HCLK_Div4 //APB2 clock = HCLK/4
  • RCC_HCLK_Div8 //APB2 clock = HCLK/8
  • RCC_HCLK_Div16 //APB2 clock = HCLK/16
配置锁相环
c 复制代码
// 配置 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 ready
  • RCC_FLAG_HSERDY //HSE oscillator clock ready
  • RCC_FLAG_PLLRDY //PLL clock ready
  • RCC_FLAG_PLL2RDY //PLL2 clock ready
  • RCC_FLAG_PLL3RDY //PLL3 clock ready
  • RCC_FLAG_LSERDY //LSE oscillator clock ready
  • RCC_FLAG_LSIRDY //LSI oscillator clock ready
  • RCC_FLAG_PINRST //Pin reset
  • RCC_FLAG_PORRST //POR/PDR reset
  • RCC_FLAG_SFTRST //Software reset
  • RCC_FLAG_IWDGRST //Independent Watchdog reset
  • RCC_FLAG_WWDGRST //Window Watchdog reset
  • RCC_FLAG_LPWRRST //Low Power reset
    对标准型来说,RCC_GetFlagStatus()函数参数如下参数如下:
  • RCC_FLAG_HSIRDY //HSI oscillator clock ready
  • RCC_FLAG_HSERDY //HSE oscillator clock ready
  • RCC_FLAG_PLLRDY //PLL clock ready
  • RCC_FLAG_LSERDY //LSE oscillator clock ready
  • RCC_FLAG_LSIRDY //LSI oscillator clock ready
  • RCC_FLAG_PINRST //Pin reset
  • RCC_FLAG_PORRST //POR/PDR reset
  • RCC_FLAG_SFTRST //Software reset
  • RCC_FLAG_IWDGRST //Independent Watchdog reset
  • RCC_FLAG_WWDGRST //Window Watchdog reset
  • RCC_FLAG_LPWRRST //Low Power reset
选择系统时钟
c 复制代码
// 选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while( RCC_GetSYSCLKSource() != 0x08 );

RCC_SYSCLKConfig()函数参数如下参数如下:

  • RCC_SYSCLKSource_HSI //sysclk选择HSI
  • RCC_SYSCLKSource_HSE //sysclk选择HSE
  • RCC_SYSCLKSource_PLLCLK //sysclk选择PLL
配置HSI时钟
  1. 把RCC 寄存器复位成复位值
    RCC_DeInit();
  2. 使能 HSI
    RCC_HSICmd(ENABLE);
  3. 接下来步骤和配置HSE一样
配置MCO引脚功能
  1. 先设置MCO的GPIO
    使能PA8,模式为复用推挽输出,时钟为50Mhz
c 复制代码
	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);	
  1. 配置MCO时钟来源
    RCC_MCOConfig(RCC_MCO_SYSCLK);

对于标准型来说,RCC_MCOConfig()函数参数如下参数如下:

  • RCC_MCO_NoClock // 不选择时钟
  • RCC_MCO_SYSCLK // System clock
  • RCC_MCO_HSI // HSI
  • RCC_MCO_HSE // HSE
  • RCC_MCO_PLLCLK_Div2 // PLL时钟/2
  1. 之后就可以用示波器测试PA8引脚,得到时钟频率。
相关推荐
我是伪码农3 小时前
百蝶杯学习
学习
国科安芯3 小时前
立方星与微纳卫星综合电子微型化趋势下的抗辐射MCU选型综述
人工智能·单片机·嵌入式硬件·mcu·risc-v·抗辐射
xunyan62343 小时前
3-1 独立按键控制LED亮灭(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·嵌入式硬件·接口隔离原则
keyipatience3 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
hanlin033 小时前
刷题笔记:力扣第32题-最长有效括号
笔记·算法·leetcode
WD137298015574 小时前
WD5030L,为充电桩、工业设备、5G 基站、车载系统、消费电子提供电源,7-30V 的宽压输入
stm32·单片机·嵌入式硬件·5g·车载系统·51单片机
xian_wwq5 小时前
【学习笔记】Milvus 如何完成一次向量相似度检索,Milvus 索引到底应该怎么选?-15
笔记·学习·milvus
Hhuhkt5 小时前
3D 云养宠小游戏
学习
创界工坊工作室5 小时前
30-基于STM32的小麦烘干塔温度控制系统设计
stm32·单片机·嵌入式硬件·proteus
Zwawa6 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·单片机·嵌入式