stm32的五个时钟源参数设置经验

发布者:ShiningSmile最新更新时间:2024-09-04 来源: elecfans关键字:stm32  时钟源  参数设置 手机看文章 扫描二维码
随时随地手机看文章

一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①HSI是高速内部时钟,RC振荡器,频率为8MHz。

②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③LSI是低速内部时钟,RC振荡器,频率为40kHz。

④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。


二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:

①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面)节省2个外部电阻。


三、用HSE时钟,程序设置时钟参数流程:01、将RCC寄存器重新设置为默认值RCC_DeInit;02、打开外部高速时钟晶振HSERCC_HSEConfig(RCC_HSE_ON);03、等待外部高速时钟晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUp();04、设置AHB时钟RCC_HCLKConfig;05、设置高速AHB时钟RCC_PCLK2Config;06、设置低速速AHB时钟RCC_PCLK1Config;07、设置PLLRCC_PLLConfig;08、打开PLLRCC_PLLCmd(ENABLE);09、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)10、设置系统时钟RCC_SYSCLKConfig;11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource()!=0x08)12、打开要使用的外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()


四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)

/*******************************************************************************

*FunctionName:RCC_Configuration

*Description:RCC配置(使用外部8MHz晶振)

*Input:无

*Output:无

*Return:无

*******************************************************************************/

voidRCC_Configuration(void)

{

/*将外设RCC寄存器重设为缺省值*/

RCC_DeInit();

/*设置外部高速晶振(HSE)*/

RCC_HSEConfig(RCC_HSE_ON);//RCC_HSE_ON——HSE晶振打开(ON)

/*等待HSE起振*/

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)//SUCCESS:HSE晶振稳定且就绪

{

/*设置AHB时钟(HCLK)*/

RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1——AHB时钟=系统时钟

/*设置高速AHB时钟(PCLK2)*/

RCC_PCLK2Config(RCC_HCLK_Div1);//RCC_HCLK_Div1——APB2时钟=HCLK

/*设置低速AHB时钟(PCLK1)*/

RCC_PCLK1Config(RCC_HCLK_Div2);//RCC_HCLK_Div2——APB1时钟=HCLK/2

/*设置FLASH存储器延时时钟周期数*/

FLASH_SetLatency(FLASH_Latency_2);//FLASH_Latency_22延时周期

/*选择FLASH预取指缓存的模式*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//预取指缓存使能

/*设置PLL时钟源及倍频系数*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

//PLL的输入时钟=HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x9

/*使能PLL*/

RCC_PLLCmd(ENABLE);

/*检查指定的RCC标志位(PLL准备好标志)设置与否*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{

}

/*设置系统时钟(SYSCLK)*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟

/*PLL返回用作系统时钟的时钟源*/

while(RCC_GetSYSCLKSource()!=0x08)//0x08:PLL作为系统时钟

{

}

}

/*使能或者失能APB2外设时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|

RCC_APB2Periph_GPIOC,ENABLE);

//RCC_APB2Periph_GPIOAGPIOA时钟

//RCC_APB2Periph_GPIOBGPIOB时钟

//RCC_APB2Periph_GPIOCGPIOC时钟

//RCC_APB2Periph_GPIODGPIOD时钟

}


五、时钟频率

STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。目前TI的M3系列芯片最高频率可以达到80M。

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

文件开头就有一个这样的定义://#define SYSCLK_FREQ_HSEHSE_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_72MHzconst 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_72MHzstatic void SetSysClockTo72(void);

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

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

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


关键字:stm32  时钟源  参数设置 引用地址:stm32的五个时钟源参数设置经验

上一篇:STM32 BSRR BRR ODR寄存器详情解析
下一篇:STM32F407 GPIO口输入配置配置步骤

推荐阅读最新更新时间:2024-11-12 12:10

STM32的GPIO的寄存器配置学习1
本篇文章主要是学习以M3内核的STM32的GPIO的寄存器的配置,为什么要学习寄存器,而不利用库函数呢?我只能说为了让学的知识更加牢固吧!当然,你可以直接去利用库函数,但是如果你能认真读完本篇博客,你会对知识豁然开朗!加油吧! STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH;2 个 32 位的数据寄存器 IDR 和 ODR;1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR;1 个 32 位的锁存寄存器 LCKR;这里我们仅介绍常用的几个寄存器,我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、OD
[单片机]
<font color='red'>STM32</font>的GPIO的寄存器配置学习1
STM32 FreeModbus RTU从机移植以及UART配置
FreeModbus的具体介绍就不提了。至于为什么要移植,大概就是因为移植比较快,而且比较稳定,可以减少因为自己编写出现的漏洞。 但是FreeModbus 1.5版本是没有主机的,因此移植的时候只可以做从机。网上有几个关于Modbus主机的源代码,回头等我弄好了再更新。 ================================== 理论上来说,此处我移植了全部,但是只调试了RTU部分,因此其他部分不做赘述。 移植过程: 1.将modbus目录下所有文件拷贝加入工程。 2.对modbus中的include下的mbconfig.h进行编辑,裁剪其中需要的模块。(此处我没有进行裁剪,因此选项都是默认) 3.将
[单片机]
<font color='red'>STM32</font> FreeModbus RTU从机移植以及UART配置
STM32串口收发数据使用DMA的原因
STM32串口收发数据使用DMA的原因主要有以下几点: 1.提高数据传输效率 :DMA(Direct Memory Access)是一种能够直接从内存中读取或写入数据的硬件设备。在嵌入式系统设计中,DMA技术被广泛应用于数据传输速度较高或需要高效数据传输的场合。而STM32的串口通信是一种高速数据传输方式,因此,使用DMA进行数据收发能够提高数据传输的效率和可靠性。 2.减轻CPU负担 :使用DMA进行串口数据收发可以减轻CPU的负担。在传统的数据收发方式中,CPU需要不断轮询串口状态,读取或写入数据。这种方式不仅会占用大量的CPU资源,而且会降低系统的响应速度。而使用DMA后,数据传输可以在后台进行,无需CPU干预,从而释放CP
[单片机]
STM32学习--PWM测试
  今天针对通用定时器的输入捕获和PWM输出进行了学习测试,使用库函数进行。 1. PWM输出测试 1.1 测试方法   输出测试使用软件调试方法,直接在MDK调试界面的逻辑分析仪进行。软件调试设置网上一堆一堆的,我只描述一下遇到问题点。   图中,软件仿真只用设1、2项,加入硬件调需设第3项。 打开逻辑分析仪,在setup中输入想看的端口,如下图设置。   在端口号上右击,选择bit,然后运行即可看PWM输出的效果。 1.2测试的程序 ① GPIO设置,主要是时钟、复用时钟、推挽输出、由于用默认的映射所以不用GPIO_PinRemapConfig。 void PWMOut_GPIO_Init() { GP
[单片机]
<font color='red'>STM32</font>学习--PWM测试
基于STM32的虚拟多线程(TI_BLE协议栈_ZStack协议栈)
基于STM32的虚拟多线程,可以很好的用于裸机程序中,用于模拟小型操作系统的多线程概念。本实例参考了参考TI_BLE协议栈_ZStack协议栈。 #include Hal_Led/Hal_Led.h #include Hal_delay/delay.h #include Hal_Key/Hal_Key.h #include ringbuffer.h #define APP_LED2_BLINK_EVENT 0x0001 #define HAL_LED1_BLINK_EVENT 0x0001 #define TASK_NO_TASK_RUNNING 0xFF unsigned short Hal_ProcessE
[单片机]
基于<font color='red'>STM32</font>的虚拟多线程(TI_BLE协议栈_ZStack协议栈)
STM32中PWM频率捕获的相关配置
先大体说一下频率捕获 根据我个人的理解 频率捕获用到计数器 当发生定时器中断时(应该就是下图的Autoreload register记满时) 在2个相邻的定时器中断记录2个值 算捕获到的信号的差值 最后的频率就是你的定时器时钟 除以你的捕获的值 当然如果直接调用官方3.5库中的PWM_Input例程中的函数直接捕获 会发现在低于大约980Hz 测量的值会非常不准(STM32F103RBT6下) 这时候就需要使用TIM_TimeBaseInit()进行预分频 参数的配置在于PSC和ARR 下面贴图 两张Prescaler改变后的图 ARR决定的是Autoreload register的装值 上面2张图显示改变PSC后
[单片机]
STM32 串行通信 USART 程序例举
1、串行通信 软件仿真STM32通过串口USART1发送26个英文字母(配置寄存器) /************************************************************************************************** * 硬件平台:STM32F103VC * 学习重点:GPIOx的位绑定 * 实现功能:软件仿真,实现STM32通过USART1发送数据 * 配置寄存器实现(其中打开系统时钟和GPIO引脚的配置是通过库函数实现的,后面会具体讲解) *******************************************************
[单片机]
<font color='red'>STM32</font> 串行通信 USART 程序例举
基于 STM32和机智云物联网平台的农作物需水量统计系统
本文由机智云开发者利用农业物联网的相关优势,搭建了一个基于机智云物联网平台的农作物需水量计算系统,利用传感器采集农作物的现场环境信息后通过 ZigBee 协议发送到数据处理终端,根据设置的作物生长系数计算出对应的作物需水量;同时将相关的数据经过 4G 模块传输至机智云物联网平台,实现用户足不出户即可了解到农作物的相关信息,为制定合理的灌溉制度提供数据参考,达成适时灌溉和节约用水等目的。 1 系统总体设计 基于机智云物联网平台的农作物需水量计算系统,利用嵌入式微控制器采集作物的温湿度、风速环境信息,同时采用 ZigBee 技术进行数据的传输,将采集的作物环境信息传输至数据处理终端;当数据处理终端接收到相关的数据后,对作物需水量进
[单片机]
基于 <font color='red'>STM32</font>和机智云物联网平台的农作物需水量统计系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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