STM32系统时钟由72M修改为36M验证示例

一、RCC STM32时钟系统部分库函数介绍

外部高速晶振,外部晶振可以设计为4~16M(开发板设计的是8M):

2.HCLK即AHB时钟,HCLK来源于SYSCLK系统时钟的分频:

3.PCLK1即APB1总线时钟,来源于HCLK的分频:

4.PCLK2即APB2总线时钟,也来源于HCLK的分频:

如图:

5.选择PLL时钟源即倍频系数,得到PLLCLK:

如下图所示,PLL的时钟源头有3条,内部高速时钟2分频、外部高速时钟、外部高速时钟2分频:

6.从图中很容易看出,系统时钟源可来自内部高速时钟、外部高速时钟、PLLCLK:

二、修改STM32系统时钟

STM32默认系统时钟是72M,这里修改为36M并验证,对应框图如下:

主要修改为mian.c

复制代码
#include "stm32f10x.h"  //包含必要头文件

#include "led.h"

//这里不用定义SystemInit函数,是因为在system_stm32f10x.c中已有实现

void delay(unsigned int i)
{
	while(i--);
}

/*******************************************************************************
* 函 数 名         : RCC_HSE_Config
* 函数功能		     : 自定义系统时钟,可以通过修改PLL时钟源和倍频系数实现时钟调整
* 输    入         : div:RCC_PLLSource_HSE_Div1、RCC_PLLSource_HSE_Div2、RCC_PLLSource_HSI_Div2
					           pllm:RCC_PLLMul_2 - RCC_PLLMul_16 2到16倍频
* 输    出         : 无
*******************************************************************************/
void RCC_HSE_Config(u32 div,u32 pllm) //配置STM32时钟系统
{
	RCC_DeInit(); //将外设RCC寄存器重设为缺省值,即重置RCC相关寄存器
	RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE),即开启外部高速晶振(HSE) 
	if(RCC_WaitForHSEStartUp() == SUCCESS) //等待HSE外部高速时钟起振
	{
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK),这里为系统时钟1分频得到
		RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1),APB1总线时钟为AHB时钟2分频得到
		RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2),APB2总线时钟为AHB时钟1分频得到
		RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数
		RCC_PLLCmd(ENABLE); //使能或者失能PLL
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//检查指定的RCC标志位设置与否,PLL就绪
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
		while(RCC_GetSYSCLKSource() != 0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
	}
}

int main()
{
#if 0
  RCC_HSE_Config(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //72M
#else
	RCC_HSE_Config(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); //36M 相比72M,LED闪烁明显变慢
#endif	
	Led_Init();
	while(1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_4); //点亮
		delay(0xFFFFF);
		GPIO_SetBits(GPIOC, GPIO_Pin_4); //熄灭
		delay(0xFFFFF);
	}
}

led.h

复制代码
#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"
	
void Led_Init(void);

#endif

led.c

复制代码
#include "led.h"

/*******************************************************************************
* 函 数 名         : Led_Init
* 函数功能		     : LED初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Led_Init()
{
	GPIO_InitTypeDef MY_GPIO_Init;//定义结构体变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	MY_GPIO_Init.GPIO_Pin = GPIO_Pin_4; //PC4
	MY_GPIO_Init.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出模式
	MY_GPIO_Init.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
	GPIO_Init(GPIOC, &MY_GPIO_Init); 	   
	
	GPIO_SetBits(GPIOC, GPIO_Pin_4);   //熄灭LED5
}

编译烧录验证,修改为36M后,LED闪烁明显变慢。

相关推荐
青梅味猪大肠3 分钟前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
FakeOccupational11 分钟前
【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置
笔记·stm32·实时音视频
ChaseVLSI14 分钟前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
东莞市壹星自动化设备有限公司19 分钟前
透明圆瓶内部特征怎样定位:折射追踪与近远相位分支
嵌入式硬件·自动化·需求分析·几何学·骨骼绑定
Dev_XH38 分钟前
【成品设计】基于物联网的配电箱智能防护系统设计
stm32·单片机·嵌入式硬件·物联网
Dev_XH2 小时前
【成品设计】基于单片机的工厂设备能耗监控与优化系统
stm32·单片机·嵌入式硬件·物联网
不脱发的程序猿3 小时前
STM32制作单手鼠标键盘
stm32·嵌入式硬件·计算机外设·usb·qmk
路上有只喵19 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇 11
单片机·嵌入式硬件
不昀19 小时前
开关电源电流互感器怎么选:匝比、采样电阻与复位的计算笔记
单片机·嵌入式硬件·电子元器件
小李不想当小白1 天前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式