1、STM32学习笔记——系统时钟初始化函数

发布者:快乐的旅程最新更新时间:2024-09-29 来源: cnblogs关键字:STM32  系统时钟  初始化函数 手机看文章 扫描二维码
随时随地手机看文章

STM32有三种不同的时钟源可被用来驱动系统时钟(SYSCLK): 

 1:HSI振荡器时钟(内部时钟)

2:HSE振荡器时钟 (外部时钟,即晶振所提供)

 3:PLL时钟(锁相环时钟)

 这些设备有以下2种二级时钟源: 

 (1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 

 (2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。 

 当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。

  

1:常用配置如下

 使用HSE作为PLL的输入源,将PLL的输出配置为72MHZ,然后将PLL作为系统时钟,最后将其他时钟配置为系统时钟的分频输出。

 2:配置过程

 -将所有和时钟相关的寄存器进行复位;

 -启动HSE并等待其稳定;

 -配置HCLK和SYSCLK相等;

 -配置PCLK1为HCLK的2分频;(由参考手册上的时钟树得知PCLK1为低速外设时钟,最大不超过36MHZ,所以,PLL倍频不建议超过72MHZ)

 -配置PCLK2和HCLK相等;(PCLK2为高速外设时钟,最大不超过72MHZ)

 -根据是否使用AD及其输入信号的频率配置ADCLK为PCLK2的若干分频;

 -根据是否使用USB设备接口,配置USB的时钟为48MHZ;

 -配置HSE为PLL的输入,并设置两个分频比使PLL输出72MHZ频率,等待其稳定;

 -将PLL输出作为系统时钟;

 -根据需要来决定是否启用时钟安全系统。
在写系统时钟初始化代码之前可以先看《STM32参考手册》的系统时钟树:


STM32PLL时钟配置函数:
 void Stm32_Clock_Init(u8 PLL)
 {
  unsigned char temp=0; //当前系统时钟状态标志  
  MYRCC_DeInit();   //复位并配置向量表
  RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
  while(!(RCC->CR>>17));//等待外部时钟就绪
  RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
  PLL-=2;//抵消2个单位  //这里PLL减去2是因为倍频系数从2开始,但倍频寄存器值从 0000开始,即如果是9倍频,则倍频寄存器应写0111。
  RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
  RCC->CFGR|=1<<16;   //由软件置’1’或清’0’来选择PLL输入时钟源。该位只有在PLL关闭时才 可以被写入。
  FLASH->ACR|=0x32;   //FLASH 2个延时周期
 
  RCC->CR|=0x01000000;  //PLLON
  while(!(RCC->CR>>25));//等待PLL锁定
  RCC->CFGR|=0x00000002;//PLL作为系统时钟  
  while(temp!=0x02)     //等待PLL作为系统时钟设置成功
  {   
  temp=RCC->CFGR>>2;
  temp&=0x03;
  }    
 }
MYRCC_DeInit函数原型:
 void MYRCC_DeInit(void)
{                    
 RCC->APB1RSTR = 0x00000000;//复位结束    
 RCC->APB2RSTR = 0x00000000; 
   
   RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.   
   RCC->APB2ENR = 0x00000000; //外设时钟关闭.      
   RCC->APB1ENR = 0x00000000;   
 RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                 
 RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]      
 RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
 RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP       
 RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
 RCC->CIR = 0x00000000;     //关闭所有中断
 //配置向量表      
#ifdef  VECT_TAB_RAM
 MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else   
 MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}

时钟控制寄存器:


时钟控制寄存器:


      


关键字:STM32  系统时钟  初始化函数 引用地址:1、STM32学习笔记——系统时钟初始化函数

上一篇:STM32、ESP8266与MQTT连接阿里云物联网的串口通信异常解析
下一篇:2、STM32学习笔记——定时器

推荐阅读最新更新时间:2026-03-22 11:51

1、STM32学习笔记——系统时钟初始化函数
STM32有三种不同的时钟源可被用来驱动系统时钟(SYSCLK): 1:HSI振荡器时钟(内部时钟) 2:HSE振荡器时钟 (外部时钟,即晶振所提供) 3:PLL时钟(锁相环时钟) 这些设备有以下2种二级时钟源: (1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 (2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。 当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。 1:常用配置如下 使用HSE作为PLL的输入源,将PLL的输出配置为72MHZ,然后将PLL作为系统时钟,最后将其他时钟配置为
[单片机]
1、<font color='red'>STM32</font>学习笔记——<font color='red'>系统</font><font color='red'>时钟</font><font color='red'>初始化</font><font color='red'>函数</font>
Systemlnit时钟系统初始化函数剖析
在工程文件的system_stm32f10x.c中有如下代码: 这里将为大家逐个注释,让大家了解。 void SystemInit (void) { RCC- CR |= (uint32_t)0x00000001;//把HSI时钟打开 //HSION:内部高速时钟使能 (Internal high-speed clock enable) 由软件置’1’或清零。 //当从待机和停止模式返回或用作系统时钟的外部4-16MHz振荡器发生故障时,该位由硬件置’1’ 来启动内部8MHz的RC振荡器。 //当内部8MHz振荡器被直接或间接地用作或被选择将要作为系 统时钟时,该位不能被清零。 //0:内部8MHz振荡器
[单片机]
STM32F4 (7) Systemlinit时钟系统初始化函数剖析
开始我们今天的内容,今天主要讲解systeminit , 参考《STM32中文参考手册》、STM32库函数开发 回顾一下上一讲有五个的时钟来源 1.LSI 低速的内部时钟 2.LSE 低速的外部时钟 3HSI 高速的内部时钟 4PLLCLK 通过锁相环 5 HSE高速的外部时钟 SYSCLK 系统时钟,他的主要来源有1HSI 2HSE 3PLLCLK,大部分情况都是用PLLCLK,应为F4芯片可以跑到168Mhz,PLLCLK主要来自主PLLCLK的锁相环,时钟 法人计算方法 之前已经说过,主PLLCLK的锁相环可以选择HSI、HSE作为时钟输入,在我们系统初始化的时候(正点原子)使用的是H
[单片机]
STM32F4 (7) Systemlinit<font color='red'>时钟</font><font color='red'>系统</font><font color='red'>初始化</font><font color='red'>函数</font>剖析
stm32专题十一:USART(三)初始化结构体和标准库函数分析
在之前的博客中分析了stm32串口的结构,和详细的发送、接受过程。现在来分析固件库中对于USART的标准函数 typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 帧数据长度(8位还是9位) uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校验 uint16_t USART_Mode; // 模式:单收、单发或收发 uint16_t USART_HardwareFlowCo
[单片机]
STM32函数之GPIO初始化代码分析
首先我们先看GPIO的寄存器有哪些 1. 端口低配置寄存器 复位值:0x4444 4444 2.端口高配置寄存器 复位值:0x4444 4444 3.端口输入数据寄存器 复位值:0x0000 XXXX 4.端口输出数据寄存器 复位值: 0x0000 0000 5.端口位设置/清除寄存器 复位值: 0x0000 0000 6:端口位清除寄存器 复位值:0x0000 0000 7:端口配置锁定寄存器 复位值: 0x0000 0000 偏移地址从0x00一次加四到0x18 因为是32位寄存器,
[单片机]
注意:STM32函数中未用到的参数也一定要初始化
注意使用STM32库函数时,对于不用的参数,一定要初始化,否则有可能影响到有用的位! 比如我在配置ADC时,精度配置为12位,但输出的一直是8位的,最后发现由于没有初始化ADC_InitStruct.ADC_ExternalTrigConv这个值,这个值是不确定的。库函数中做如下计算 tmpreg |= (uint32_t)(ADC_InitStruct- ADC_Resolution | ((uint32_t)(ADC_InitStruct- ADC_ContinuousConvMode) 13) | ADC_InitStruct- ADC_ExternalTrigConvEdge | ADC_InitS
[单片机]
STM32串口中断实验总结函数初始化
STM32串口中断实验总结函数的初始化必须在变量的初始化之后在进行! 在进行串口的实验的时候,自己没有看教程,写了一段代码,但是进行编译之后发现一直有错误,就算我把代码更改之后还是一直有错误。对比了官方给的教程之后发现唯一的不同之处就是我的有一个函数的初始化是在变量的初始化之前,进行的初始化,在进行相应的知识查询之后,还有请教了师兄之后,发现了自己以前一直没有注意到的问题就是,函数的初始化必须放到变量的初始化之后,否则在使用keil也就是MDK进行建立工程的时候就会报错。 注意细节
[单片机]
<font color='red'>STM32</font>串口中断实验总结<font color='red'>函数</font>的<font color='red'>初始化</font>
STM32系统初始化模板函数
第一次写,也不知道写些啥,就copy一个STM32 系统时钟初始化模板函数吧,以来分享给新手参考,而来自己当做备份一下。 有大神看到觉不妥之处请指出,勿喷!谢谢! void SYS_Init(void) { uint8_t HSEStartUpStatus; RCC_DeInit(); //将RCC设置为默认的重置状态 RCC_HSEConfig(RCC_HSE_ON); //配置外部高速晶振 (HSE - ON) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部时钟就绪 if(HSEStartUpStatus == SUCCESS) //SUCCESS:外部时钟(HSE)稳定
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved