STM32时钟配置方法详解

合集下载

STM32F427xx系列芯片系统时钟讲解

STM32F427xx系列芯片系统时钟讲解

STM32F427xx系列芯片系统时钟讲解——写代码的Tobem 为了进行通用定时器的设置,有必要先了解STM32F427xx系列芯片的时钟系统。

为了实现低功耗(对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗),STM32F427xx设计了功能完善但却有点复杂的时钟系统,见下图:图2 STM32F427xx系统时钟树从图中可以看出,STM32F427xx具有4个时钟源,分别为2个内部时钟源和2个外部时钟源,也可以分为2个高速时钟源和2个低速时钟源,具体为:1、HSE(高速外部时钟):以外部晶振作时钟源,晶振频率可取范围为4~26MHz,实际电路图中我们采用12MHz的晶振。

2、HSI(高速内部时钟):由内部RC振荡器产生,频率为16MHz。

其特点是起振快,在芯片刚上电的时候,就是使用高速内部时钟,但其精度不高,因此,上电之后我们再通过软件配置(SystemInit()函数),转而采用高速外部时钟信号。

3、LSE(低速外部时钟):以外部晶振作时钟源,主要提供给实时时钟模块(RTC),一般采用32.768KHz。

4、LSI(低速内部时钟):由内部RC振荡器产生,频率为32KHz,主要用于驱动独立看门狗,也可选择提供给RTC 用于停机/待机模式下的自动唤醒。

程序在执行主函数main()之前,要先进行堆栈指针SP、程序计数器PC的初始化、设置异常中断向量地址等工作,最后才进入到主函数main()中去执行,这其中包括系统时钟的配置(在startup_stm32f4xx.s启动文件中)。

系统时钟的配置由system_stm32f4xx.c文件中的SystemInit()函数完成,配置结果如下:图3 系统时钟配置情况从时钟树中可以看到,系统时钟SYSCLK是大部分器件的时钟来源,因此SYSCLK的配置就显得十分重要。

SYSCLK可以从三个时钟源中进行选择,分别为HSI、HSE和PLLCLK。

HSI 不稳定,而HSE速率太低(4~26MHz),为了使系统获得较快的运行速率和稳定性,我们选择PLLCLK来作为SYSCLK(见备注1),而PLLCLK又可以选择HSI或者HSE作为时钟源,我们选择HSE作为时钟源(见备注2)根据时钟树的走向,SYSCLK(即PLLCLK)计算过程为:PLL_VCO = (HSE_VALUE / PLL_M) * PLL_NSYSCLK = PLL_VCO / PLL_P而宏定义有#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */#endif /* HSE_VALUE */#define PLL_M 12#define PLL_Q 7#if defined (STM32F427_437xx) || defined (STM32F429_439xx)#define PLL_N 360#define PLL_P 2故SYSCLK最终为180MHz。

STM32F051使用自带时钟48M设置

STM32F051使用自带时钟48M设置
{
}
}
去掉外部晶振后,单片机时钟源会默认的使用内部高速RC振荡器HSI,HSI频率大约为8M,所以要想使系统获得48M的频率需要用PLL倍频后做为系统的时钟,PLL是一个锁相环,专门用来倍频或者分频的。(倍频后所得的频率一般叫PLL时钟)
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08) //µÈ´ýϵͳʱÖÓ³õʼ»¯³É¹¦
whilerccgetsysclksource去掉外部晶振后单片机时钟源会默认的使用内部高速rc振荡器hsihsi频率大约为8m所以要想使系统获得48m的频率需要用pll倍频后做为系统的时钟pll是一个锁相环专门用来倍频或者分频的
正确设置:
void RCC_Configuration(void);
void RCC_Configuration(void)
{
//ÉèÖÃPLLʱÖÓÔ´¼°±¶ÆµÏµÊý
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12);///*!< PLL input clock*12*/
//ʹÄÜPõʼ»¯³É¹¦
这句话的意思是将HSI时钟12倍频,为什么是12倍频而不是6倍频呢?如下图STM32F051系列的时钟树所示:
根据时钟树可以看出用PLL对HSI进行倍频时,硬件将首先对HSI二分频,也就是为4M,所以必须再对其进行12倍频才能变成48M,最后通过RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);语句将PLL时钟作为系统时钟,至此系统的时钟变为48M

STM32F0xx 微控制器的时钟配置介绍

STM32F0xx 微控制器的时钟配置介绍

2 年 05 月
文档 ID 022837 第 1 版
1/16

目录
目录
AN4055
1
术语表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 专家模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4
已知限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
文档 ID 022837 第 1 版
3/16
3
图片索引
图片索引
AN4055
图 1. 图 2. 图 3. 图 4. 图 5. 图 6. 图 7.
时钟结构图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 I2S 时钟结构图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 向导模式用户界面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 选择时钟源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 文件生成错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 专家模式用户界面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 超出系统时钟频率 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

STM32单片机RTC时钟的使用方法及步骤

STM32单片机RTC时钟的使用方法及步骤

STM32单片机RTC时钟的使用方法及步骤以下是使用STM32单片机的RTC时钟的步骤:1.初始化RTC模块:首先,需要在RCC寄存器中使能RTC和LSE(Low-Speed External)晶振模块。

然后,配置RTC的时钟源和预分频器,选择合适的时钟频率。

2.配置RTC时间和日期:通过设置RTC的寄存器来配置当前时间和日期。

需要设置秒、分钟、小时、星期、日期、月份和年份,确保其具有正确的值。

3.启动RTC时钟:设置RTC的控制寄存器,使其开始工作。

可以选择启用或禁用闹钟功能,设置闹钟的时间和日期。

4.读取RTC数据:可以随时读取RTC的时间和日期数据。

读取数据后,可以进行各种计算和处理,如计算两个时间之间的差异、比较时间等。

5.处理RTC中断:可以设置RTC中断来触发一些操作,如闹钟触发时执行一些任务。

需要配置NVIC(Nested Vector Interrupt Controller)中断向量表,使能相应的中断。

6.备份和恢复RTC数据:RTC模块提供了备份寄存器,可以用来存储额外的信息。

可以使用一些特殊的寄存器,如BKP (Backup)寄存器或CPU的系统寄存器来备份和恢复数据。

7.断电维持能力:RTC模块的一个关键特性是其断电维持能力。

即使在断电情况下,RTC模块中的数据仍然能够保持。

可以通过电池供电电路来提供必要的电力。

8.节能模式:可以利用RTC模块的节能模式来降低功耗。

可以选择性地关闭RTC模块的不需要的功能,以减少功耗。

需要注意的是,具体的步骤可能会因芯片型号和开发工具的不同而有所差异。

因此,在使用STM32单片机的RTC时钟之前,需查阅相关的技术文档和参考手册,以了解具体操作步骤和寄存器配置。

以上是使用STM32单片机的RTC时钟的基本步骤。

在实际应用中,可以根据具体需求对RTC进行更多的配置和使用。

STM32F103RC系统时钟配置

STM32F103RC系统时钟配置

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 STM32F103RC 系统时钟配置1、打开D:\program\KEL_MDT_ARM\STM32_Template\USER 目录,找到STM32-DEMO 文件,双击打开,KEIL-uVision4就开始运行了,得到下图:2、双击“STARTCODE ”下面的“start_stm32f10x_hd.s ”打开STM32F103RC 的启动文件,找“SystemInit ”,得到下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司3、点击当前的行,右击鼠标,将光标移动到“Go To Definition Of SystemInit”,见下图:4、点击“Go To Definition Of SystemInit ”,会跳转到system_stm32f10x.c 文件,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司5、在“system_stm32f10x.c ”文件中,在“void SystemInit (void)”函数体内找到“SetSysClock();”,见下图:6、点击“SetSysClock()”,右击鼠标,将光标移动到“Go To Definition Of SystemClock”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 7、点击“Go To Definition Of SystemClock”,会跳转到system_stm32f10x.c 文件,见下图:8、点击“defined SYSCLK_FREQ_72MHz ”,右击鼠标,将光标移到到“Go To Definition Of SYSCLK_FREQ_72MHz ”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司9、点击“Go To Definition Of SYSCLK_FREQ_72MHz ”,会跳转到下图:10、在上图中,我们可以设置所需要的系统时钟,这里设置系统时钟是SYSCLK_FREQ_72MHz ,见下面粘贴的部分#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000#else/* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz 24000000 *//* #define SYSCLK_FREQ_36MHz 36000000 *//* #define SYSCLK_FREQ_48MHz 48000000 *//* #define SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000 //这是我们要设置的系统时钟#endif。

STM32F072从零配置工程-自定义时钟配置详解

STM32F072从零配置工程-自定义时钟配置详解

STM32F072从零配置⼯程-⾃定义时钟配置详解从⾃⼰的板⼦STM32F407⼊⼿,参考官⽅的SystemInit()函数:核⼼在SetSysClock()这个函数,官⽅默认是采⽤HSE(设定为8MHz)作为PLL锁相环的输⼊输出168MHz的SYSCLK;/*** @brief Setup the microcontroller system* Initialize the Embedded Flash Interface, the PLL and update the* SystemFrequency variable.* @param None* @retval None*/void SystemInit(void){/* Reset the RCC clock configuration to the default reset state ------------*//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;/* Reset CFGR register */RCC->CFGR = 0x00000000;/* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset PLLCFGR register */RCC->PLLCFGR = 0x24003010;/* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF;/* Disable all interrupts */RCC->CIR = 0x00000000;/* Configure the System clock source, PLL Multiplier and Divider factors,AHB/APBx prescalers and Flash settings ----------------------------------*/SetSysClock();}这⾥⼤致分析⼀下官⽅默认的SetSysClock()配置:由于我个⼈采⽤的是STM32F407型号的芯⽚,因此精简⼀下函数;总体思路的话:使能HSE;等待HSE初始化完毕,进⾏下⼀步设置;设置HCLK、PCLK1、PCLK2的分频系数;配置PLL,使能PLL,等待PLL初始化完毕;选择PLL作为SYSCLK,等待SYSCLK时钟设置完毕;/*** @brief Configures the System clock source, PLL Multiplier and Divider factors,* AHB/APBx prescalers and Flash settings* @Note This function should be called only once the RCC clock configuration* is reset to the default reset state (done in SystemInit() function).* @param None* @retval None*/static void SetSysClock(void){/******************************************************************************//* PLL (clocked by HSE) used as System clock source *//******************************************************************************/__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* Enable HSE */RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){else{HSEStatus = (uint32_t)0x00;}if (HSEStatus == (uint32_t)0x01){/* Select regulator voltage output Scale 1 mode */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;/* PCLK2 = HCLK / 1*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;/* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);/* Enable the main PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till the main PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; /* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS; /* Select the main PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;/* Wait till the main PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}else{ /* If HSE fails to start-up, the application will have wrong clockconfiguration. User can add here some code to deal with this error */}}在官⽅的基础上,直接设定HSE作为SYSCLK时钟:初始化HSE;等待HSE初始化成功后再继续;设置调压器电压输出级别为1以便使器件在最⼤频率⼯作;设置HCLK、PCLK1、PCLK2分频系数;设置HSE作为系统时钟;void HSE_SetSysClock(void){__IO uint32_t HSEStartUpStatus = 0; /* 开启HSE时钟 */ /* 此函数从stm32f0xx_rcc.c获取,⽤于配置外部时钟HSE: * 有三个配置:RCC_HSE_OFF关闭外部HSE时钟 * RCC_HSE_ON开始外部HSE晶振 * RCC_HSE_Bypass开始HSE旁路设置 */ RCC_HSEConfig(RCC_HSE_ON); /* 若时钟配置成功 */if(HSEStartUpStatus == SUCCESS){RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div1); /* 将SYSCLK系统时钟设置为HSE */RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); /* 等待SYSCLK系统时钟设置成功 */while(RCC_GetSYSCLKSource() != 0x04){}}else{while(1);}}使⽤HSI经过PLL配置系统时钟:使能HSI时钟;获取HSI状态并等待HSI稳定;设置调节器电压输出级别配置为1;设置HCLK、PCLK1/2分频系数;设置PLL时钟分频系数;使能PLL并等待PLL稳定后配置PLL状态;设置PLL作为SYSCLK时钟并等待设置完成;void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q) {__IO uint32_t HSIStartUpStatus = 0;/* 去初始化RCC */RCC_DeInit();/* 使能HSI时钟 */RCC_HSICmd(ENABLE);/* 从RCC的CR寄存器中获取HSI配置状态 */HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;/* 若HSI配置成功 */if(HSIStartUpStatus == RCC_CR_HSIRDY){/* 配置调节器电压输出级别为1 */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* 配置SYSCLK到HCLK的分频系数为1 */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 配置HCLK到PCLK1/2的分频系数为2/4 */RCC_PCLK2Config(RCC_HCLK_Div2);RCC_PCLK1Config(RCC_HCLK_Div4);/* 配置PLL参数,选⽤HSI作为PLL参数,同时使能PLL */RCC_PLLConfig(RCC_PLLSource_HSI, m, n, p, q);RCC_PLLCmd(ENABLE);/* 等待PLL设置完成 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); FLASH->ACR = FLASH_ACR_PRFTEN| FLASH_ACR_ICEN| FLASH_ACR_DCEN| FLASH_ACR_LATENCY_5WS;RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource() != 0x08);}else{while(1);}}HAL时钟配置分析:与STM32标准外设库不同,HAL库来实现时钟配置需要重新适应配置⽅式,但是本质的寄存器调动是类似不变的,且配置的过程也和STM32标准外设库相似;参考使⽤STMCube⽣成的代码,时钟树如图所⽰:在STM32Cube中设置:HSE设置为Crystal/Ceramic Resonator,Input Frequency设置为16MHz;在⼯程中要配置的参数:第⼀个HSE_VALUE参数位于stm32f0xx_hal_conf.h中,此参数与在STMCube时钟树上定义的⼀致,需要⼿动设置为实际的参数值;第⼆个HSE_VALUE参数位于system_stm32f0xx.c中,此参数默认为8MHz,可以通过⽤户程序来提供和调整;第三个SystemCoreClock参数位于system_stm32f0xx.c中,其默认值也是8MHz,可以根据以下三种⽅式来更新: 调⽤CMSIS函数SystemCoreClockUpdate()、 调⽤HAL API函数HAL_RCC_GetHCLKFreq()、 调⽤HAL_RCC_ClockConfig();/*** @brief Adjust the value of External High Speed oscillator (HSE) used in your application.* This value is used by the RCC HAL module to compute the system frequency* (when HSE is used as system clock source, directly or through the PLL).*/#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */#endif /* HSE_VALUE */#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)8000000)/*!< Default value of the External oscillator in Hz.This value can be provided and adapted by the user application. */#endif /* HSE_VALUE *//** @addtogroup STM32F0xx_System_Private_Variables* @{*//* This variable is updated in three ways:1) by calling CMSIS function SystemCoreClockUpdate()2) by calling HAL API function HAL_RCC_GetHCLKFreq()3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequencyNote: If you use this function to configure the system clock there is no need to call the 2 first functions listed above, since SystemCoreClock variable is updated automatically.uint32_t SystemCoreClock = 8000000;实际的时钟配置函数如下图:使⽤了三个参数来配置:RCC_OscInitStruct⽤来配置外部时钟参数,这⾥设置晶振类型为HSE、设置HSE的状态为开启状态、不使⽤PLL;RCC_ClkInitStruct⽤来配置系统时钟内的参数(如Sys CLK、HCLK、PCLK1),这⾥设置要配置的时钟类型为HCLK、SYSCLK、PCLK1,选择HSE时钟作为SYSCLK的时钟源,并设置系统时钟SYSCLK分频系数为0、HCLK的分频系数为4;PeriphClkInit⽤来配置外设时钟的时钟源,这⾥设置USART1/2的时钟源为PCLK1;/*** @brief System Clock Configuration* @retval None*/void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the CPU, AHB and APB busses clocks*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;art1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;art2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}HAL_SYSTICK_Config(SystemCoreClock / 1000);HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);}这⾥加⼊了对SysTick的时钟配置,参考HAL库本⾝的设置:HAL_SYSTICK_Config()⽤来配置使能和配置SysTick寄存器;HAL_SYSTICK_CLKSourceConfig()选择AHB时钟(或AHB时钟除以8)作为SysTick时钟源;HAL_NVIC_SetPriority()配置SysTick_IRQn的中断优先级为0,默认为最⾼;。

STM32时钟详细配置

STM32时钟详细配置

STM32时钟配置STM32时钟配置步骤// 开启HSI时钟寄存器操作1).开启高速时钟HSE // 设置时钟控制寄存器RCC_CR 位16 置1使能RCC->CR|= 0x00010000;位16 :HSEON:外部高速时钟使能当进入待机和停止模式时,该位由硬件清零,关闭4-16MHz外部振荡器。

当外部4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被清零。

2).等待高速时钟就绪// 读取时钟控制寄存器RCC_CR位17为1就位while(!(RCC-> CR>>17));位17:HSERDY:外部高速时钟就绪标志由硬件置’1’来指示外部4-16MHz振荡器已经稳定。

在HSEON位清零后,该位需要6个外部4-25MHz振荡器周期清零。

3).设置APB1,APB2,AHB分频系数// 设置时钟配置寄存器RCC_CFGRRCC_CFGR=0x00000400;(AHB :位4-7, (低速)APB1 :位8-10, (高速)APB2 :位11-13)位7:4:HPRE[3:0]:AHB预分频(AHB Prescaler)0xxx:SYSCLK不分频位10:8:PPRE1[2:0]:低速APB预分频(APB1) 100:HCLK 2分频位13:11:PPRE2[2:0]:高速APB预分频(APB2) 0xx:HCLK不分频4).设置PLL倍频// 配置时钟配置寄存器RCC_CFGR 位18-21RCC_CFGR|=7<<18;位21:18:PLLMUL:PLL倍频系数0111:PLL 9倍频输出5).PLL输入时钟源选择// 配置时钟配置寄存器RCC_CFGR 位16RCC_CFGR|=1<<16;位16:PLLSRC:PLL输入时钟源(PLL entry clock source) 1:HSE时钟作为PLL输入时钟。

由软件置’1’或清’0’来选择PLL输入时钟源。

STM32时钟配置方法详解

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、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);03、等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();04、设置AHB时钟RCC_HCLKConfig;05、设置高速AHB时钟RCC_PCLK2Config;06、设置低速速AHB时钟RCC_PCLK1Config;07、设置PLL RCC_PLLConfig;08、打开PLL RCC_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晶振)/******************************************************************************** Function Name : RCC_Configuration* Description : RCC配置(使用外部8MHz晶振)* Input : 无* Output : 无* Return : 无*******************************************************************************/void RCC_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_2 2延时周期/*选择FLASH预取指缓存的模式*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);// PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9/*使能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_GPIOA GPIOA时钟//RCC_APB2Periph_GPIOB GPIOB时钟//RCC_APB2Periph_GPIOC GPIOC时钟//RCC_APB2Periph_GPIOD GPIOD时钟}五、时钟频率STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。

STM32单片机RTC时钟的使用方法及步骤

STM32单片机RTC时钟的使用方法及步骤

STM32单片机RTC时钟的使用方法及步骤一、配置RTC模块时钟源RTC模块的时钟源可以选择外部低速晶振(LSE)或者低速内部时钟(LSI)。

通过以下步骤配置RTC时钟源:1.使能外部低速晶振(LSE)或者低速内部时钟(LSI)。

例如,如果使用外部低速晶振,则需要使能相应的GPIO端口,并配置为晶振模式。

2.配置RCC时钟控制寄存器(RCC_CR)和时钟配置寄存器(RCC_CSR)。

二、使能RTC模块时钟1.使能PWR模块时钟和备份寄存器访问。

RCC_APB1ENR,=(1<<28);RCC_APB1ENR,=(1<<27);2.校验并关闭RTC模块。

RCC->BDCR,=RCC_BDCR_RTCEN;PWR->CR,=PWR_CR_DBP;if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0)RCC->BDCR,=RCC_BDCR_RTCEN;3.配置RTC时钟预分频器和提供给RTC的时钟源。

RTC->PRER ,= rtc_prescaler_value << RTC_PRER_PREDIV_S_Pos;RTC->PRER ,= 127 << RTC_PRER_PREDIV_A_Pos;RTC->CR&=~RTC_CR_FMT;三、配置RTC模块时间和日期1.关闭RTC时钟写保护功能。

RTC->WPR=0xCA;RTC->WPR=0x53;RTC->ISR,=RTC_ISR_INIT;while((RTC->ISR & RTC_ISR_INITF) == 0);2.配置RTC的时间和日期寄存器。

RTC->TR ,= (uint32_t)((hours / 10) << RTC_TR_Hours10_Pos);RTC->TR ,= (uint32_t)((hours % 10) << RTC_TR_Hours1_Pos);RTC->TR ,= (uint32_t)((minutes / 10) <<RTC_TR_Minutes10_Pos);RTC->TR ,= (uint32_t)((minutes % 10) <<RTC_TR_Minutes1_Pos);RTC->TR ,= (uint32_t)((seconds / 10) <<RTC_TR_Seconds10_Pos);RTC->TR ,= (uint32_t)((seconds % 10) <<RTC_TR_Seconds1_Pos);RTC->DR ,= (uint32_t)((year / 10) << RTC_DR_YT_Pos);RTC->DR ,= (uint32_t)((year % 10) << RTC_DR_YU_Pos);RTC->DR ,= (uint32_t)((month / 10) << RTC_DR_MT_Pos);RTC->DR ,= (uint32_t)((month % 10) << RTC_DR_MU_Pos);RTC->DR ,= (uint32_t)((day / 10) << RTC_DR_DT_Pos);RTC->DR ,= (uint32_t)((day % 10) << RTC_DR_DU_Pos);3.开启RTC时钟写保护功能。

STM32F103ZET6时钟

STM32F103ZET6时钟

STM32F103ZET6时钟1、STM32F103ZET6时钟说明 STM32F103ZET6的时钟树图如下所⽰: STM32F103ZET6有很多个时钟源,分别有: HSE:⾼速外部时钟信号。

HSI:⾼速内部部时钟信号。

LSI:低速内部时钟信号。

LSE:低速外部时钟信号。

HSI和LSI是芯⽚内置的时钟源,它们的频率⼤⼩是固定的,HSI是8MHZ,LSI是⼤约40KHZ。

时钟树中的序号1是⾼速外部时钟信号HSE: HSE是由有源晶振或⽆源晶振通过OSC_OUT和OSC_IN脚提供的,从图⽚中可以看到,HSE频率从4MHZ到16MHZ不等。

当使⽤有源晶振时,时钟从OSC_IN引脚进⼊,OSC_OUT引脚悬空;当使⽤⽆源晶振时,时钟从OSC_IN和OSC_OUT进⼊,并且要配谐振电容。

HSE最常使⽤的就是8MHZ的⽆源晶振。

时钟树中的序号D是外部低速时钟LSE: LSE是由有源晶振或⽆源晶振通过OSC32_OUT和OSC32_IN脚提供的。

LSE⼀般使⽤的是32.768KHZ的⽆源晶振。

时钟树中的序号2是选择PLL(倍频后的时钟)的时钟源: 从图中可以看出,PLL时钟的来源可以是HSE或HSI/2,通过PLLSRC(CFGR寄存器的bit16)来选择使⽤哪⼀个时钟源。

HSI是8MHZ的内部⾼速时钟信号,HSI会根据温度和环境的情况频率会有漂移,⼀般不作为PLL的时钟来源。

⼀般使⽤HSE作为PLL的时钟源。

时钟树中的序号3是设置PLL的倍频因⼦: 可以对PLL的时钟来源进⾏倍频,然后得到PLLCLK时钟源。

倍频因⼦可以通过时钟配置寄存器CFGR的bit21~bit18:PLLMUL[3:0]来配置,分别可配置成2、3、4、5、6、7、8、9、10、11、12、13、14、15、16倍频。

举个例⼦来说,如果选择HSE作为PLL的时钟源,⽽且HSE=8MHZ,且将PLL的倍频因⼦设置为9倍频,那么PLLCLK=9*8MHZ = 72MZH。

STM32f407系统定时器时钟配置计算

STM32f407系统定时器时钟配置计算

STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。

STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。

通过软件配置,我们可以选择其中一种时钟源。

1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。

具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。

b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。

具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。

配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。

系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。

重载值是计数器的初始值,当计数器减到0时,会触发定时中断。

举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。

中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。

配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。

STM32时钟配置方法详解

STM32时钟配置方法详解

STM32时钟配置方法详解STM32是意法半导体(STMicroelectronics)公司推出的一系列32位Flash微控制器,被广泛应用于各种嵌入式系统中。

时钟是STM32微控制器的核心部分,正确配置时钟可以确保系统正常工作并达到预期的性能。

本文将详细介绍STM32时钟配置的方法。

1.时钟源:STM32微控制器提供了多个时钟源,包括内部时钟(HSI、LSI)和外部时钟(HSE、LSE)。

其中,HSI(高速内部时钟)是一个高频率(通常为8MHz)的内部RC振荡器,适用于低功耗应用;LSI(低速内部时钟)是一个低频率(通常为40kHz)的内部RC振荡器,用于RTC(实时时钟)模块;HSE(高速外部时钟)是一个外接的高频晶振,用于提供更精确的时钟信号;LSE(低速外部时钟)是一个外接的低频晶振,适用于RTC模块。

2.主频和系统时钟:主频是指CPU的时钟频率,系统时钟是指STM32微控制器的总线时钟,包括AHB(高性能总线)、APB1(低速外设总线)和APB2(高速外设总线)。

在进行STM32时钟配置之前,需要按照以下几个步骤来完成。

1.启用对应的时钟源:根据具体需求,选择合适的时钟源并启用相应的时钟。

可以通过设置RCC_CR寄存器和RCC_APB1ENR/RCC_APB2ENR寄存器来实现。

例如,要使用HSE作为时钟源,需要首先启用HSE时钟。

2.配置时钟分频器:为了使系统时钟不超过芯片规格要求的最大频率,需要对时钟进行分频。

分频器有两个,即AHB分频器和APB分频器。

可以通过设置RCC_CFGR寄存器来实现。

例如,将AHB分频器设置为8,将APB1和APB2分频器分别设置为4,可以将主频分别分频为8MHz、32MHz和64MHz。

3.等待时钟稳定:当启用外部时钟源时,需要等待时钟稳定。

可以通过读取RCC_CR寄存器的特定标志位来判断时钟是否稳定。

4. 配置Flash存储器的延时:根据主频的不同,需要设置Flash存储器的访问延时,以确保正常读写数据。

stm32外部时钟模式1

stm32外部时钟模式1

stm32外部时钟模式1基础了解时钟选择计数器时钟可由下列时钟源提供:●内部时钟(CK_INT)●外部时钟模式1:外部输⼊脚(TIx)●外部时钟模式2:外部触发输⼊(ETR)●内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器在平常使⽤中我们系统复位 000 默认使⽤内部时钟源外部时钟源1来⾃定时器⾃⾝输⼊通道1或通道2的输⼊信号,经过极性选择和滤波以后⽣成的触发信号,连接到从模式控制器,进⽽控制计数器的⼯作;来⾃通道1的输⼊信号经过上升沿、下降沿双沿检测⽽⽣成的脉冲信号进⾏逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。

//SIGNAL_COUNT(GPIO)#define SIGNAL_COUNT_ENA_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //PB0#define SIGNAL_COUNT_ENA_GPIO_Port (GPIOB)#define SIGNAL_COUNT_ENA_Pin (GPIO_PIN_0)#define SIGNAL_COUNT_DIR_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() //PA7#define SIGNAL_COUNT_DIR_GPIO_Port (GPIOA)#define SIGNAL_COUNT_DIR_Pin (GPIO_PIN_7)#define SIGNAL_COUNT_DIR_Get_IRQn (EXTI9_5_IRQn) //EXTI7中断//SIGNAL_COUNT(AFIO & TIM)#define SIGNAL_COUNT_PUL_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() //PA6#define SIGNAL_COUNT_PUL_GPIO_Port (GPIOA)#define SIGNAL_COUNT_PUL_Pin (GPIO_PIN_6)#define SIGNAL_COUNT_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE() //TIM3#define SIGNAL_COUNT_Get_TIM (TIM3)#define SIGNAL_COUNT_Get_HTIM (htim3)//GPIO输⼊#define SIGNAL_COUNT_READ_DIR_IO() (SIGNAL_DIR_GPIO_Port -> IDR & SIGNAL_DIR_Pin)#define SIGNAL_COUNT_READ_ENA_IO() (SIGNAL_ENA_GPIO_Port -> IDR & SIGNAL_ENA_Pin)//TIM输⼊#define SIGNAL_COUNT_READ_COUNT() (SIGNAL_COUNT_Get_TIM -> CNT)//TIM输出#define SIGNAL_COUNT_UP() (SIGNAL_COUNT_Get_TIM -> CR1 &= ~(TIM_CR1_DIR))#define SIGNAL_COUNT_DOWN() (SIGNAL_COUNT_Get_TIM -> CR1 |= (TIM_CR1_DIR))/*** @brief TIM_SIGNAL_PUL初始化* @param NULL* @retval NULL**/void REIN_TIM_SIGNAL_COUNT_Init(void){/* GPIO初始化 */GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable*/SIGNAL_COUNT_PUL_CLK_ENABLE(); //启⽤SIGNAL_COUNT_PUL端⼝时钟/*Configure GPIO pin*/GPIO_InitStruct.Pin = SIGNAL_COUNT_PUL_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输⼊模式GPIO_InitStruct.Pull = GPIO_NOPULL; //禁⽤上下拉HAL_GPIO_Init(SIGNAL_COUNT_PUL_GPIO_Port, &GPIO_InitStruct);/* TIM初始化 */TIM_SlaveConfigTypeDef sSlaveConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};SIGNAL_COUNT_TIM_CLK_ENABLE(); //启⽤TIM时钟SIGNAL_COUNT_Get_HTIM.Instance = SIGNAL_COUNT_Get_TIM;SIGNAL_COUNT_Get_HTIM.Init.Prescaler = 0; //预分频:0SIGNAL_COUNT_Get_HTIM.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数SIGNAL_COUNT_Get_HTIM.Init.Period = 65535; //16位周期SIGNAL_COUNT_Get_HTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //不分频SIGNAL_COUNT_Get_HTIM.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //禁⽤⾃动重新加载if (HAL_TIM_Base_Init(&SIGNAL_COUNT_Get_HTIM) != HAL_OK){Error_Handler();}sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; //外部时钟模式sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; //TI1FP1sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; //上升沿触发sSlaveConfig.TriggerFilter = 4; //滤波参数(FDIV2_N6)if (HAL_TIM_SlaveConfigSynchro(&SIGNAL_COUNT_Get_HTIM, &sSlaveConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; //主机模式触发复位sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; //禁⽤主机模式if (HAL_TIMEx_MasterConfigSynchronization(&SIGNAL_COUNT_Get_HTIM, &sMasterConfig) != HAL_OK){Error_Handler();}/*begin work*/HAL_TIM_Base_Start(&SIGNAL_COUNT_Get_HTIM);}static void Signal_Count_Capture_Goal(void){//SignalPort获取⽬标//读取En_Pinif(SIGNAL_COUNT_READ_ENA_IO()){if(sg_cut.en_inve)sg_cut.en_valid = true;elsesg_cut.en_valid = false;}else{if(sg_cut.en_inve)sg_cut.en_valid = false;elsesg_cut.en_valid = true;}//采样(对⽐上次的计数值)sg_cut.sampling_count_last = sg_cut.sampling_count;sg_cut.sampling_count = SIGNAL_COUNT_READ_COUNT();sg_cut.sampling_count_sub = sg_cut.sampling_count - sg_cut.sampling_count_last;//采样(缓冲输出)//(采样数/细分数)*Move_Divide_NUM = 电机输出步数sg_cut.interp_out = sg_cut.sampling_count_sub * sg_cut.subdivide_form;//输出if(sg_cut.en_valid){signal_moreio.goal_location = sg_cut.interp_out; //Count模式借⽤⽬标位置存放⽬标位置增量 signal_moreio.goal_disable = false;signal_moreio.goal_brake = false;}else{signal_moreio.goal_location = 0; //Count模式借⽤⽬标位置存放⽬标位置增量signal_moreio.goal_disable = true;signal_moreio.goal_brake = false;}}。

STM32CubeMX配置SystemTick时钟

STM32CubeMX配置SystemTick时钟

STM32CubeMX配置SystemTick时钟STM32CubeMX自动生成SYSTICK配置1.SYSTICK原理及其寄存器1.1 SYSTICK原理SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。

只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。

1.2SYSTICK寄存器CTRL: Systick控制和状态寄存器LOAD: Systick重装载寄存器VAL: Systick当前值寄存器CALIB: Systick校准值寄存器CLKCOURCE-时钟源0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M 1:内核时钟(HCLK) 72MCURRENT: 每经过一个Systick时钟周期,寄存器值-1 。

2.STM32CubeMX配置与代码生成如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。

自动代码生成如下:/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000); // = /8/1000 :1000 is 1ms ;1000000 is 1us/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK _DIV8); /* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3.相关重要的函数3.1中断处理函数void SysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();HAL_SYSTICK_IRQHandler();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */}__IO uint32_t uwTick;__weak void HAL_IncTick(void){uwTick += uwTickFreq;}每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。

STM32CubeMX配置SystemTick时钟

STM32CubeMX配置SystemTick时钟

STM32CubeMX自动生成SYSTICK配置1.SYSTICK原理及其寄存器1.1 SYSTICK原理SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。

只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。

1.2SYSTICK寄存器CTRL: Systick控制和状态寄存器LOAD: Systick重装载寄存器VAL: Systick当前值寄存器CALIB: Systick校准值寄存器CLKCOURCE-时钟源0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M 1:内核时钟(HCLK) 72MCURRENT: 每经过一个Systick时钟周期,寄存器值-1 。

2.STM32CubeMX配置与代码生成如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。

自动代码生成如下:/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000); // =/8/1000 :1000 is 1ms ;1000000 is 1us/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); /* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3.相关重要的函数3.1中断处理函数void SysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();HAL_SYSTICK_IRQHandler();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */}__IO uint32_t uwTick;__weak void HAL_IncTick(void){uwTick += uwTickFreq;}每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。

STM32时钟配置方法详解

STM32时钟配置方法详解

STM32时钟配置方法详解时钟树是STM32微控制器中一系列时钟源和时钟分频器的组成部分。

时钟树包括系统时钟、外设时钟和内核时钟。

系统时钟用于驱动整个微控制器系统的核心,外设时钟用于驱动各种外设,内核时钟用于驱动CPU的运算。

在进行时钟配置之前,首先需要了解系统所需的时钟频率。

在STM32中,系统时钟可以通过多种方式进行配置,例如使用外部晶体、外部时钟、内部RC振荡器或者PLL(锁相环)等方式。

外部晶体是一种常用的时钟源,可以提供高精度的时钟频率。

在使用外部晶体时,首先需要设置PLL的时钟源为外部晶体,并设置PLL输入除频器的分频系数。

然后,再根据系统所需的时钟频率,设置PLL的倍频系数,以得到最终的系统时钟频率。

外部时钟是从外部提供的时钟信号,一般用于测试和调试。

使用外部时钟时,需要设置PLL的时钟源为外部时钟,并设置PLL的倍频系数,以得到所需的系统时钟频率。

内部RC振荡器是一种低成本的时钟源,但是其频率不如外部晶体稳定和精确。

在使用内部RC振荡器时,需要设置PLL的时钟源为内部RC振荡器,并设置PLL的倍频系数,以得到所需的系统时钟频率。

PLL是一种用于产生稳定高频时钟的电路,可以从一个低频时钟源产生一个高频时钟源。

使用PLL时,需要设置其输入时钟源和倍频系数。

系统时钟的分频系数可以通过RCC_CFGR寄存器进行设置。

RCC_CFGR寄存器的各个位域用于配置系统时钟的分频系数,包括分频因子、APB1的分频系数、APB2的分频系数等。

外设时钟是用于驱动外设的时钟,可以由系统时钟分频得到。

外设时钟的分频系数可以通过RCC_CFGR寄存器及各个外设的控制寄存器进行设置。

内核时钟是用于驱动CPU的运算的时钟。

在STM32微控制器中,CPU 时钟可以由系统时钟分频得到,分频系数可以通过RCC_CFGR寄存器和FLASH_ACR寄存器进行设置。

除了上述方法之外,STM32还可以使用时钟配置工具进行时钟配置。

STM32f407系统定时器时钟配置、计算

STM32f407系统定时器时钟配置、计算

STM32f407系统定时器时钟配置、计算STM32f407系统定时器时钟配置、计算1. 外部晶振的选择##确定自己单片机的外部晶振系统默认配置为25M,即打开官方库文件参数HSE Frequency(Hz) 一般为25000000HSE Frequency(Hz) | 25000000----------#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)25000000) /*!<Value of the External oscillator in Hz */#endif /* HSE_VALUE */... ... ...我自己的单片机外部晶振为8M,将参数改为80000002. 系统时钟确定2.1 改完之后参照stm32f4时钟树2.2 首先明确自己的系统总时钟找到自己程序PLL Parameters部分(工程system_stm32f4xx.c) /************************* PLL Parameters***************************//* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ //锁相环压腔振荡器时钟//PLL_VCO =(HSE_VALUE/PLL_M)* PLL_N=8/ 8* 336 = 336MHz#define PLL_M 8#define PLL_N 336/* SYSCLK = PLL_VCO / PLL_P */// 系统时钟SYSCLK = PLL_VCO / PLL_P=336 / 2 = 168MHz #define PLL_P 2/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ //USB,SD卡时钟= PLL_VCO / PLLQ=336 / 7 = 48MHz#define PLL_Q 7/************************************************************** *****/3. 计算出自己系统时钟为168M##3.1 对应时钟线这里需要计算各个定时器分配所得的计数时钟频率3.2 找到APB1,APB2配置部分3.3 程序位置/* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;/* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);3.4 位置计算15:13位为 010 ----->AHB2 不分频12:10位为 101 ----->AHB1 4分频e. 原则“非1即2”明确APB1得到时钟84M,APB2计数时钟频率168M 4. 系统默认情况:4.1 定时周期、频率的计算/****************************************************默认配置:外部时钟启动失败,系统会自动使用内部时钟*HCLK = SYSCLK / 1 = 168MHz ,AHB×总线时钟*PCLK2 = HCLK / 2 = 84MHz*PCLK1 = HCLK / 4 = 42MHz* arr:自动重装载值* psc:时钟预分频树* 定时器溢出时间计算方法:T out=((arr+1)*(psc+1))/Ft us.* Ft=定时器工作频率,单位:Mhz*****************************************************/ 4.2 实例验证演示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 为推挽输出并输。

相关文档
最新文档