stm32时钟详细说明

合集下载

stm32单片机时钟

stm32单片机时钟

stm32单⽚机时钟stm32 单⽚机时钟学习以及分析1 引⾔:单⽚机(Microcontrollers),采⽤超⼤规模集成电路技术把具有数据处理能⼒的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O⼝和中断系统、定时器/计数器等功能(可能还包括显⽰驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到⼀块硅⽚上构成的⼀个⼩⽽完善的微型计算机系统,在⼯业控制领域⼴泛应⽤。

单⽚机时钟可以说如同⼈的⼼脏那样重要,我们在⼼脏的搏动下进⾏⾃⼰的⽣命活动,同样的单⽚机在时钟下进⾏⾃⼰的控制活动。

2 时钟的分类:单⽚机的时钟分为内部时钟与外部时钟:⼀般⽽⾔,内部时钟集成在芯⽚内部(RC振荡电路),其精度⽐较低;外部时钟,顾名思义,存在于芯⽚外部(晶体或陶瓷谐振器),可以为系统提供精确的时钟。

晶振是给单⽚机提供⼯作信号脉冲的,如图所⽰的为外部晶振,频率为4MHz,我们常⽤的晶振频率为12MHz,单⽚机⼯作时,是⼀条⼀条地从RoM中取指令,然后⼀步⼀步地执⾏。

单⽚机访问⼀次存储器的时间,称之为⼀个机器周期,这是⼀个时间基准。

—个机器周期包括12个时钟周期。

如果⼀个单⽚机选择了12MHz晶振,它的时钟周期是1/12us,它的⼀个机器周期是12×(1/12)us,也就是1us。

有些晶振的频率并数是整数,如:11.0592MHz的晶振。

单⽚机在进⾏串⾏通信时,常⽤的波特率为1200,2400,4800,9600,115200等,为了适应单⽚机的串⼝通讯波特率的计算⽽来的。

⽤11.0592MHz晶振经过相应的分频或者倍频后刚好能够得出⼀个整数的波特率,这样在上位机和下位机的同步⽅⾯⽐较⽅便。

3 stm32的时钟来源这⾥以stm32f1系列的芯⽚为例。

由上⾯可知,系统的时钟来源有内部时钟与外部时钟,详细的来说stm32f1有五个时钟源:HSI(⾼速内部时钟)HSE(⾼速外部时钟)LSI(低速内部时钟)LSE(低速外部时钟)PLL(锁相环倍频输出)每⼀个时钟都可以独⽴的开启与关闭。

STM32系列MCU硬件实时时钟(RTC)应用笔记说明书

STM32系列MCU硬件实时时钟(RTC)应用笔记说明书

2017年6月Doc ID 018624 Rev 1 [English Rev 5]1/45AN3371应用笔记在 STM32 F0、F2、F3、F4 和 L1 系列MCU 中使用硬件实时时钟(RTC )前言实时时钟 (RTC) 是记录当前时间的计算机时钟。

RTC 不仅应用于个人计算机、服务器和嵌入式系统,几乎所有需要准确计时的电子设备也都会使用。

支持 RTC 的微控制器可用于精密计时器、闹钟、手表、小型电子记事薄以及其它多种设备。

本应用笔记介绍超低功耗中等容量、超低功耗大容量、F0、F2和 F4 系列器件微控制器中嵌入式实时时钟 (RTC) 控制器的特性,以及将 RTC 用于日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用时所需的配置步骤。

本应用笔记提供了含有配置信息的示例,有助于您快速准确地针对日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用配置 RTC 。

注:所有示例和说明均基于 STM32L1xx 、STM32F0xx 、STM32F2xx 、STM32F4xx 和STM32F3xx 固件库,以及 STM32L1xx (RM0038)、STM32F0xx (RM0091)、STM32F2xx (RM0033)、STM32F4xx (RM0090)、STM32F37x (RM0313) 和 STM32F30x(RM0316) 的参考手册。

本文提到的STM32 指超低功耗中等容量、超低功耗大容量、F0、F2 和 F4 系列器件。

超低功耗中等 (ULPM) 容量器件包括 STM32L151xx 和 STM32L152xx 微控制器,Flash 容量在 64 KB 到 128 KB 之间。

超低功耗大 (ULPH) 容量器件包括 STM32L151xx 、STM32L152xx 和 STM32L162xx 微控制器,Flash 容量为 384 KB 。

F2 系列器件包括 STM32F205xx 、STM32F207xx 、STM32F215xx 和 STM32F217xx 微控制器。

STM32-RTC实时时钟-毫秒计时实现

STM32-RTC实时时钟-毫秒计时实现

STM32-RTC实时时钟-毫秒计时实现OS:Windows 64Development kit:MDK5.14IDE:UV4MCU:STM32F103C8T61、RTC时钟简介 STM32 的实时时钟(RTC)是⼀个独⽴的定时器,在相应软件配置下,可提供时钟⽇历的功能。

详细资料请参考ALIENTEK的官⽅⽂档——《STM32F1开发指南(精英版-库函数版)》,以下为博主摘录要点:RTC 模块和时钟配置系统(RCC_BDCR 寄存器)在后备区域,系统复位后,会⾃动禁⽌访问后备寄存器和 RTC ,所以在要设置时间之前,先要取消备份区域(BKP)的写保护RTC 内核完全独⽴于 RTC APB1 接⼝,⽽软件是通过 APB1 接⼝访问 RTC 的预分频值、计数器值和闹钟值,因此需要等待时钟同步,寄存器同步标志位(RSF)会硬件置1RTC相关寄存器包括:控制寄存器(CRH、CRL)、预分频装载寄存器(PRLH、PRLL)、预分频器余数寄存器(DIVH、DIVL)、计数寄存器(CNTH、CNTL)、闹钟寄存器(ALRH、ALRL)STM32备份寄存器,存RTC校验值和⼀些重要参数,最⼤字节84,可由VBAT供电计数器时钟频率:RTCCLK频率/(预分频装载寄存器值+1)2、软硬件设计 由于RTC是STM32芯⽚⾃带的时钟资源,所以⾃主开发的时候只需要在设计时加上晶振电路和纽扣电池即可。

编程时在HARDWARE⽂件夹新建 rtc.c、rtc.h ⽂件。

3、时钟配置与函数编写 为了使⽤RTC时钟,需要进⾏配置和时间获取,基本上按照例程来写就可以了。

为避免零散,我将附上完整代码。

函数说明如下:rtc.c中需要编写的函数列表RTC_Init(void)配置时钟RTC_NVIC_Config(void)中断分组RTC_IRQHandler(void)秒中断处理RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)设置时间RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8sec)闹钟设置RTC_Get(void)获取时钟RTC_Get_Week(u16 year,u8 month,u8 day)星期计算Is_Leap_Year(u16 year)闰年判断 事实上,以上函数并不都要,闹钟没有⽤到的话就不要,秒中断也可以不作处理,看项⽬需求。

stm32的RTC时钟程序

stm32的RTC时钟程序
int main(void){ /* System Clocks Configuration */RCC_Configuration(); /* NVIC
rtcfirstconfigure程序是第一次配置rtc如果配置后以后上电不需要重新
stm32的RTC时钟程序
sபைடு நூலகம்m32 的RTC 时钟程序
前些日子做了stm32 RTC 时钟的程序,现在把它记录下来。首先配置RTC,,使用外部时钟32.768KHz。其中配置了秒中断。
RTCFirstConfigure()程序是第一次配置RTC,如果配置后以后上电不需要重新
配置,如果RTC 时钟快了,可内部校准。
void RTCFirstConfigure() //first ini { RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); RCC_LSEConfig(RCC_LSE_ON); //enable LSE clock 32.768K while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} // Select LSE as RTC Clock Source RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //Enable RTC Clock / RCC_RTCCLKCmd(ENABLE); // Wait for RTC registers synchronization / RTC_WaitForSynchro(); // Wait until last write operation on RTC registers has finished / RTC_WaitForLastTask(); // Enable the RTC Second Interrupt/ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RTC_SetPrescaler(32767); // RTC period = RTCCLK/RTC_PR = (32.768KHz)/(32767+1)/ RTC_WaitForLastTask(); // BKP_SetRTCCalibrationValue(120); //RTC Calibration RCC_ClearFlag(); } RTCNorConfigure()程序配置完后每次上电都运行的程序

stm32定时器时钟以及中间对齐模式

stm32定时器时钟以及中间对齐模式

stm32定时器时钟以及中间对齐模式在永磁同步电机的控制中,需要对电机的三相定⼦施加⼀定的电压,才能控制电机转动。

现在⽤的较多的是SVPWM(SVPWM的具体原理会在后⾯另写⼀篇博客说明),要想产⽣SVPWM波形,需要控制的三相电压呈如下形式,即A、B、C三相的电压是中间对齐的,这就需要⽤到stm32定时器的中间对齐模式了。

1、stm32的时钟树stm32的时钟树如下图所⽰,简单介绍⼀下stm32时钟的配置过程。

以外部时钟作为时钟源为例。

HSE代表外部时钟(假设为8M)、SYSCLK为系统时钟,经过倍频器之后变成168M、SYSCLK经过AHB预分频器(假设分频系数为1)后变成HCLK时钟等于系统时钟SYSCLK,HCLK即AHB外部总线时钟,经过APB预分频器分出APB1时钟(分频系数为2,低速设备SYSCLK/4)与APB2时钟(分频系数为1,⾼速设备SYSCLK/2)HSE->SYSCLK->HCLK->APB1、APB2。

针对stm32f427的配置源码如下static void SetSysClock(void){#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)/******************************************************************************//* 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){HSEStatus = (uint32_t)0x01;}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;//AHB时钟#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2时钟/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//APB1时钟#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx *//* 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){}#if defined (STM32F427_437xx) || defined (STM32F429_439xx)/* Enable the Over-drive to extend the clock frequency to 180 Mhz */PWR->CR |= PWR_CR_ODEN;while((PWR->CSR & PWR_CSR_ODRDY) == 0){}PWR->CR |= PWR_CR_ODSWEN;while((PWR->CSR & PWR_CSR_ODSWRDY) == 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; #endif /* STM32F427_437x || STM32F429_439xx *//* 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 */}}2、stm32定时器的时钟stm32定时器分为⾼级定时器(TIM1与TIM8)、通⽤定时器(TIM2-TIM5、TIM9-TIM14)、基本定时器(TIM6、TIM7)。

图文详解stm32时钟树

图文详解stm32时钟树

对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。

这问题有个关键字叫:时钟树。

众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。

在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。

比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。

而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。

图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。

标号图1标号释义1 内部低速振荡器(LSI,40Khz)2 外部低速振荡器(LSE,32.768Khz)3 外部高速振荡器(HSE,3-25MHz)4 内部高速振荡器(HIS,8MHz)5 PLL输入选择位6 RTC时钟选择位7 PLL1分频数寄存器8 PLL1倍频寄存器9 系统时钟选择位10 USB分频寄存器11 AHB分频寄存器12 APB1分频寄存器13 AHB总线14 APB1外设总线15 APB2分频寄存器16 APB2外设总线17 ADC预分频寄存器18 ADC外设19 PLL2分频数寄存器20 PLL2倍频寄存器21 PLL时钟源选择寄存器22 独立看门狗设备23 RTC设备图1 STM32的时钟树在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。

stm32芯片时钟(晶振)连接到芯片的 引脚

stm32芯片时钟(晶振)连接到芯片的 引脚

STM32芯片时钟(晶振)连接到芯片引脚一、引言STM32芯片是一款由STMicroelectronics公司生产的32位微控制器,具有高性能、低功耗、丰富的外设和可扩展性等特点。

在STM32芯片中,时钟(晶振)连接到芯片引脚是一个非常重要的部分,直接关系到芯片的工作频率和稳定性。

二、 STM32芯片时钟STM32芯片的时钟系统包括内部RC振荡器、内部RC振荡器、外部晶体振荡器等,其中晶振作为一种最常用的外部时钟源,具有稳定性高、精度好等优点,因此在实际应用中得到了广泛的应用。

三、连接方式STM32芯片中,晶振可以连接到芯片的多个引脚上,通常采用的是双向连接方式,即一个晶振同时连接到芯片的两个引脚上,以提高时钟信号的稳定性和可靠性。

四、连接引脚STM32芯片的不同系列和不同型号,在连接晶振时会有所不同,但基本的连接原理是相通的。

一般来说,连接引脚包括晶振输入引脚(XTAL1)和晶振输出引脚(XTAL2),分别用来输入晶振的信号和输出晶振的信号,并通过外部电路提供稳定的时钟信号给芯片内部的时钟系统。

五、连接建议在实际应用中,连接晶振时需要注意以下几点:1. 选择合适的晶振型号和频率,根据实际需求选择合适的晶振型号和频率,以保证芯片的工作稳定。

2. 连接线路布局合理,尽量减小晶振到芯片引脚的连接长度,减小外界干扰。

3. 使用合适的外围电路,包括对晶振输入引脚和晶振输出引脚的连接电路、滤波电路等。

六、结语正确连接STM32芯片时钟(晶振)到芯片引脚对于芯片的正常工作和稳定性有着重要的意义,希望本文能为您在实际应用中提供一些帮助。

感谢您的阅读。

七、晶振类型和频率选择在选择晶振类型和频率时,需要根据具体的应用需求进行选择。

一般来说,晶振的频率可以选择从几十kHz到几十MHz不等。

对于低功耗应用,可以选择较低频率的晶振,而对于需要高性能的应用,则需要选择较高频率的晶振。

还需要考虑晶振的负载电容和稳定性等因素,以保证晶振在工作时能够提供稳定可靠的时钟信号。

基于STM32的RTC实时时钟说明书

基于STM32的RTC实时时钟说明书

RTC实时时钟说明书
一:工作原理
STM32芯片中内置RTC时钟,当对RTC进行初始化后,便可以像电子钟一样运行,通过读取RTC对应的寄存器,可以获知年月日、时分秒信息。

有关RTC的说明可参考《STM32中文参考资料》。

二:实验现象及操作
程序下载后,有以下两种情况。

●如果芯片第一次初始化RTC,则程序将写入HEX生成的时间信息到芯片RTC时钟中,
然后读出时钟信息。

通过数码管显示。

●如果不是第一次初始化RTC,则程序将读取RTC对应寄存器的值,以时间信息显示
在数码管上。

如果开发板上有放入3V的小电池,则即使掉电,RTC时钟依然在走。

程序刚下载,数码管显示的数据为时-分-秒。

K1键,则显示年月日,左边四位为年份,最右边两位为日期。

其它两位为月份。

K2键,数码管继续显示时-分-秒。

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。

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单片机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时钟写保护功能。

STM32学习笔记系统时钟和SysTick定时器

STM32学习笔记系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器1.STM32的时钟系统在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL(1)HSI是高速内部时钟,RC振荡器,频率为8MHz;(2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz;(3)LSI是低速内部时钟,RC振荡器,频率为40KHz;(4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体;(5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。

倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。

其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。

另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。

系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。

系统时钟可以选择为PLL输出、HSI、HSE。

系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用:(1)送给AHB总线、内核、内存和DMA使用的HCLK时钟;(2)通过8分频后送给Cortex的系统定时器时钟;(3)直接送给Cortex的空闲运行时钟FCLK;(4)送给APB1分频器。

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。

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;}}。

STM32时钟源的介绍及使用方法——STM32时钟树

STM32时钟源的介绍及使用方法——STM32时钟树

STM32时钟源的介绍及使⽤⽅法——STM32时钟树【温馨提⽰:以下内容均来⾃⽹友的⽆私奉献或书本的摘抄,在此表⽰感谢!】上图是STM32的时钟树,从树上我们可以看到,STM32的时钟有两个来源——内部时钟和外部时钟。

按时钟频率来分,⼜可分为⾼速时钟和低速时钟。

因此STM32的时钟有四个来源:⾼速外部时钟信号(HSE)、低速外部时钟信号(LSE)、⾼速内部时钟信号(HSI)和低速内部时钟信号(LSI)(图中分别⽤蓝⾊的①~④标注)。

①HSE⾼速外部时钟:由外部4~16MHz的晶体或有源晶振提供,通常采⽤8MHz。

②LSI低速外部时钟:外部晶体提供,主要是给实时时钟(RTC),⼀般为32.768kHz。

③HSI⾼速内部时钟:由内部RC振荡器产⽣的8MHz时钟,但不够稳定。

④LSI低速内部时钟:内部RC振荡器产⽣的供给RTC的时钟,频率在30kHz~60kHz之间,通常约40kHz。

时钟在STM32内部最终是供给四⼤块(图中⽤红⾊椭圆圈出):USB的48MHz时钟、系统时钟SYSCLK、实时时钟模块RTC、独⽴看门狗的时钟IWDGCLK。

其中最主要的,也是最⼤头是系统时钟SYSCLK,它可以是内部或外部⾼速时钟直接接过来,也可以内、外部⾼速时钟是PLL倍频后提供的,系统时钟再分别供给Cortex内核、SDIO、AHB总线、DMA、APB1、APB2等。

我们通常是采⽤外部8MHz⾼速时钟(HSE),所以着重说HSE。

我们以前⾯的GPIO上的时钟为例,由ST的Datasheet可知,GPIO是在APB2⾼速外设总线上的,图中绿⾊的线就是时钟的流程,我们⼀步步地来看。

8MHz外部晶体(或晶振)输⼊后,先经过⼀个开关PLLXTPRE(HSE divider for PLL entry),此开关决定对HSE进⾏2分频再输⼊到PLL或直接到PLL。

我们选择不分频。

这样时钟⼜到了第⼆个开关PLLSRC(PLL entry clock source),此开关决定PLL的时钟来源,是内部⾼速时钟⼆分频的时钟还是PLLXTPRE的输出。

STM32-实时时钟-RTC

STM32-实时时钟-RTC

STM32-实时时钟(RTC)STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex®-M0,M0+,M3, M4和M7内核(ST's product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex®-M0 and M0+, Cortex®-M3, Cortex®-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform) 。

实时时钟(RTC)是一个专用于保持时间的计时元素。

在许多的应用中,特别是在需要执行精确定时操作的应用,RTC是非常有用的工具。

除了钟表这类应用的例子外还包括洗衣机、医药柜、数据记录仪等。

RTC基本上是一个定时计数器,但和MCU的其他定时器不同的是,它更精确一些。

在此之前文章中,我们探讨了STM32定时器,但他们对PWM生成、时基和其它波形相关任务的应用程序是有用的。

那些都不适合于精确的计时功能。

在大多数的8位MCU中,像普通的PIC和AVR,并有没有内置RTC模块,所以当我们需要一个板载的精确计时器件时,只能使用类似常见的DS1302或PCF8563的专用RTC 芯片。

这些芯片还需要一些额外的电路、布线以及电路板空间。

但是,目前大多数先进的微控制器都集成了设计人员可以想到的每一个可能的硬件。

这仅取决于设计者决定使用现代微控制器的哪个资源,来满足特定的设计目标。

制造用于满足应用特定需求的MCU的时代已经过去了,在设计中使用并涉及多个元件的时代也已经过去了。

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还可以使用时钟配置工具进行时钟配置。

stm32的时钟电路的工作原理

stm32的时钟电路的工作原理

STM32的时钟电路工作原理
一、时钟源
STM32的时钟源主要来自于内部振荡器(HSI)和外部晶振(HSE)。

HSI是高速内部振荡器,可以提供一个高精度的时钟信号,但是它的频率受到MCU内部结构的影响,通常不太稳定。

而HSE是高速外部振荡器,由一个外部晶振提供时钟信号,其频率稳定且精度高。

二、时钟分频
STM32的时钟分频器可以将时钟源的频率降低到MCU可以接受的频率。

分频器可以配置为不同的分频值,从而得到不同的时钟频率。

例如,如果HSE的频率为8MHz,经过8分频后,可以得到1MHz 的时钟频率。

三、时钟监控系统
STM32的时钟监控系统可以监控MCU的时钟系统状态。

如果系统检测到内部振荡器或外部晶振停止工作,监控系统会立即重启或切换到其他可用源。

这可以保证MCU在时钟源出现故障时仍然能够正
常工作。

四、RTC(实时时钟)
RTC是STM32中一个重要的功能模块,它使用一个独立的低速内部振荡器(LSI)作为时钟源,以确保时间的准确性和稳定性。

RTC 可以提供秒、分、时、日、周、月、年的时间信息,并且具有闰年补偿功能。

此外,RTC还可以提供一个可编程的闹钟功能,用于定时唤醒MCU。

总结起来,STM32的时钟电路由多个部分组成,包括时钟源、时钟分频、时钟监控系统和RTC。

这些部分协同工作,确保MCU具有准确和稳定的时钟信号,并能够正常工作。

STM32时钟详解

STM32时钟详解
其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源 还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。
STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获 取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。
在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要 使用某模块时,记得一定要先使能对应的时钟。
需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。
连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门 狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而 只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。
同时这种设定也是有规律可循的设定参数也是有顺序规范的这是应用中应当注意的例如pll的设定需要在使能之前一旦pll使能后参数不可更经过此番设置后由于我的电路板上是8mhz晶振所以系统时钟为72mhz高速总线和低速总线2都为72mhz低速总线1为36mhzadc时钟为12mhzusb时钟经过15分频设置就可以实现48mhz的数据传输
static void RCC_Config(void)
第2页
STM32时钟讲解.txt {
/* 这里是重置了RCC的设置,类似寄存器复位 */ RCC_DeInit();
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟。

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

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

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

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

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

RTC的时钟源通过RTCSEL[1:0]来选择。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。

系统时钟可选择为PLL输出、HSI或者HSE。

系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。

其中AHB分频器输出的时钟送给5大模块使用:①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。

②、通过8分频后送给Cortex的系统定时器时钟。

③、直接送给Cortex的空闲运行时钟FCLK。

④、送给APB1分频器。

APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。

该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

⑤、送给APB2分频器。

APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。

该倍频器可选择1或者2倍频,时钟输出供定时器1使用。

另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。

ADC分频器可选择为2、4、6、8分频。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。

当需要使用某模块时,记得一定要先使能对应的时钟。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。

注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。

USB模块工作的时钟应该是由APB1提供的。

连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

对于单片机系统来说,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序。

由于时钟是一个由内而外的东西,具体设置要从寄存器开始。

RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x.h”中定义如下:(v3.4库)1059行->1081行。

1.typedef struct2.{3. __IO uint32_t CR;4. __IO uint32_t CFGR;5. __IO uint32_t CIR;6. __IO uint32_t APB2RSTR;7. __IO uint32_t APB1RSTR;8. __IO uint32_t AHBENR;9. __IO uint32_t APB2ENR;10. __IO uint32_t APB1ENR;11. __IO uint32_t BDCR;12. __IO uint32_t CSR;13.14.#ifdef STM32F10X_CL15. __IO uint32_t AHBRSTR;16. __IO uint32_t CFGR2;17.#endif /* STM32F10X_CL */18.19.#if defined (STM32F10X_LD_VL)|| defined (STM32F10X_MD_VL)|| defined (STM32F10X_HD_VL)20. uint32_t RESERVED0;21. __IO uint32_t CFGR2;22.#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */23.} RCC_TypeDef;一般板子上只有8Mhz的晶振,而增强型最高工作频率为72Mhz,显然需要用PLL倍频9倍,这些设置都需要在初始化阶段完成。

使用HSE时钟,程序设置时钟参数流程:1、将RCC寄存器重新设置为默认值 RCC_DeInit;2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3、等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();4、设置AHB时钟RCC_HCLKConfig;5、设置高速AHB时钟RCC_PCLK2Config;6、设置低速速AHB时钟RCC_PCLK1Config;7、设置PLL RCC_PLLConfig;8、打开PLL RCC_PLLCmd(ENABLE);9、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)10、设置系统时钟RCC_SYSCLKConfig;11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)12、打开要使用的外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()为了方便说明,借用一下例程的RCC设置函数,并用中文注释的形式加以说明:1.static void RCC_Config(void)2.{3.4./*这里是重置了RCC的设置,类似寄存器复位*/5.RCC_DeInit();6./*使能外部高速晶振*/7.RCC_HSEConfig(RCC_HSE_ON);8.9./*等待高速晶振稳定*/10.HSEStartUpStatus = RCC_WaitForHSEStartUp();11.12.if(HSEStartUpStatus == SUCCESS)13.{14./*使能flash预读取缓冲区*/15. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);16.17./*令Flash处于等待状态,2是针对高频时钟的,这两句跟RCC没直接关系,可以暂且略过*/18. FLASH_SetLatency(FLASH_Latency_2);19.20./* HCLK = SYSCLK 设置高速总线时钟=系统时钟*/21. RCC_HCLKConfig(RCC_SYSCLK_Div1);22.23./* PCLK2 = HCLK 设置低速总线2时钟=高速总线时钟*/24. RCC_PCLK2Config(RCC_HCLK_Div1);25.26./* PCLK1 = HCLK/2 设置低速总线1的时钟=高速时钟的二分频*/27. RCC_PCLK1Config(RCC_HCLK_Div2);28.29./* ADCCLK = PCLK2/6 设置ADC外设时钟=低速总线2时钟的六分频*/30. RCC_ADCCLKConfig(RCC_PCLK2_Div6);31.32./*Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */33.//这句很关键34./*利用锁相环讲外部8Mhz晶振9倍频到72Mhz */35. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);36.37./* Enable PLL 使能锁相环*/38. RCC_PLLCmd(ENABLE);39.40.41./* Wait till PLL is ready 等待锁相环输出稳定*/42.while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET)43.{}44.45./*Select PLL as system clock source 将锁相环输出设置为系统时钟*/46. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);47.48./* Wait till PLL is used as system clock source 等待校验成功*/49.while(RCC_GetSYSCLKSource()!= 0x08)50.{}51.}52.53./* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */54.//使能外围接口总线时钟,注意各外设的隶属情况,不同芯片的分配不同,到时候查手册就可以55.RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);56.57.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |58. RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |59. RCC_APB2Periph_AFIO, ENABLE);60.}由上述程序可以看出系统时钟的设定是比较复杂的,外设越多,需要考虑的因素就越多。

同时这种设定也是有规律可循的,设定参数也是有顺序规范的,这是应用中应当注意的,例如PLL的设定需要在使能之前,一旦PLL使能后参数不可更改。

相关文档
最新文档