STM32时钟设置

第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟 目录基本知识框架课堂笔记时钟什么是时钟?时钟有什么作用时钟源HSE 外部高速时钟HSI 内部高速时钟LSE 外部低速时钟LSI 内部低速时钟PLL锁相环主要时钟和其他时钟主要时钟其他时钟配置系统时钟实验基本知识框架Xmind文件下载 基本知识框架 课堂笔记 时钟 什么是时钟?时钟有什么作用 时钟是STM32内部最核心的器件,它可以提供时钟信号。依赖于这个信号,STM32中的器件才可以有条不紊地将工作进行下去。正如人类的脉搏一般。 时钟源 STM32中能够主动发出时钟信号的元器件,可以用作时钟源。STM32 阅读详情



2010-12-27 09:33:47|  分类: ARM |  标签: |举报 |字号大中小 订阅

    大家都知道在使用单片机时,时钟速度决定于外部晶振或内部RC振荡电路的频率,是不可以改变的。而ARM的出现打破了这一传统的法则,可以通过软件随意改变时钟速度。这一出现让我们的设计更加灵活,但是也给我们的设计增加了复杂性。为了让用户能够更简单的使用这一功能,STM32的库函数已经为我们设计的更加简单方便。

    在比较靠前的版本中,我们需要向下面那样设置时钟:

ErrorStatus HSEStartUpStatus;

/**************************************************************************************
* FunctionName   : RCC_Configuration()
* Description    : 时钟配置
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void RCC_Configuration(void)
{
    /*
复位所有的RCC外围设备寄存器,不改变内部高速振荡器调整位(HSITRIM[4..0])以及
    备份域控制寄存器(RCC_BDCR),控制状态寄存器RCC_CSR */
    RCC_DeInit();    // RCC system reset(for debug purpose)

    /* 开启HSE振荡器 */
    /* 三个参数: RCC_HSE_ON-开启 RCC_HSE_OFF-关闭 RCC_HSE_BYPASS-使用外部时钟振荡器*/
    RCC_HSEConfig(RCC_HSE_ON); // Enable HSE

    /* HSEStartUpStatus为枚举类型变量,2种取值,0为ERROR,非0为SUCCESS
    等待HSE准备好,若超时时间到则退出*/
    HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready

    if (HSEStartUpStatus == SUCCESS)                  // 当HSE准备完毕切振荡稳定后
    {
     /* 配置AHB时钟,这个时钟从SYSCLK分频而来分频系数有1,2,4,8,16,64,128,256,512 */
     RCC_HCLKConfig(RCC_SYSCLK_Div1);                   // HCLK = SYSCLK
 
      /* 设置低速APB2时钟,这个时钟从AHB时钟分频而来分频系数为1,2,4,8,16 */
     RCC_PCLK2Config(RCC_HCLK_Div1);                  // PCLK2 = HCLK
 
     /* 设置低速APB1时钟,这个时钟从AHB时钟分频而来分频系数为1,2,4,8,16 */
     RCC_PCLK1Config(RCC_HCLK_Div2);                  // PCLK1 = HCLK/2
 
     FLASH_SetLatency(FLASH_Latency_2);                 // Flash 2 wait state
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  // Enable Prefetch Buffer
 
     /* 设置PLL的时钟源和乘法因子
     第一个入口参数为时钟源,共有3个
     RCC_PLLSource_HSI_Div2          
     RCC_PLLSource_HSE_Div1
     RCC_PLLSource_HSE_Div2
     乘法因子RCC_PLLMul_2~RCC_PLLMul_16,之间参数连续 */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);   // PLLCLK = 8MHz * 9 = 72 MHz
 
    
/* 输入参数为ENABLE及DISABLE */
     RCC_PLLCmd(ENABLE);            // Enable PLL
 
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {
      ;               // Wait till PLL is ready
     }
 
      /* 选择系统时钟源,三个参数
      RCC_SYSCLKSource_HSI   内部高速振荡器
      RCC_SYSCLKSource_HSE   外部高速振荡器
      RCC_SYSCLKSource_PLLCLK PLL时钟 */
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);      // Select PLL as system clock source
 
      /* 返回系统当前的时钟源,返回值有3种
      0x00 HSI是当前时钟源
      0x04 HSE是当前时钟源
      0x08 PLL是当前时钟源
     */
     while (RCC_GetSYSCLKSource() != 0x08)       // Wait till PLL is used as system clock source
     {
      ;
     }
 }
}

随之函数库的不断升级,到3.0以上时,我们就不用再这样编写时钟设置了,我们只要做如下两部即可:

第一个: system_stm32f10x.c 中 #define SYSCLK_FREQ_72MHz 72000000
第二个:调用SystemInit()

说明:在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。

文件开头就有一个这样的定义:
//#define SYSCLK_FREQ_HSE    HSE_Value
//#define SYSCLK_FREQ_20MHz 20000000
//#define SYSCLK_FREQ_36MHz 36000000
//#define SYSCLK_FREQ_48MHz 48000000
//#define SYSCLK_FREQ_56MHz 56000000
  #define SYSCLK_FREQ_72MHz 72000000

    ST 官方推荐的外接晶振是 8M,所以库函数的设置都是假定你的硬件已经接了 8M 晶振来运算的.以上东西就是默认晶振 8M 的时候,推荐的 CPU 频率选择.在这里选择了:
     #define SYSCLK_FREQ_72MHz 72000000
也就是103系列能跑到的最大值72M

然后这个 C文件继续往下看
#elif defined SYSCLK_FREQ_72MHz
const uint32_t SystemFrequency         = SYSCLK_FREQ_72MHz;   
const uint32_t SystemFrequency_SysClk   = SYSCLK_FREQ_72MHz;   
const uint32_t SystemFrequency_AHBClk   = SYSCLK_FREQ_72MHz;   
const uint32_t SystemFrequency_APB1Clk  = (SYSCLK_FREQ_72MHz/2);
const uint32_t SystemFrequency_APB2Clk  = SYSCLK_FREQ_72MHz;

    这就是在定义了CPU跑72M的时候,各个系统的速度了.他们分别是:硬件频率,系统时钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了:
#elif defined SYSCLK_FREQ_72MHz
static void SetSysClockTo72(void);

    这就是定义 72M 的时候,设置时钟的函数.这个函数被 SetSysClock ()函数调用,而SetSysClock ()函数则是被 SystemInit()函数调用.最后 SystemInit()函数,就是被你调用的了。

所以设置系统时钟的流程就是: 首先用户程序调用 SystemInit()函数,这是一个库函数,然后 SystemInit()函数里面,进行了一些寄存器必要的初始化后,就调用 SetSysClock()函数. SetSysClock()函数根据那个#define SYSCLK_FREQ_72MHz 72000000 的宏定义,知道了要调用SetSysClockTo72()这个函数,于是,就一堆麻烦而复杂的设置~!@#$%^然后,CPU跑起来了,而且速度是 72M.

STM32F107的时钟设置 STM32F107的时钟设置 STM32的库函数好像只有外部8M倍频到72M,现在用的板子外部25M的晶振,如何倍频到72M呢? 解决办法: STM32F107的时钟分4步的:      1> 25MHz先除5分频到5MHz;      2> 再8倍频到40MHz;      3> 再5分频到8MHz;      4> 再9倍频到72MHz.     STM... 阅读详情

相关推荐

STM32+RTC实现时钟无法设置时间以及掉电时间清零的问题

STM32+RTC实现时钟无法设置时间以及掉电时间清零的问题 最近在实现一个万年历的功能,其中遇到了无法设置时间以及掉电时间清零的问题。 .h文件代码如下: #ifndef __RTC_H #define __RTC_H //时间结构体 typedef struct { vu8 hour; vu8 min; vu8 sec; //公历日月年周 vu16 w_year; vu8 w_month; vu8 w_date; vu8 week; }_calendar_o

MaxWei 7638

STM32滴答定时器计时速率过高问题的解决

STM32滴答定时器计时速率过高问题的解决 问题: 使用滴答定时器的时候发现l实际中断速率是设定中断速率的4倍左右。 解决 如图,这2个函数的调用顺序错误,反过来即可。 原因 还没有找到原因,有知道原因的大神还请在评论区我指导一下,感谢。 ...

qq_41552491的博客 919

STM32系统时钟设置详解

本文主要详细介绍了STM32系统时钟的设置,主要是采用控制寄存器来进行操作的,介绍的较为详细,可以作为参考。

u014449366的博客 1万+

stm32中DMA,时钟树、内存总线、配置时钟时先配置flash->acr、通过寄存器点亮led

DMA STM32 DMA使用详解 1、画图Cortex-M3内部结构图,要体现相应的总线,并标注其作用。 Icode:程序存在Flash中,通过ICode(Instruction Code)总线与Cortex连接取指令。 Dcode:数据被存放在外设内部Flash(SRAM)中,通过DCode(Data Code)访问。 Systembus: 访问外设的寄存器,通常说的寄存器编程就是用这条总线的。 DMA: 数据变量拷贝时可以不占用CPU,通过DMA(Direct Memory Acc

weixin_42224577的博客 3069

STM32完全学习——系统时钟设置

首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟,由于内部HSI存在较大的误差,因此我们在系统完成上电初始化,之后需要将STM32的时钟切换到外部HSE作为系统时钟,那么我们需要完成下面一些设置完成切换。首先我们需要打开外部HSE的震荡电路然后,等待外部震荡电路就绪后,在切换PLLTPRE为HSE的1分频,在设置PLLSRC为PLLXTPRE过来的时钟。然后设置PLLMUL倍频系数,然后打开PLL开关等待PLL稳定。

2401_83010734的博客 3615

STM32 系统时钟设置

1、使用3.5.0的库,系统自动设置为外部时钟8M的时钟,72M工作频率,无需再进行配置。 2、若要自定义时钟时不要用SystemInit函数,把启动代码的SystemInit函数注释掉,main函数加这个RCC配置函数 Reset_Handler   PROC                  EXPORT  Reset_Handler             [WEAK]   

gzw19900817的专栏 783

STM32时钟如何设置

STM32的时钟设置是确保微控制器以正确频率运行的关键步骤,涉及时钟源的选择、系统时钟的设置、外设时钟的配置等多个方面。

weixin_57010826的博客 1539

STM32的时钟设置

在实际使用时,应参考芯片的参考手册和对应的外设库文档来进行正确的时钟配置。在STM32微控制器中,时钟是一个关键的组成部分,它驱动着芯片的各种功能和外设。在STM32中,每个外设都有对应的时钟使能位,需要通过相应的寄存器来使能或禁用外设时钟。STM32微控制器提供了多种系统时钟源选择,常见的有内部时钟源(HSI),外部时钟源(HSE)和PLL(锁相环)时钟源。在STM32中,时钟频率的配置涉及到多个分频器和倍频器。通过调整这些分频器和倍频器的值,可以得到期望的时钟频率。

JeeVue的博客 431

【STM32Cube笔记】4-STM32Cube配置时钟设置

STM32H7系列时钟配置介绍

Amadues0_0的博客 1万+

STM32配置72M时钟时,为什么还要配置Flash?

本文介绍了STM32Flash时序、配置等问题。

深度学习暑期科研项目(两个月发EI论文)

对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。

Magnolia_He的博客 1443

初学STM32系统时钟设置

在学习江科大教程示例的时候默认系统时钟是72MHZ,但是这个系统时钟是怎么过来的呢,通过时钟树以及相关的资料的学习可知,系统时钟它可以是内部RC时钟HSI 8MHZ通过锁相环倍频而来,也可以是外部晶振4-16MHZ通过锁相环倍频而来。但如果我们不想用外部时钟做为系统时钟的来源,而是内部时钟作为系统时钟该怎么设置呢?以外部晶振作为系统时钟如果不想设置为72MHZ,那么该怎么配置这个函数呢?最大是64MHZ,因此如果想达到72MHZ必须要使用外部时钟源。该配置能设置为内部时钟倍频后得到的36MHZ的系统时钟。

firewood2024的博客 1544

麒麟V10桌面操作系统安装Qt5.12.3

在虚拟机中如何安装麒麟V10桌面系统,以及在麒麟系统中安装Qt框架,并正常编译运行Qt程序

阿龙的思考 3599

STM32系统时钟设置过程

STM32系统时钟架构STM32采用多时钟源树状结构,核心时钟源包括:HSI(内部高速时钟):8MHz RC振荡器,精度较低但成本低HSE(外部高速时钟):4-26MHz晶振/陶瓷谐振器,精度高(需外部元件)LSI(内部低速时钟):40kHz RC振荡器,用于独立看门狗LSE(外部低速时钟):32.768kHz晶振,适合RTC应用。

2503_91737204的博客 647

nmap、X-Scan漏洞扫描和Metasploit中用永恒之蓝漏洞入侵靶机并上传冰河

利用nmap、X-Scan扫描靶机的漏洞,在Metasploit中用扫描出的永恒之蓝漏洞入侵靶机,建立连接后上传冰河木马控制靶机,最后用冰河陷阱清除靶机的冰河木马,记一次完整的入侵控制实验。

m0_59302403的博客 4408

GeoServer下载与安装(详细图文教程)

GeoServer官方版可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

大剑师兰特的GIS世界 3276

STM32 时钟设置

时钟设置 时钟树介绍 有以下三种时钟可以作为系统时钟(SYSCLK): HSI 振荡器时钟 HSE 振荡器时钟 PLL 时钟 时钟树如下: OSC_OUT 和 OSC_IN 为外部晶振的接口,为 HSE(高速) 提供振荡源,接 4 -16 MHz 的晶振; OSC32_OUT 和 OSC32_IN 为外部晶振的接口,为 LSE(低速) 提供振荡源,接 32.768 kHz 的晶振。其...

hc372893308的博客 907

基于MATLAB Simulink的电动汽车整车控制仿真

在本文中,我们选择了power_ElectricVehicle示例模型,该模型已经包含了电动汽车的基本组成部分,包括电机、变速器、驱动轮、电池等。例如,使用PID控制器来控制电机的转速,使用ABS控制器来控制车轮的制动力,使用转向控制器来控制车辆的转向角度,使用悬挂控制器来控制车轮的姿态等。通过建立模型和实现控制器,我们可以比较直观地了解电动汽车的工作原理和性能特点,并验证设计的控制系统在不同工况下的效果。而在电动汽车的开发中,整车控制系统是至关重要的一个组成部分,直接影响着电动汽车的性能和性价比。

qq_39605374的博客 1800

STM32读写RTC内部时钟外设,设置和显示时钟

第二步:启动RTC的时钟,使用RCC模块里的RCC_LSEConfig函数,开启LSE的时 钟。第六步:配置CNT的值(给RTC一个初始时间)需要闹钟的话,配置个闹钟;今天学习了STM32单片机的内部时钟外设,学会了更改内部时钟和提取时钟数值的操作,只要后备电池有电,该时钟就会一直走,时间不会复位,哪怕没有给单片机供电。第三步:把结构体中的时间存放到我们指定的全局变量数组中。第二步:把时间戳转换成时间,存放到结构体中。

腹有诗词气自华 2173

【人工智能之深度学习】15. 工业时序预测实战:LSTM与TCN融合的装备故障预警系统设计与实现

摘要:工业装备故障预警是智能制造领域的核心技术之一,其通过分析传感器时序数据实现故障提前预测,可显著降低运维成本并提升设备可靠性。本文针对工业时序数据多源异构、非平稳性、噪声干扰及样本不平衡等挑战,提出一种LSTM与TCN融合的故障预警架构——利用TCN捕捉局部时序特征,结合注意力增强LSTM建模长期依赖关系,通过门控机制实现特征自适应融合。以3MW风电齿轮箱为研究对象,设计包含数据预处理、特征工程、模型训练及部署的完整流程,实验结果表明,该融合模型准确率达94.6%,故障预测提前量较单一模型提升30%以上

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1442

Node-RED系列(二二):使用dashboard搭配echarts制作漂亮的面板

在node-red中dashboard 是一个很常用的模块,其中它有一个chart节点可以用来制作一些图表,比如柱状图,折线图,饼图,但其中的图表并不是很美观,而且可配置项非常的少。 于是就有很多小伙伴找我做一套比较好看的图表面板,在对比了一下几个图表库,我选中了echarts。 不仅美观大方,而且非常容易集成,配置。下面先来看一下我做的效果。这里是直接做了四个折线图,第一个折线图有动态效果,第二个折线图是一个多线条的折线图,第三个折线图是在一个图例显示两个折线图。第二第三都可以用于数据对比。 第四个折线

知无涯 1万+

stm32程序怎么设置apb2总线时钟_一目了然!图文教你理解单片机STM32时钟

PCB布板一些简易常用规则,你不得不看!如何将微小型PCB线圈用做电感式传感器元件?(点击上方红字,即可获取)众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中...

weixin_39927683的博客 3085

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32 RTC设置时钟时,用BCD码设置和BIN码设置有什么区别

STM32 RTC设置时钟时,用BCD码设置和BIN码设置有什么区别

m0_68510271的博客 3523

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: stm32F 记录--建工程注意
pcbdddcz
博客等级 码龄15年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值