文档库 最新最全的文档下载
当前位置:文档库 › Ucos系统学习之时钟节拍

Ucos系统学习之时钟节拍

Ucos系统学习之时钟节拍
Ucos系统学习之时钟节拍

在线学习好工作https://www.wendangku.net/doc/842504800.html,/

Ucos系统学习之时钟节拍

我们以前在将这个操作系统在进行多任务切换的时候,说过这样的概念操作系统怎么进行多任务切换呢?

首先它把这个时间进行分片,就是划分为1片1片的,比如说这个时间都以10毫秒划分为1个片,在第一个10毫秒中执行一个任务,在第二个10毫秒中执行另外一个任务,在第三个10毫秒中执行另外一个任务,这样的话,我们就进行了一个多任务的切换,多任务在切换的过程中,必须要使用的一个就是时钟节拍,时钟节拍实际上是一个定时器,这个定时器它定时的来切换我们的各个任务,比如这个任务执行10毫秒,那操作系统怎么知道执行10毫秒的时间有没有到达,或者说当这个任务主动放弃CPU的时候,那操作系统怎么知道你主动放弃了CPU,所以,在这里就要用到时钟节拍了。

时钟节拍实际上就是一个硬件定时器,就是由硬件给我们提供一个定时器,它定时一定的时间,比如说,我们定时1毫秒,那也就是说每隔1毫秒我来检查一下当前的这个任务状态,那比如说,在某一个时钟节拍中,我发现这个任务它的定时时间到了,它的执行时间到了,那我就让它执行下一个任务,把这个任务的执行权剥夺掉,然后执行下一个任务,或者说,在某一个时钟节拍中这个任务主动放弃了CPU,那这个时候,我也去执行下一个任务,这就是我们时钟节拍的作用。一个操作系统必须要有一个时钟节拍,为什么呢?

因为这个时间,还有任务状态的判断都与这个时钟节拍有关系。那接下来这个问题出现了,我们使用到的这个时钟节拍,并且我们知道时钟节拍是由硬件定时器提供的,那这个定时时间多长比较合适呢?我们定时1毫秒,还是10毫秒,还是100毫秒好,一般来说,我们来看看定时1毫秒和100毫秒有什么不同。

首先我们来看看定时1毫秒,定时1毫秒也就是说,每隔1毫秒,我们的CPU 会来检查一下各个任务的状态,那CPU在检查这个任务的状态的时候,那我们可以看看,它在检查这个任务的状态的时候执行的代码对于我们任务来说,它是一个无用功,因为你在检查任务的状态的时候,这样的代码对于我们任务来说根本没有任何作用,所以说,我们可以看到,当你1毫秒中断一次,也就是每秒钟检查1000次,而我这个100毫秒,每秒钟只检查10次,那也就是说,你检查1000次,和检查10次,显然检查1000次做的无用功显然要远远大于检查10次,那我们从这可以看到,检查时间越短,那CPU做的无用功也就越多。

但是,我们看一下另外一个问题,假设我还是1毫秒进行一次时钟节拍,定时器定时1毫秒,假设在这个时刻,这个任务放弃了执行权,也就是说这个任务说,我不需要执行了,那从它放弃到我们CPU发现了这个最大时间间隔是1毫秒,为什么呢?

因为我们定时器定时的时间是1毫秒,那对于定时100毫秒呢,我们看一下,从这个任务放弃CPU使用,到操作系统发现了它的最大时间是100毫秒,那很显然,这个1毫秒要比100毫秒的实时性要好,所以我们可以看到如果定时器定时的时间越短,它的实时性越好,但是CPU做的无用功越多,同样,定时的时间越长,虽然CPU做的无用功越少,但是,它的实时性越差。那对于一个系统,我们的时钟节拍设置为多少合适呢?

一般来说,我们设置的时钟节拍在10-100毫秒之间是比较好的,当然,随着我们CPU时钟的提高,比如我们说我们这个CPU跑的时钟频率比较高,都跑到了100多M,比如128M,400M这样的频率,那这个时候,我们可以设置到1000赫兹,就是1毫秒这样的时间,一般来说,设置为1毫秒已经是实时性比较好了,那如果你设置为微秒级的话,那这个时候,CPU做的无用功就相当相当多了,那这个时候,我们的实时性也不会提升到多好。所以,一般来说,我们设置的时钟节拍在10-100毫秒之间。当然如果CPU的频率比较高,你可以设置到1000赫兹。

文章来源:麦子学院

原文链接:https://www.wendangku.net/doc/842504800.html,/wiki/iot/ucosclock/

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 的芯片内分布,这样的宽度可以接受。

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外设的时钟轨迹:

基于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引脚看见输出波形了对比下,两者是一样的。} 下边是示波器出来的图:

最全的STM32八种IO口模式讲解(已经标注,新手必备)

以及上拉输入、下拉输入、浮空输入、模拟输入的区别 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结: 推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 详细理解: 如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。这样一来,输出高低电平时,VT3 一路和VT5 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 开漏形式的电路有以下几个特点: 1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。

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),为了使系统获得较快的运行速率和稳定性,我们选

STM32时钟初始化函数SystemInit()详解

花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出): 使用的是3.5的库,用的是STM32F107VC,开发环境RVMDK4.23 我已经定义了STM32F10X_CL,SYSCLK_FREQ_72MHz 函数调用顺序: startup_stm32f10x_cl.s(启动文件)→ SystemInit() → SetSysClock () → SetSysClo ckTo72() 初始化时钟用到的RCC寄存器复位值: RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000; RCC_CFG R2 = 0x0000 0000; SystemInit() 在调用 SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了):RCC->CR = 0x0000 0083; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;至于这些寄存器都代表着什么意思,详见芯片资料RCC寄存器,该文重点不在此处; SetSysClock()函数如下: static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz //我的定义的是SYSCLK_FREQ_72MHz,所以调用SetSys ClockTo72() SetSysClockTo72(); #endif } SetSysClockTo72()函数如下: static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/

相关文档