定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)

合集下载

Linux下定时器的实现方式分析

Linux下定时器的实现方式分析

Linux 下定时器的实现方式分析定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持,但使用场景的不同,对定时器的实现考虑也不尽相同,本文讨论了在Linux环境下,应用层和内核层的定时器的各种实现方法,并分析了各种实现方法的利弊以及适宜的使用环境。

首先,给出一个基本模型,定时器的实现,需要具备以下几个行为,这也是在后面评判各种定时器实现的一个基本模型[1]:StartTimer(Interval,TimerId,ExpiryAction)注册一个时间间隔为Interval后执行ExpiryAction的定时器实例,其中,返回TimerId以区分在定时器系统中的其他定时器实例。

StopTimer(TimerId)根据TimerId找到注册的定时器实例并执行Stop。

PerTickBookkeeping()在一个Tick内,定时器系统需要执行的动作,它最主要的行为,就是检查定时器系统中,是否有定时器实例已经到期。

注意,这里的Tick实际上已经隐含了一个时间粒度(granularity)的概念。

ExpiryProcessing()在定时器实例到期之后,执行预先注册好的ExpiryAction行为。

上面说了基本的定时器模型,但是针对实际的使用情况,又有以下2种基本行为的定时器:Single-Shot Timer这种定时器,从注册到终止,仅仅只执行一次。

Repeating Timer这种定时器,在每次终止之后,会自动重新开始。

本质上,可以认为Repeating Timer是在Single-Shot Timer终止之后,再次注册到定时器系统里的Single-Shot Timer,因此,在支持Single-Shot Timer的基础上支持Repeating Timer并不算特别的复杂。

在2.4的内核中,并没有提供POSIX timer[2]的支持,要在进程环境中支持多个定时器,只能自己来实现,好在Linux提供了setitimer(2)的接口。

SysTick定时器的应用

SysTick定时器的应用

SysTick定时器的应用通常实现Delay(N)函数的方法为:for(i = 0; i <= x; i ++);x --- 对应于对应于N 毫秒的循环值对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

Cortex-M3的内核中包含一个SysTick时钟。

SysTick 为一个24位递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。

计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。

在STM32的应用中,使用Cortex-M3 内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。

注:全局变量TimingDelay 必须定义为volatile延迟时间将不随系统时钟频率改变。

外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick 效验值设置成9000,将SysTick 时钟设置为9MHz,就能够产生1ms的时间基值,即SysTick产生1ms的中断。

使用ST的函数库使用systick的方法1、调用SysTick_CounterCmd() 失能SysTick计数器2、调用SysTick_ITConfig () 失能SysTick中断3、调用SysTick_CLKSourceConfig() 设置SysTick时钟源。

4、调用SysTick_SetReload() 设置SysTick重装载值。

SysTick定时器介绍,SysTick定时器寄存器

SysTick定时器介绍,SysTick定时器寄存器

SysTick定时器介绍,SysTick定时器寄存器
 SysTick定时器介绍
 SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC 中。

它是一个24 位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK 是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8 分频后获取,本套程序中我们采用后者,即每计数一次所需时间为1/(72/8)us,换句话说在1us 的时间内会计数9 次。

当定时器计数到0 时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。

如果开启SysTick 中断的话,当定时器计数到0,将产生一个中断信号。

因此只要知道计数的次数就可以准确得到它的延时时间。

 SysTick 定时器通常应用在操作系统中,为其提供时钟周期。

 SysTick定时器操作
 在STM32F1 库函数中,并没有提供相应的SysTick 定时器配置函数,。

STM32的定时器定时时间计算(计数时间和中断定时时间)

STM32的定时器定时时间计算(计数时间和中断定时时间)

STM32的定时器定时时间计算(计数时间和中断定时时间)时基单元可编程⾼级控制定时器的主要部分是⼀个16位计数器和与其相关的⾃动装载寄存器。

这个计数器可以向上计数、向下计数或者向上向下双向计数。

此计数器时钟由预分频器分频得到。

计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运⾏读写仍然有效。

时基单元包含:●计数器寄存器(TIMx_CNT)●预分频器寄存器 (TIMx_PSC)●⾃动装载寄存器 (TIMx_ARR)●重复次数寄存器 (TIMx_RCR)⾃动装载寄存器是预先装载的,写或读⾃动重装载寄存器将访问预装载寄存器。

根据在TIMx_CR1寄存器中的⾃动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被⽴即或在每次的更新事件UEV时传送到影⼦寄存器。

当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时,产⽣更新事件。

更新事件也可以由软件产⽣。

随后会详细描述每⼀种配置下更新事件的产⽣。

计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)时,CK_CNT才有效。

(更多有关使能计数器的细节,请参见控制器的从模式描述)。

注意,在设置了TIMx_CR寄存器的CEN位的⼀个时钟周期后,计数器开始计数。

预分频器描述预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。

它是基于⼀个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。

因为这个控制寄存器带有缓冲器,它能够在运⾏时被改变。

新的预分频器的参数在下⼀次更新事件到来时被采⽤。

尤其注意的是当发⽣⼀个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。

●重复计数器被重新加载为TIMx_RCR寄存器的内容。

●⾃动装载影⼦寄存器被重新置⼊预装载寄存器的值(TIMx_ARR)。

STM32系统systick定时器与延迟时间计算

STM32系统systick定时器与延迟时间计算

STM32系统systick定时器与延迟时间计算STM32系统systick定时器与延迟时间计算系统嘀嗒(SysTick)校准值寄存器1.(SysTick) 系统嘀嗒时钟是由HCLK 分频出来的。

HCLK=SYSCLK=72MHz/* Select HCLK/8 as SysTick clock source */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);当系统嘀嗒时钟设定为9 兆赫或是:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);当系统嘀嗒时钟设定为72 兆赫2.系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9 兆赫,产生1ms 时基。

/* SysTick interrupt each 9ms with counter clock equal to 1MHz */SysTick_SetReload(9000);该参数取值必须在1和0x00FFFFFF之间3.使能一下:/* Enable the SysTick Counter */SysTick_CounterCmd(SysTick_Counter_Enable);/* Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);这还有另外一种设置方法:经试验验证可行://NVIC_InitTypeDef NVIC_InitStructure;/* Configure HCLK clock as SysTick clock source */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/* Configure the SysTick handler priority */NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,2, 0);/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* SysTick interrupt each 100 Hz with HCLK equal to 72MHz 每1ms发生一次SysTick中断*/SysTick_SetReload(72000);/* Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);/* Enable the SysTick Counter */SysTick_CounterCmd(SysTick_Counter_Enable);关键是:SysTick_CLKSourceConfig,和SysTick_SetReload。

定时器计算方法

定时器计算方法

STM32定时器时间的计算方法STM32中的定时器有很多用法:(一)系统时钟(SysTick)设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数:void RCC_Configuration(void){RCC_ClocksTypeDef RCC_ClockFreq;SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq);//SYSTICK分频--1ms的系统时钟中断if (SysTick_Config(SystemFrequency / 1000)){while (1); // Capture error}}void SysTick_Handler(void)//在中断处理函数中的程序{while(tim){tim--;}}//调用程序:Delay_Ms(10);当然,前提是要设置好,变量tim要设置成volatile类型的。

(二)第二种涉及到定时器计数时间(TIMx)/*TIM3时钟配置*/TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);定时时间计算:TIM_TimeBaseStructure.TIM_Prescaler = 2;//分频2 72M/(2+1)/2=24MHzTIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */注意两点(来自大虾网,未经检验)(1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟;(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;是重复计数,就是重复溢出多少次才给你来一个溢出中断,它对应的寄存器叫TIM1 RCR.如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大!假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。

STM32 定时器 定时时间的计算

STM32 定时器 定时时间的计算

STM32 定时器定时时间的计算假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值定时器的基本设置1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计0xFFFF 个频率后产生个更新或者中断(也是说定时时间到)3、TIM_TimeBaseStructure.TIM_CounterMode =TIM1_CounterMode_Up; //定时器模式向上计数4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值5、TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器26、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//打开中断溢出中断7、TIM_Cmd(TIM2, ENABLE);//打开定时器或者:TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频3599972M/(35999+1) /2=1Hz1 秒中断溢出一次TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1 秒*/tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK的详解

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK的详解

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK的详解在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。

其中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最大频率为72MHz,它是供STM32中绝大部分部件工作的时钟源。

系统时钟可由PLL、HSI或者HSE提供输出,并且它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。

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

②、分频后送给STM32芯片的系统定时器时钟(Systick=Sysclk/8=9Mhz)③、直接送给Cortex的自由运行时钟(free running clock)FCLK。

Linux时间子系统之一:定时器的应用

Linux时间子系统之一:定时器的应用

Linux时间子系统之一:定时器的应用我们知道低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep 等等,这些API基于低分辨率定时器或高精度定时器来实现,本章的内容就是讨论这些方便、好用的API是如何利用定时器系统来完成所需的功能的。

1. msleepmsleep相信大家都用过,它可能是内核用使用最广泛的延时函数之一,它会使当前进程被调度并让出cpu一段时间,因为这一特性,它不能用于中断上下文,只能用于进程上下文中。

要想在中断上下文中使用延时函数,请使用会阻塞cpu的无调度版本mdelay。

msleep 的函数原型如下:[cpp] view plain copyvoid msleep(unsigned int msecs)延时的时间由参数msecs指定,单位是毫秒,事实上,msleep的实现基于低分辨率定时器,所以msleep的实际精度只能也是1/HZ级别。

内核还提供了另一个比较类似的延时函数msleep_interrupTIble:[cpp] view plain copyunsigned long msleep_interrupTIble(unsigned int msecs)延时的单位同样毫秒数,它们的区别如下:函数延时单位返回值是否可被信号中断msleep毫秒无否msleep_interrupTIble毫秒未完成的毫秒数是最主要的区别就是msleep会保证所需的延时一定会被执行完,而msleep_interrupTIble则可以在延时进行到一半时被信号打断而退出延时,剩余的延时数则通过返回值返回。

两个函数最终的代码都会到达schedule_timeout函数,它们的调用序列如下图所示:图1.1 两个延时函数的调用序列下面我们看看schedule_timeout函数的实现,函数首先处理两种特殊情况,一种是传入的。

STM32库开发实战指南-M4:18-SysTick-系统定时器

STM32库开发实战指南-M4:18-SysTick-系统定时器

10
* SystemFrequency / 1000000 1us 中断一次
11
*/
12
if (SysTick_Config(SystemCoreClock / 100000)) {
13
/* Capture error */
14
while (1);
15
}
16 }
SysTick 初始化函数由用户编写,里面调用了 SysTick_Config()这个固件库函数,通过
SysTick 属于单片机内部的外设,不需要额外的硬件电路来自剩下的只需一个 LED 灯即 可。
18.3.2 软件设计
这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整 的代码请参考本章配套的工程。我们创建了两个文件:bsp_SysTick.c 和 bsp_ SysTick.h 文 件用来存放 SysTick 驱动程序及相关宏定义,中断服务函数放在 stm32f4xx_it.h 文件中。
16
17
// 设置系统定时器的时钟源为 AHBCLK=180M
18
// 使能系统定时器中断
19
// 使能定时器
20
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
21
SysTick_CTRL_TICKINT_Msk |
22
SysTick_CTRL_ENABLE_Msk;
零死角玩转 STM32—F429
零,同时还会清除在 SysTick 控制及状态寄 存器中的 COUNTFLAG 标志
表 18- 5 SysTick 校准数值寄存器
位段 名称
类型 复位值 描述

linux内核源代码分析-定时器与时间管理

linux内核源代码分析-定时器与时间管理

Linux下的时钟中断和相关时间应用
延迟执行
– 忙等待 – 短延迟
Linux内存页
内核中内存的分配要复杂的多 内核以物理页为单位分配内存 物理页的大小取决于体系结构,一般
– 4kB – 8kB
Linux内存页
数据结构:<linux/mm.h>中定义: Struct page { unsigned long flags; Atomic_t count; Struct list_head list; Struct address_space *mapping; Unsigned long index; Struct list_head lru; Union { struct pte_chain *chain; pte_addr_t direct;} pte Unsigned long private; Void *virtual;}
内存管理提供的服务
获得页
– – – – – Alloc_pages() Page_address(struct page *page) __get_free_pages() alloc_page() __get_free_page()
内存管理提供的服务
获得填充为0的页
– Get_zeroed_page()
内核中的时间概念
事件驱动与时间驱动 内核中需管理相对时间和绝对时间 内核时间的硬件基础(系统定时器以某种频率触发, hitting or poping,该频率可以通过编程预定(tick rate) poping, tick rate 直接用处:
– – – – – 更新系统运行时间 更新实际时间 定期均衡运行队列(SMP上) 时间片 定期统计
Linux下的时钟中断和相关时间应用

定时器中断时钟计算方法

定时器中断时钟计算方法

定时器中断时钟计算方法
首先,要计算定时器中断的触发时间,需要考虑定时器的工作模式和时钟源。

通常,定时器会使用系统时钟或外部时钟作为时钟源,根据定时器的配置和工作模式,可以计算出定时器中断的触发时间。

例如,如果定时器工作在周期模式下,可以通过以下公式计算出中断的触发时间:
触发时间 = 定时器周期定时器溢出次数。

其次,要计算定时器中断的频率,需要考虑定时器的时钟周期和预分频因子。

时钟周期是指定时器每个时钟周期的持续时间,预分频因子是指定时器时钟源的分频系数。

通过这两个参数,可以计算出定时器中断的频率。

例如,如果定时器的时钟周期为T,预分频因子为N,则定时器中断的频率可以通过以下公式计算得出:
频率 = 1 / (T N)。

在实际应用中,还需要考虑定时器中断的精度和误差,以及定时器中断与其他系统任务的协调。

此外,还需要注意定时器中断的处理时间,以避免对系统性能产生不利影响。

总的来说,定时器中断时钟计算方法涉及到定时器的工作模式、时钟源、时钟周期、预分频因子等多个因素,需要综合考虑这些因
素来计算定时器中断的触发时间和频率。

同时,还需要注意定时器
中断的精度、误差和处理时间等方面的问题,以确保定时器中断能
够准确可靠地工作。

定时器计算方法

定时器计算方法

STM32定时器时间的计算方法STM32中的定时器有很多用法:(一)系统时钟(SysTick)设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数:void RCC_Configuration(void){RCC_ClocksTypeDef RCC_ClockFreq;SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq);//SYSTICK分频--1ms的系统时钟中断if (SysTick_Config(SystemFrequency / 1000)){while (1); // Capture error}}void SysTick_Handler(void)//在中断处理函数中的程序{while(tim){tim--;}}//调用程序:Delay_Ms(10);当然,前提是要设置好,变量tim要设置成volatile类型的。

(二)第二种涉及到定时器计数时间(TIMx)/*TIM3时钟配置*/TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);定时时间计算:TIM_TimeBaseStructure.TIM_Prescaler = 2;//分频2 72M/(2+1)/2=24MHzTIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */注意两点(来自大虾网,未经检验)(1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟;(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;是重复计数,就是重复溢出多少次才给你来一个溢出中断,它对应的寄存器叫TIM1 RCR.如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大!假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。

STM32定时时间的计算

STM32定时时间的计算

STM32定时时间的计算在STM32微控制器中,定时器(Timer)通常用于生成基准时间延迟和周期性触发任务。

在计算定时时间时,需要考虑定时器的时钟源、分频因子和自动重装载值等参数。

首先,确定定时器的时钟源。

定时器可以使用内部时钟源(如系统时钟)或外部时钟源(如外部晶振)。

根据实际需求和系统架构,选择合适的时钟源。

分频因子=(定时器时钟频率/所需时钟频率)-1注意,这里所需时钟频率应是定时器触发的频率(即每秒触发的次数)。

然后,确定自动重装载值。

自动重装载值决定了定时器溢出时的触发时间。

溢出时间(即定时时间)由ARR(自动重装载寄存器)和分频因子计算得出。

计算公式为:定时时间=(ARR+1)*(PSC+1)/定时器时钟频率最后,根据计算出的自动重装载值和分频因子设置对应定时器寄存器。

HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) - 初始化定时器基本配置HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) - 启动定时器HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) - 停止定时器HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) - 配置定时器的GPIO和中断等外设需要注意的是,根据不同的STM32系列和型号,定时器的寄存器和函数可能会有所不同,根据具体开发板的参考手册和官方文档进行配置。

综上所述,STM32定时时间的计算主要涉及定时器的时钟源、分频因子和自动重装载值的确定。

根据计算公式和对应的定时器设置函数,可以实现精确的定时时间控制。

在实际应用中,可以根据具体需求灵活调整定时器的参数,以满足系统的要求。

NiosII的奇幻漂流-Chap07-Interval Timer应用——定时器、System Clock与Timestamp

NiosII的奇幻漂流-Chap07-Interval Timer应用——定时器、System Clock与Timestamp

Chap.7 Interval Timer应用——定时器、System Clock与Timestampby VITO老虎社区NiosII 的奇幻漂流 工具版本:Windows7 + QuartusII 12.0 + Qsys + NiosIISBT 12.0 作者:VITO E-Mail :vito943@ 老虎社区 版权所有 All Right Reserved 欢迎转载 转载请保留版权信息处心积虑地让FPGA 好学好用Interval Timer应用——定时器、System Clock与TimestampInterval Timer应用——定时器、System Clock与Timestamp本章主要介绍在Nios II中利用Interval Timer模块实现定时器、System Clock和Timestamp功能,通过本章,你能学习到(1)Interval Timer模块的生成和使用。

(2)在Nios II中实现定时器功能。

(3)在Nios II中实现System Clock功能。

(4)在Nios II中实现Timestamp功能。

本章分为六个部分:一、概述二、硬件实现三、软件实现——定时器四、软件实现——System Clock五、软件实现——Timestamp六、实验总结更多章节,请访问/forum-39-1.html概述1.概述在上一章我们利用Nios II CPU和DS1302实现了RTC功能。

有的同学可能会思考:DS1302不就是因为接了个晶振就能精确计时了么,Nios II CPU本身就有晶振(系统时钟),难道自己就不能计时?答案是能的,毕竟求人不如求己嘛,没了DS1302,咱Nios II照样能计时。

实际上,DS1302的意义更多体现在系统断电后,依靠它的备用电池,照样可以计时。

在不掉电的情况下,Nios II利用自带的IP核模块能实现定时器、System Clock和Timestamp,而这个模块就是Interval Timer。

89C51单片机定时器所定时间的计算以及写法

89C51单片机定时器所定时间的计算以及写法

89C51单片机定时器所定时间的计算以及写法89C51单片机定时器时间的计算以及写法今晚学单片机的时候,有一点儿问题,就去网上看了看,发现了很多人不会单片机定时,也就是具体时间的设定,不知道如何设定,而且有关方面的书籍、资料讲解又太过术语化,所以就写一篇通俗些的语言讲述一下如何定时。

为了便于理解,先讲解一点儿关于单片机内部定时器和计数器的基本知识,如果学过数字电路,就不用管这些,看下边的就好了:(1)由于单片机内部定时器、计数器均为八位,所以它们从0开始到计数计满,也就是能从0000 0000计数到1111 1111,即2^0到2^16,转换成十进制,就是0——65536。

(2)外部的晶振电路提供的频率,到单片机内部,经过硬件电路,进行了12分频,不要问为什么,就这么记着就好了。

比如外部晶振是12MHZ的,那么到了单片机内部,用的频率就是1MHz的。

89C51单片机常使用的晶振频率为12MHz和11.0592MHz两种,主要讲述这两种频率的,如果用其他的,只需要相应改变即可,下面分别讲述如何定时:(1)使用12MHz晶振:单片机工作的频率f:12MHz/12=1MHz,那么时钟周期T1:T1=1/f=1μs,比如你要定时T2=50ms=50000μs,你需要总时间T=T1 x T2=50000,也就是说你需要50000个周期才能走完你所要定的时间,当把数全都计满,是需要65536个周期,也就是说还有65536-50000=15536个周期没有走,那么,我们可以把这个初始值放到计数器里面,让它从15536开始计数,当计够50000个周期,也就计满了,即到达了65536。

就像水往水缸里流,你需要流满半缸水的时间,但是现在水缸是空的,你可以先把水缸灌半缸水,然后让它从半缸水开始流,当流满了的时候,也就到了你需要的那个时间。

然后,15536转成十六进制为:0x3CB0,将3C放到定时器的高8位,B0放到第8位,就完成了定时。

STM32 滴答定时器和普通定时器

STM32 滴答定时器和普通定时器

SysTick定时器和普通定时器SysTick定时器SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。

例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。

因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

Cortex‐M3处理器内部包含了一个简单的定时器。

因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作得以化简。

该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(CM3处理器上的STCLK信号)。

不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。

SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。

它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。

通用定时器STM32一共包含8个通用定时器,其中,TIME1和TIME8-高级定时器,TIME2~TIME5通用定时器,TIME6和TIME7高级定时器。

在这里我使用定时器的作用是用定时器产生定时中断,以定时器3来说明产生定时中断的步骤;1)TIM3时钟使能。

这里我们通过APB1ENR 的第 1 位来设置TIM3 的时钟,因为Stm32_Clock_Init 函数里面把APB1 的分频设置为2,所以我们的TIM3 时钟就是APB1 时钟的2倍,等于系统时钟。

2)设置TIM3_ARR和TIM3_PSC 的值。

通过这两个寄存器,我们来设置自动重装的值,以及分频系数。

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

定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)
定时器定时时间的计算
xcj 2015/06/03 09:23
假设定时器的时钟频率为f,f已知。

那么定时器每计数一次所用时间为1/f。

1/f代表了定时器的定时的时间精度(或最小计时单位)。

往计数器写的初值为Ticks,就是经过Ticks个周期后,定时器值变为0,定时时间到了。

如果我们要定时的时间为T,那么计算公式为:
T = ticks * (1/f) (1)
整理后可得
ticks = f * T (2)
举个例子,假如定时器的时钟为SystemCoreClock,要定时1mS。

那么 ticks = SystemCoreClock * 1mS =SystemCoreClock * 1 * 10^(-3)=SystemCoreClock/1000
换个思路,如果已知定时器的时钟频率为f,要用定时器产生一个频率为f1的定时中断(T=1/f1)。

根据公式(2)有
ticks = f /f1 (3)
上面的式子中 f1<f
如果定时器的时钟频率为SystemCoreClock,要用定时器产生一个频率为1KHz(1000Hz,周期为1ms)的定时中断,
那么ticks = SystemCoreClock /1000
公式(3)比较常用,也好计算。

在ucos ii中,OS_TICKS_PER_SEC代表每秒产生的中断个数,也就是是说OS_TICKS_PER_SEC的单位是Hz。

由于SysTick定时器的时钟频率为SystemCoreClock,那么Ticks就需要设置为
Ticks = SystemCoreClock/OS_TICKS_PER_SEC
这也是函数OS_CPU_SysTickInit()的参数为什么是SystemCoreClock/OS_TICKS_PER_SEC的原因了。

相关文档
最新文档