STM32时钟系统

1.STM32时钟树

2.时钟配置函数

3.自定义系统时钟

4.实现代码

5.实验现象

目录

1.STM32时钟树

2.时钟配置函数

3.自定义系统时钟

4.实现代码

5.实验现象


1.STM32时钟树

2.时钟配置函数

①时钟初始化配置函数

   void SystemInit(void)

        SYSCLK(系统时钟) =72MHz

        AHB 总线时钟(HCLK=SYSCLK) =72MHz

        APB1 总线时钟(PCLK1=SYSCLK/2) =36MHz

        APB2 总线时钟(PCLK2=SYSCLK/1) =72MHz

        PLL 主时钟 =72MHz

 ②外设时钟使能配置函数

        void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

        void RCC_APB2PeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

        void RCC_APB1PeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

③时钟源使能函数

        void RCC_HSICmd(FunctionalState NewState);

        void RCC_LSICmd(FunctionalState NewState);

        void RCC_PLLCmd(FunctionalState NewState);

        void RCC_RTCCLKCmd(FunctionalState NewState);

④时钟源和倍频因子配置函数

        RCC_HSEConfig(RCC_HSE_ON);

        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        RCC_PCLK1Config(RCC_HCLK_Div2);

        RCC_PCLK2Config(RCC_HCLK_Div1);

        void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);

⑤外设时钟复位函数

        void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

        void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

3.自定义系统时钟

        void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)

{

          RCC_DeInit(); //将外设RCC寄存器重设为缺省值

          RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)

          if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振

{

          RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)

          RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)

          RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)

          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作为系统时钟

4.实现代码

        头文件led.h代码如下:

#ifndef _led_H
#define _led_H

#include "stm32f10x.h"

#define LED1_PORT 			GPIOB   
#define LED1_PIN 			GPIO_Pin_5
#define LED1_PORT_RCC		RCC_APB2Periph_GPIOB

#define LED2_PORT 			GPIOE   
#define LED2_PIN 			GPIO_Pin_5
#define LED2_PORT_RCC		RCC_APB2Periph_GPIOE	


void LED_Init(void);


#endif

led.c代码如下:

#include "led.h"


void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(LED1_PORT_RCC|LED2_PORT_RCC,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=LED1_PIN;  
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	  
	GPIO_Init(LED1_PORT,&GPIO_InitStructure); 	   
	GPIO_SetBits(LED1_PORT,LED1_PIN);  
	
	GPIO_InitStructure.GPIO_Pin=LED2_PIN;  
	GPIO_Init(LED2_PORT,&GPIO_InitStructure); 	   
	GPIO_SetBits(LED2_PORT,LED2_PIN);   
}

主函数代码如下:

#include "stm32f10x.h"
#include "led.h"


void delay(u32 i)
{
	while(i--);
}


void RCC_HSE_Config(u32 div,u32 pllm) 
{
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_ON);
	if(RCC_WaitForHSEStartUp()==SUCCESS) 
	{
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK1Config(RCC_HCLK_Div2);
		RCC_PCLK2Config(RCC_HCLK_Div1);
		RCC_PLLConfig(div,pllm);
		RCC_PLLCmd(ENABLE); 
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		while(RCC_GetSYSCLKSource()!=0x08);
	}
}


int main()
{
	RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);   //36M
	LED_Init();
	while(1)
	{
		GPIO_ResetBits(LED1_PORT,LED1_PIN);
		delay(6000000);
		GPIO_SetBits(LED1_PORT,LED1_PIN);
		delay(6000000);
	}
}

5.实验现象

LED闪烁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32系统时钟是指控制STM32芯片内部各个模块和外设运行的时钟信号。STM32时钟系统相对复杂,对于初学者来说可能会感到困惑。时钟系统的重要性不言而喻,它类似于人体的心脏脉搏,是整个系统的基础。\[1\] 为了更好地理解STM32时钟系统,初学者可以参考开发板的源码进行设置,但这种方法可能会导致在遇到问题或需要修改代码时感到困惑。要深入理解STM32时钟系统,以便进行底层驱动设计,需要对其有更深入的了解。\[2\] 在配置STM32时钟系统时,可以根据实际情况进行自定义设置。一般情况下,可以以大容量芯片72MHz的系统时钟为例进行讲解,原理都是一样的。\[3\] 总之,STM32系统时钟是控制芯片内部各个模块和外设运行的关键信号,对于深入理解和设计底层驱动非常重要。 #### 引用[.reference_title] - *1* *3* [STM32-时钟系统详解](https://blog.csdn.net/qq_44016222/article/details/123223733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【STM32】初学者必读STM32时钟系统详解](https://blog.csdn.net/m0_54916619/article/details/130182697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值