时钟树优化与有用时钟延迟简介

时钟树优化与有用时钟延迟简介

时钟树优化与有用时钟延迟简介

时钟树优化与有用时钟延迟在后端时序修正基本思路提到了时序优化的

基本步骤。其中,最关键的阶段就是时钟树建立。基本的优化都优先在数据路

径上进行,并且希望路径尽量的短,最好在一个时钟周期之内。当然,如果考

虑输入、输出延迟,收敛悲观因素,库的建立时间,与时钟不确定性,以及不

同时钟沿触发等因素,这个要求还要进一步的压缩,这些将在以后陆续进行讨论。

通常,我们希望时钟树偏差(clock tree skew) 越小越好,目标为零。所以,在建立时钟树(CTS)之前,我们首先将时钟设定为理想时钟。这样的好处是,优

化数据路径时,不会对时钟路径有额外的修改。而且,因为排除了时钟的影响,可以看到最终优化的结果,是否能够满足时序的要求。如果不满足,最要考虑

的就是数据路径组合逻辑是否太多,导致延迟过长。其他,可以估计一下RC

延迟所占的比例,比如15%左右,过长时,检查是否路径逻辑单元之间是否间

隔的太长等等。不过,本文重点要讨论的是,路径过长时,如何通过增加有用

时钟延迟(useful skew) 来达到时序的满足。

IC compiler 有这样的命令skew_opt ,还有其两次流程(two pass)可供参考。

阅读过本文后,我相信大家可以大致了解其工作的基本思路。

如果流程不正确,skew_opt 可能花费过长的运行时间,而且,不能达到预期的效果。如果我们清楚其中的原理,就可以更好,更自由的运用与发挥。

在不要考虑过多的情况下,如图,在理想时钟前提下,时序无法满足,即slack 0 。原本我们可以做:

stm32:系统时钟

实验4 系统时钟实验 上一章,我们介绍了STM32 内部系统滴答定时器,该滴答定时器产生的延时非常精确。在本章中,我们将自定义RCC系统时钟,通过改变其倍频与分频实现延时时间变化,实现LED灯闪烁效果。通过本章的学习,你将了解 RCC系统时钟的使用。本章分为以下学习目标: 1、了解 STM32 的系统构架。 2、了解 STM32 的时钟构架。 3、了解 RCC 时钟的操作步骤。 1.1 STM32 的系统构架 STM32 的时钟比较复杂,它可以选择多种时钟源,也可以选择不一样的时钟频率,而且在系统总线上面,每条系统的时钟选择都是有差异的。所以想要清楚的了解 STM32 的时钟分配,我们先来了解一下 STM32 的系统构架是什么样的。 从上图我们知道,RCC 时钟输出时钟出来,然后经过 AHB 系统总线,分别

分配给其他外设时钟,而不一样的外设,是先挂在不一样的桥上的。比如: ADC1、ADC2、 SPI1、GPIO 等都是挂在 APB2 上面,而有些是挂在 APB1上面,所以,虽然它们都是从 RCC 获取的时钟,但是它们的频率有时候是不一样的。 1.2 STM32 的时钟树 STM32 单片机上电之后,系统默认是用的时钟是单片机内部的高速晶振时钟,而这个晶振容易受到温度的影响,所以晶振跳动的时候不是有一定的影响,所以一般开发使用的时候都是使用外部晶振,而且单片机刚启动的时候,它的时钟频率是 8MHZ,而 STM32 时钟的最高频率是 72MHZ,所以单片机一般开机之后运行的程序是切换时钟来源,并设置时钟频率。大家可能有点疑惑,在第一章到第三章之中,我们并没有看到单片机开机之后设置时钟来源和时钟频率的。其实在使用库函数的时候,其实在库函数启动文件里面,是帮助我们把时钟频率设置到 72MHZ 了。大家可以打开一个库函数工程,在 system_stm32f10x.c 的第 106行,它定义了一个 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_72MHz 72000000 然后在下面的程序中,根据这个 SYSCLK_FREQ_72MHz 定义,它默认设置成 72MHZ。接下来我们来看一下具体的 RCC 时钟树:

STM8时钟树解析

STM8库函数学习笔记之时钟树解析 STM8库函数学习笔记之时钟管理 相关函数: void CLK_DeInit(void); void CLK_HSEC md(FunctionalState NewState); void CLK_HSIC md(FunctionalState N ewState); void CLK_LSICmd(FunctionalState NewState); void CLK_CCOCmd(FunctionalState NewState); void CLK_ClockSwitchC md(FunctionalState NewState); void CLK_FastHaltWakeUpCmd(FunctionalState N ewState); void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState); void CLK_PeripheralC lockConfig(CLK_Peripher al_TypeDef CLK_Peripheral, FunctionalState NewState); ErrorStatus CLK_C lockSwitchConfig(CLK_SwitchMode_TypeDef CLK_Sw itchMode, C LK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState); void CLK_HSIPr escalerConfig(CLK_Prescaler_TypeDef HSIPrescaler); void CLK_CCOConfig(CLK_Output_TypeD ef CLK_CCO); void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState); void CLK_SYSCLKC onfig(CLK_Pr escaler_TypeDef CLK_Prescaler); void CLK_SWIMConfig(CLK_SWIMD ivider_TypeDef CLK_SWIMDivider); void CLK_CANConfig(CLK_C ANDivider_TypeD ef CLK_CANDivider); void CLK_ClockSecuritySystemEnable(void); void CLK_SYSCLKEmergencyClear(void); void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSIC alibrationValue); u32 CLK_GetC lockFreq(void); CLK_Source_TypeD ef CLK_GetSYSCLKSource(void); FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef C LK_FLAG); ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT); void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT); //----------------------------------------------------------------------------------------- void CLK_DeInit(void);

H树时钟树设计

题目: 【目的】掌握H‐树结构形成时钟线分布网的方法,以及用反相器链构成的驱动电路的设计。 【内容】设计一个数字系统的时钟线分布及驱动电路,时钟频率100MHz,总的负载电 容200pF,分布到10mm×10mm 的芯片内。用单层金属线,线宽2μm,不考虑线间电容和边缘电容,单位面积连线对衬底电容0.03fF/μm2, 金属线电阻0.07Ω/□,要求时钟信号的上升边和下降边不应大于1.5ns,时钟线分布网到达芯片四周的终点信号要同步,且延迟量不应大于1.8ns,MOSFET 模型参数用65nm 工艺的参数,电源电压1.2V。 【要求】给出设计思路、采用的驱动电路结构,说明MOS 管尺寸设计的考虑和设计结果,给出模拟结果以及对结果的分析讨论。 上面的图就是H树时钟分布的简图,需要注意的是里面展示的是缓冲器,是由两个反相器连接的。具体分析延时情况时我们需要将其拆开为反相器进行分析。 由上图中反相器链的延迟时间与级数的关系,书上引出这样一段描述: 可知对于x<100的情况,N最多取3;对于x在1000至10000的情况,N取5就足够了,再增大N对延迟时间的改善非常小,但是面积会急剧增加。其中x=CL/Cin ; CL为最终的负载电容,Cin为输入电容。

在实际设计反相器链时不仅仅是追求延迟时间最小,而是对速度和面积的综合考虑进行优化,为了使得发生时钟的反转和到达负载时的反转能够相比较,经过偶数个反相器后波形相同,我们先取N=4。所以,我们的时钟分布会像下面这幅图展示的一样。 题目中给的总的负载电容为200pF ,由图中可见我们这里将其平均分为16份,则每一份的负载电容为CL=12.5pF ,这里的CL 即为x=CL/Cin 中的CL 。 分析H 树时钟分布的延迟时间我们需要考虑的是一条反相器路径上的延迟时间即可。 反相器链的总的延迟时间为 p po t NSt = (1) S 表示的是反相器链每一级反相器中MOS 管宽度比前一级增大S 倍,则有 1/,/N i i L in S C C S C C x +=== (2) 若知道了x ,则N=lnx/lnS ,把它带入到式1中,求导得出使反相器延时时间最小的2.7S e =≈。这是一个理论上的最优解,无论对于任何负载的反相器链都成立,但是需要注意的是它没有考虑反相器链的面积,这会在H 树时钟分布设计中对它进一步调整的一个主要的原因。 我们首先取S=2.7。 由上面的分析我们就可以将N=4和S=2.7带入到2式中求解出x 来,进而通过x=CL/Cin 求解出Cin 的大小 ,Cin 约为0.2352pF 。 我们首先假设Cin 全为第一级反相器栅电容,这样方便我们进行下一步的分析,对于CMOS 反相器来说,栅电容组成包括栅、氧化层、衬底沟道部分组成的栅氧化层电容,还有栅覆盖在源和漏部分的覆盖电容,但由于覆盖电容跟栅氧化层电容相比比较小,在手工计算时可以忽略。我们根据式3求解出第一级反相器的宽度值Wn 和Wp ,其中Wp=3Wn Cin=CoxWnLn+CoxWpLp=Cox*4Wn*L (3) 我们这里利用的是65nmBSIM4的工艺参数,可以在参数中找出对应的tox 来求解Cox 的大小。Cox=3.9*8.85e-12/1.2e-9=0.0288F. 我们在这里取用的L=65nm*2=130nm 的沟道长度,进一步求解出Wn=15.7um ,Wp=47.1um ,在这里要意识到是不是Wn 和Wp 太大了,验算四级反相器处的Wp=47.1um*2.7*2.7*2.7 =927um=0.927mm,题目中是在10mm×10mm 的芯片内分布,这样的宽度可以接受。

STM32CubeMX+FreeRTOS学习[3]-计数信号量(Lu)

FreeRTOS学习之三:计数信号量 前提:默认已经装好MDK V5和STM32CubeMX,并安装了STM32F1xx系列的支持包。 硬件平台:STM32F1xx系列。 目的:学习计数信号量的使用。 计数信号量的使用场景:一个二值信号量最多只可以锁存一个中断事件。在锁存的事件还未被处理之前,如果还有中断事件发生,那么后续发生的中断事件将会丢失。如果用计数信号量代替二值信号量,那么,这种丢中断的情形将可以避免。 本文例子使用STM32CubeMX配置创建两个任务,一个任务每秒钟发送多次信号量,另一个等待信号量并控制LED的闪烁。 Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103RBTx。 Step2.配置时钟引脚。 Step3.配置PA8和PD2为Output,并把用户标签分别改为LED0,LED1。

Step4.将系统时基源改为TIM4。 Step5.使能FreeRTOS。 Step6.配置时钟树。8M输入时,通过PLL得到72M内部时钟。

Step7.配置FreeRTOS。 在Tasks and Queues选项卡,默认配置了一个名为defaultTask的任务,其优先级为普通,任务堆栈大小为128字,任务函数名为StartDefaultTask。 双击蓝色的地方,弹出对话框,将任务名修改为SemGen,将任务函数名修改为SemGenTask。 点击Add按钮,增加一个任务Handle,优先级设置为Normal,函数名为HandleTask。

在Config parameters选项卡,使能计数信号量。 在Timers and Semaphores选项卡,点击Counting Semaphores项右边的“Add”按钮,添加一个信号量,名称改为cSem01,并把最大计数值改为10。 注:其他的都使用默认参数。 Step8.生成代码。

stm32时钟树分析

void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } } }

图文详解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的时钟树 在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz 晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”:3——5——7——21——8——9——11——13 对此条时钟路径做如下解析: 对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入; 对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振); 对于7,设置外部晶振的分频数(假设1分频); 对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟); 对于8,设置PLL倍频数(假设9倍频); 对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟); 对于11,设置AHB总线分频数(假设1分频); 对于13,时钟到达AHB总线; 在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹:

Finder自学stm32笔记之电源时钟

电源 STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。当主电源VDD掉电后,通过VBA T脚为实时时钟(RTC)和备份寄存器提供电源。 由上图可知VDDA.VSSA分别是独立给ADC的电源盒电源地。ADC需要准确的精度因此需要独立的电源供电。 使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。以便于RTC、后备区域、一些寄存器工作当然也需要外部振荡器提供时钟,所以也为LSE振荡器供电。 stm32中有上电复位掉电复位电路,可以设置通过设置PVDE位设置PVD阀值,当VDD 电压异常的时候就会复位,可以设置中断。 低功耗模式 三种低功耗模式 睡眠模式(Cortex?-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行) 停止模式(所有的时钟都已停止而电压还在供给) :是深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内

容被保留下来。在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。 待机模式(1.8V电源关闭):待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。 前面是三者的详细介绍,初一看看不出有什么区别,我当时都看的晕呼呼地,做笔记时候才发现他们真正的不同。现在讲解一下。 睡眠模式只是关掉了CM3的内核,外设都在运行包过内部外部时钟、IO口、中断NVIC 等等。停止模式是进一步的睡眠模式它是关掉了所有的外设时钟,但是仍旧在供电。待机模式是最低功耗的模式,它连时钟供电全部禁止除了备份的寄存器和待机电路维持供电。(有待进一步的深入研究并修正) Stm32降低功耗的三种方法: 1.低功耗模式 2.降低系统时钟 3.关掉外设 如题降低系统时钟通过对预分频寄存器进行编程,可以降低任意一个系统时钟(SYSCLK、HCLK、PCLK1、PCLK2)的速度。从而降低功耗。 但是我有疑问就是:如何在系统运行的情况下切换系统时钟的时钟源?是否可以随时改变预分频系数? RCC_SYSCLKConfig 设置系统时钟(SYSCLK) RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);/* Wait till HSI is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x00) 这个函数只是配置好系统时钟不是随时改变系统时钟的函数。所以有待做实验研究此处 关闭外设:在运行模式下,任何时候都可以通过停止为外设和内存提供时钟(HCLK和PCLKx)来减少功耗。通过设置AHB外设时钟使能寄存器(RCC_AHBENR)、APB2外设时钟使能寄存器 (RCC_APB2ENR)和APB1外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。

基于STM32的TFT指针式时钟

基于STM32的TFT指针式时钟 摘要 自时钟发明的那天起,它就注定了与人们有着密不可分的关系,但科学技术在不断发展,人们随着时间的推移对时间计量的精度要求越来越高,机械式时钟也越来越满足不了人们日益增高的要求了。取而代之的事具有高度准确性和直观性且无机械装置,使用寿命更长更长等优点的电子时钟。电子时钟更具人性化,更能提高人们的生活质量,更受人们欢迎,机械时代已经远去,电子时代已经到来。因此本设计是基于意法半导体公司(ST)的STM32开发平台实现一种高精度,智能化的指针式时钟系统,采用STM32内部RTC设计电子时钟时,通常是数字显示,这是由于选用数码管和1602等器件的显示能力有限。而12864是基于点阵式的液晶屏,其像素点为128×64,但12864自身像素较低,使其显示指针式时钟效果远低于2.2寸TFT-LCD液晶,但两者所基于的原理相同。因此本设计采用STM32为控制核心,2.2寸TFT-LCD液晶作为显示芯片,构成了一个指针式电子时钟。 关键词:STM32;RTC;TFT-LCD

第1章绪论 1.1 引言 随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。 近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。而目前,对于指针式时钟来说,所用的指针大多是靠机械装置驱动达到显示时间的目的,例如手表,挂钟,钟楼等等,单片机在指针式时钟中的应用也已经非常普遍的,人们对指针时钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理。由单片机作为指针时钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。输出设备显示器可以用液晶显示技术。 1.2 本设计的目的和意义 1.2.1 设计目的 (1)巩固,加深和扩大STM32应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力; (2)培养针对课题需要,选择和查阅有关手册,图表及文献资料的自学能力,提高组成系统,编程,调试的动手能力; (3)对课题设计方案的分析、选择、比较,熟悉用STM32做系统开发,研制的过程,软硬件设计的方法,内容及步骤; (4)进一步掌握C语言在硬件编程中的应用,熟悉怎样用C语言实现TFT-LCD上的绘图功能; (5)掌握STM32内部RTC的原理和应用。 1.2.2设计意义 数字指针式时钟是采用数字电路实现对时,分,秒,星期,年,月,日等数字以及指针表盘显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,

stm32时钟详解

在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。

STM32时钟树

RM0008 Low-, medium- and high-density reset and clock control (RCC) 1.When the HSI is used as a PLL clock input, the maximum system clock frequency that can be achieved is 64 MHz.2.For full details about the internal and external clock source characteristics, please refer to the “Electrical characteristics” section in your device datasheet. Several prescalers allow the configuration of the AHB frequency, the high speed APB (APB2) and the low speed APB (APB1) domains. The maximum frequency of the AHB and the APB2 domains is 72 MHz. The maximum allowed frequency of the APB1 domain is 36MHz. The SDIO AHB interface is clocked with a fixed frequency equal to HCLK/2.The RCC feeds the Cortex System Timer (SysTick) external clock with the AHB clock (HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock (HCLK), configurable in the SysTick Control and Status Register. The ADCs are clocked by the clock of the High Speed domain (APB2) divided by 2, 4, 6 or 8. The timer clock frequencies are automatically fixed by hardware. There are two cases:

专题三stm32时钟树及相关库函数

专题三STM32时钟及相关库函数 一、STM32 MCU 时钟树 STM32 MCU系统时钟树由系统时钟源、系统时钟SYSCLK和设备时钟等部分组成。 图1 STM32芯片时钟树 从图1可看到,芯片时钟源有4个: 1.高速外部时钟HSE(4-16MHz); 2.高速内部时钟HSI(8MHz); 3.低速外部时钟LSE(32.768kHz);

4.低速内部时钟LSI(40kHz)。 从图1还可看到,芯片内部系统时钟SYSCLK的来源有3个。 1.高速外部时钟HSE(4-16MHz); 2.高速内部时钟HSI(8MHz); 3.HSE或HSI通过锁相环2-16倍频后的锁相环时钟PLLCLK。 上述的系统时钟SYSCLK经AHB预分频器后得到AHB总线时钟HCLK,继而得到APB1和APB2总线时钟。要注意的是:APB1挂接的外设有:DAC、UART2-5,TIM2-7、USB、I2C1-2等;APB2挂接的外设有:ADC1-3,GPIOA-G,TIM1,TIM8等。每次要使用STM32的相关外设,都要先使能对应的时钟。 二、STM32的启动 2.1 STM32的启动模式 STM32处理器支持3种系统启动模式,且对应的存储介质均是芯片内置的。在每个STM32的芯片上都有两个引脚BOOT0和BOOT1,这两个引脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。 表1. STM32xx系列处理器的启动模式 第1种启动方式是最常用的用户FLASH启动,正常工作就在这种模式下,STM32的FLASH可以擦除10万次。 第2种方式是系统存储器启动方式,即我们常说的串口下载方式(ISP)。STM32中自带的BootLoader就是在这种启动方式中,如果出现程序硬件错误的话,可以切换到该模式下重新烧写Flash即可恢复正常。

STM32时钟树

STM32的时钟树 对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。 众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz 晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。 而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。 表1 图1标号释义

图1 STM32的时钟树 在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz 晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”: ○3——○5——○7——○21——○8——○9——○11——○13 对此条时钟路径做如下解析:

STM32F4时钟树外设挂靠总线学习小结

STM32F4时钟树学习小结 时钟是单片机的心脏,重要性不言而喻,STM32F4的时钟树是比较复杂的。 时钟树图一

时钟树图二 1:STMF4xx系统共计有三个主要时钟源(HSI、HSE和PLL)和两个次要时钟源(LSE、LSI)。2:SYSCLK可以来自HSI、HSE和PLL,多数采用PLL频率最高能达到168MHz。 3:RTC时钟可以来自LSE、LSI和HSE,但只有用LSE时,才能保证系统电源掉电时RTC仍能正常工作。 4:可通过多个预分频器配置AHB 频率、高速APB (APB2) 和低速APB (APB1)。AHB 域的最大频率为168 MHz。高速APB2 域的最大允许频率为84 MHz。低速APB1 域的最大允许频率为42 MHz。 5:STM32F405xx/07xx 和STM32F415xx/17xx 的定时器时钟频率由硬件自动设置。如果APB 预分频器为1,定时器时钟频率等于APB 域的频率。否则,等于APB 域的频率的两倍(×2)。 6:除以下时钟外,所有外设时钟均由系统时钟(SYSCLK) 提供: ●来自于特定PLL 输出(PLL48CLK) 的USB OTG FS 时钟(48 MHz)、基于模拟技术的随机数发生器(RNG) 时钟(<=48 MHz) 和SDIO 时钟(<= 48 MHz)。 ●I2S 时钟 ●由外部PHY 提供的USB OTG HS (60 MHz) 时钟 ●由外部PHY 提供的以太网MAC 时钟(TX、RX 和RMII)。 下面介绍挂在不同总线上的设备情况 1、挂在AHB1总线的外设有:最高时钟频率:168MHZ 1)GPIOA~K 2)RCC_AHB1Periph_CRC 3)FLITF 4)SRAM1 5)SRAM2 6)BKPSRAM 7)SRAM3 8)CCMDATARAMEN 9)DMA1 10)DMA2 11)DMA2D 12)ETH_MAC、ETH_MAC_Tx、ETH_MAC_Rx、ETH_MAC_PTP

集成电路中的时钟树综合分析

集成电路中的时钟树综合分析 2012301510055 杨焦电科 当前,集成电路工艺发展非常迅速,已从亚微米(015~1μm) 进入到深亚微米(小于015μm) ,进而到超深亚微米(小于0125μm) 。目前,集成电路批量生产的最小线宽已达到0109μm。随着工艺的发展,对集成电路设计的要求也日益提高,尤其是同步数字集成电路的时序问题更备受关注。在同步数字集成电路中,时钟信号为系统中的数据传送提供时间基准,通常是整个芯片中扇出最大、通过距离最长、以最高速度运行的信号,它对于同步系统的运行至关重要,所以,在同步数字系统中时钟信号的特性及其分配网络更被人们所关注。时钟树必须保证在最差条件下关键的时序要求能得到满足,对时钟信号任何不当的控制都可能导致情况紊乱,将错误的数据信号锁存到寄存器中。 大部分的同步数字系统由级联的时序寄存器组和每组寄存器之间的组合电路组成。每个数据信号都锁存在一个双稳态寄存器中,该寄存器的使能时钟信号一到达,数据信号就离开双稳态寄存器,穿过组合电路网络进入下一个寄存器,并完全锁存在该寄存器直到下一个时钟信号到达。一个常用数字同步系统的延时单元由以下三个子系统组成:1) 记忆存储元件; 2) 组合逻辑元件; 3) 时钟产生电路和其分配网络(clocktree) 。这三个子系统的相互关系对电路能否获得最好的性能和可靠性起着关键作用。 对任意的有序寄存器对R1 、R2 ,其关系可能为以下两种情况之一 : 1) R1 输出不能仅通过一系列组合逻辑元件传输到R2 的输入端; 2) 存在一组组合逻辑元件直接连接R1 的输出端和R2 的输入端。 在第一种情况下, R1 输出端的信号变化不影响同一周期内R2 的输入。第二种情况下(用R1 →R2 表示) , R1 输出端的信号转变将传到R2 的输入端,该情况下R1 、R2 被称为时序相邻的寄存器对,它们组成了一条本地数据路径。如图1[1 ]所示, Ri 和Rf 为一对时序相邻寄存器对,它们分别为本地数据路径的起始和目标寄存器, Ci 、Cf 分别为驱动Ri 和Rf 的时钟信号,这两个时钟信号都由同一个时钟信号源通过时钟树产生。该时钟树用以产生同步于每个寄存器的特定时钟信号。从理论上来说,同步事件在同一时刻发生于所有寄存器上。在这个整体时钟策略的基础上,时钟信号到每个寄存器的时间都基于一个全局时间基准来定义。 选择时钟周期使得由起始寄存器产生的最迟信号在激活起始寄存器的时钟沿的下一 个时钟沿到来时被锁存到目标寄存器中,故时序数据路径中的任意时序相邻寄存器对所 允许的最小时钟周期TCP(min) 和最大时钟频率fmax可由以下公式算出: 1/fmax= TCP(min) = tPD(max) + t skewif + t setup 。 其中t skewif = tCi- tCf, tCi 、tCf分别为从时钟源到Ri 和Rf 的时钟延迟,故t skewif 可以为正或者为负(即Ci 超前或滞后Cf) ; tPD(max) 为数据路径的总路径延时,可由以下公式计算出: tPD(max) = tC - Q + tL + t Int ,其中tC - Q为Ci 到达后数据离开起始寄存器所需要的最大时间, tL + t Int为穿过组合逻辑块L 和连线所需要的时间; t setup为寄存器的建立时间。为了保证数据成功锁存进目标寄存器,必须满足两个条件: 1) 在使能时钟沿到达之前的一段时间内数据必须为有效和稳定的,这段时间称为 建立时间,即t setup 。 2) 在使能时钟沿到达之后的一段时间内数据必须保持稳定,这段时间称为保持时 间,即thold。

单片机STM32时钟图文理解

单片机STM32时钟图文理解 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。 高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。 低速外部时钟(LSE):以外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。 低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。 OSC_OUT和OSC_IN开始,这两个引脚分别接到外部晶振8MHz,第一个分频器PLLXTPRE,遇到开关PLLSRC(PLL entry clock source),我们可以选择其输出,输出为外部高速时钟(HSE)或是内部高速时钟(HSI)。这里选择输出为HSE,接着遇到锁相环PLL,具有倍频作用,在这里我们可以输入倍频因子PLLMUL,要是想超频,就得在这个寄存器上做手脚啦。经过PLL的时钟称为PLLCLK。倍频因子我们设定为9倍频,也就是说,经过PLL之后,我们的时钟从原来8MHz的HSE变为72MHz的PLLCLK。紧接着又遇到了一个开关SW,经过这个开关之后就是STM32的系统时钟(SYSCLK)了。通过这个开关,可以切换SYSCLK的时钟源,可以选择为HSI、PLLCLK、HSE。我们选择为PLLCLK 时钟,所以SYSCLK就为72MHz了。PLLCLK在输入到SW前,还流向了USB预分频器,这个分频器输出为USB外设的时钟(USBCLK)。回到SYSCLK,SYSCLK经过AHB 预分频器,分频后再输入到其它外设。如输出到称为HCLK、FCLK的时钟,还直接输出

stm32时钟输出

STM32 RCC实验MCO脚输出时钟波形 2012-5-1 08:05|发布者: benben|查看: 1457|评论: 0 摘要: 为了能用示波器看到系统时钟,决定将系统时钟输出到MCO引脚上去。弄了一晚上, 看见波形了。首先建立空的工程,将下面三行代码注释掉:;IMPORT SystemInit ;删除SystemInit自己写RCC初始化函数;LDR R0, =SystemInit ... 为了能用示波器看到系统时钟,决定将系统时钟输出到MCO引脚上去。 弄了一晚上,看见波形了。 首先建立空的工程,将下面三行代码注释掉: ;IMPORT SystemInit ;删除SystemInit自己写RCC初始化函数 ;LDR R0, =SystemInit ;BLX R0 下面是设置函数,使用HSI作为系统时钟,不实用PLL,直接将HSI输出到MCO引脚:void My_RccInitMCOHSI(void) { uint8_t temp; My_Rcc_DeInit(); RCC->CR |= 1<<0; //复位HSION 开启内部时钟;其实内部时钟不用管的,开机自动使用内部时钟。 while(!(RCC->CR>>1)); //检查HSI是否就绪 RCC->CFGR &= (~0x03); //清零CFGR的0、1位HSI作为系统时钟 while(temp!=0x00) //读取CFGR的2、3为,判断是否是HSI作为系统时钟设置

{ temp=RCC->CFGR>>2; temp&=0x03; } //此时HSI已经成为系统时钟 //HSI时钟就绪后,直接输出到MCO(PA8) RCC->APB2ENR |= 1<<2; //使能PA时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X0000000B;//PA8 推挽输出(MCO) // //设置MCO输出内部HSI时钟 RCC->CFGR |= 5<<24; //MCO输出HSI时钟 //RCC->CFGR |= 4<<24; MCO输出系统时钟SYSCLK //此时就可以在PA8即MCO引脚看见输出波形了对比下,两者是一样的。} 下边是示波器出来的图:

相关文档
最新文档