STM32 SysTick 系统时钟 超简易定时器SysTick

合集下载

STM32时钟设置_SysTick_教程

STM32时钟设置_SysTick_教程
(二) STM32 SysTick 介绍 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 类型 , 延迟时间将不随系统时钟频 率改变。
/* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } }
/* Enable GPIOA and AFIO clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
TimingDelay--; if(TimingDelay % 2) {
TestSig = 1;
Generated by Foxit PDF Creator © Foxit Software For evaluation only.
} else {
(五) 仿真调试
Generated by Foxit PDF Creator © Foxit Software For evaluation only.

STM32学习笔记—SysTick定时器

STM32学习笔记—SysTick定时器

STM32 学习笔记—SysTick 定时器Q:什幺是SYSTick 定时器?
SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。

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

Q:为什幺要设置SysTick 定时器?
(1)产生操作系统的时钟节拍
SysTick 定时器被捆绑在NVIC 中,用于产生SYSTICK 异常(异常号:15)。

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

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

(2)便于不同处理器之间程序移植。

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

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

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

学习笔记:STM32的SysTick定时器

学习笔记:STM32的SysTick定时器

学习笔记:STM32的SysTick定时器SysTick定时器是一个系统定时器,该定时器是个24位的倒计数定时器,该定时器的最大用处在于可以提供一个操作系统任务切换所需要的“时钟滴答”。

该定时器是STM32中功能最简单的定时器,提供倒计数、中断两个功能,类似与8051的定时器。

SysTick是包含在Cortex-M3内核中的一个简单的定时器。

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

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

不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能大不相同。

因此,需要阅读芯片的使用手册来确定选择什么作为时钟源。

在STM32中SysTick以外部时钟HCLK(AHB时钟)或HCLK/8作为运行时钟。

SysTick工作分析SysTick是一个24位的定时器,即一次最多可以计数2^24个时钟脉冲,这个脉冲的计数值被保存到当前计数值寄存器STK_VAL中,只能向下计数,每接收到一个时钟脉冲STK_VAL 的值就向下减1,直到为0。

当STK_VAL的值被减至0时,由硬件自动把重载寄存器STK_LOAD 中保存的数值加载到STK_VAL中,STK_VAL又重新向下计数……当使能中断时,STK_VAL的值减至0时,触发中断,就可以在中断服务函数中处理定时事件了。

当然,要使SysTick进行以上工作必须要进行SysTick配置。

它的控制配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CTRL中。

STK_CTRL是一个32位的寄存器,该寄存器与SysTick有关的位分别为Bit0(ENABLE)、Bit1(TICKINT)、Bit2(CLKSOURCE)、Bit16(COUNTFLAG)。

Bit0(ENABLE):SysTick的使能位,此位为1的时候使能SysTick定时器,为0的时候关闭SysTick定时器。

玩转STM32之systick篇

玩转STM32之systick篇

系统嘀嗒(SysTick)Cortex-M3处理器内部包含了一个简单的定时器。

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

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

不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。

因此,需要检视芯片的器件手册来决定选择什么作为时钟源。

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

在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。

滴答中断对操作系统尤其重要。

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

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

Stm32系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值) ,产生1ms 时间基准。

(STM32中systick校准数值寄存器为制度读23:0位值为9000)static u8 fac_us=0;//us延时倍乘数static u16 fac_ms=0;//ms延时倍乘数//初始化延迟函数//SYSTICK的时钟固定为HCLK时钟的1/8//SYSCLK:系统时钟void delay_init(u8 SYSCLK){SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8fac_us=SYSCLK/8;fac_ms=(u16)fac_us*1000;}//延时nms//注意nms的范围//SysTick->LOAD为24位寄存器,所以,最大延时为://nms<=0xffffff*8*1000/SYSCLK//SYSCLK单位为Hz,nms单位为ms//对72M条件下,nms<=1864void delay_ms(u16 nms){u32 temp;SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器SysTick->CTRL|=0x01 ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器}//延时nus//nus为要延时的us数.void delay_us(u32 nus){u32 temp;SysTick->LOAD=nus*fac_us; //时间加载SysTick->VAL=0x00; //清空计数器SysTick->CTRL=0x01 ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器}。

STM32知识:什么是SYSTICK 作用是什么

STM32知识:什么是SYSTICK 作用是什么

STM32知识:什么是SYSTICK 作用是什么什么是SYSTICK:这是一个24位的系统节拍定时器system TIck TImer,SysTIck,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。

作用:在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。

要解决这个问题,可以使用实时操作系统(RTOS).因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。

这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。

这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的心跳。

微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。

而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。

SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。

要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

时钟的选择:用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。

如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick 会以CPU主频的1/8频率运行。

3.5版本的库函数与以往的有所区别不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32。

stm32中滴答定时器的工作原理

stm32中滴答定时器的工作原理

stm32中滴答定时器的工作原理滴答定时器(SysTick)是STM32微控制器中的一种基本定时器,用于实现系统级的定时和延时功能。

它通常用于硬件抽象层的操作系统内核的实现以及其他需要高精度定时的应用场景。

滴答定时器的工作原理如下:1.时钟源选择:滴答定时器使用CPU时钟作为输入时钟,因此在使用之前需要首先设置CPU的主频。

CPU时钟可以是外部晶振,也可以是内部RC振荡器,由系统初始化代码进行设置。

2.模式选择和初始化:滴答定时器有两种工作模式,分别是中断模式和定时器模式。

中断模式下,定时器溢出时会产生中断请求,用于实时操作系统的任务调度;在定时器模式下,定时器溢出后会自动清零,用于延时等功能。

通过设置控制寄存器(STK_CTRL)可以选择工作模式和初始化定时器的值。

3.计数器递减:滴答定时器的计数值从初始化值开始递减,直到计数值为零时溢出。

每个CPU时钟周期,计数值会减去一个单位。

CPU的主频越高,滴答定时器的计数速度就越快。

4.滴答定时器中断:当计数值减少到零时,滴答定时器会产生一个溢出中断。

在中断处理函数中,可以执行一些任务,如系统时钟更新、任务调度和延时等。

5. 重载和连续计数:滴答定时器的计数值可以自动加载初始化值,并在溢出后继续计数。

通过设置控制寄存器的使能位(enable)可以实现此功能。

当使能位为1时,计数器溢出后会自动重新加载初始化值并继续计数。

7.滴答定时器的应用:滴答定时器可用于实现微秒级的延时函数,用于生成固定时间间隔的任务调度,或者用于计算程序执行的时间等。

总之,滴答定时器是STM32微控制器中的一种基本定时器,可以用于实现系统级的定时和延时功能。

它通过使用CPU时钟作为输入时钟源,不断递减计数器的值,当计数器溢出时产生中断并执行相应的任务。

通过设置工作模式、初始化值和使能位等参数,可以配置滴答定时器的功能和精度。

它在实时操作系统的任务调度、时钟更新和延时等方面起着重要的作用。

STM32的SYSTICK定时器(系统滴答定时器)

STM32的SYSTICK定时器(系统滴答定时器)

STM32的SYSTICK定时器(系统滴答定时器)什么是SysTick?这是⼀个24位的系统节拍定时器system tick timer,SysTick,具有⾃动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得⼀定的时间间隔。

SysTick作⽤在单任务引⽤程序中,因为其架构就决定了它执⾏任务的串⾏性,这就引出⼀个问题:当某个任务出现问题时,就会牵连到后续的任务,进⽽导致整个系统崩溃。

要解决这个问题,可以使⽤实时操作系统(RTOS).因为RTOS以并⾏的架构处理任务,单⼀任务的崩溃并不会牵连到整个系统。

这样⽤户出于可靠性的考虑可能就会基于RTOS来设计⾃⼰的应⽤程序。

SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供⼀个有节奏的“⼼跳”。

微控制器的定时器资源⼀般⽐较丰富,⽐如STM32存在8个定时器,为啥还要再提供⼀个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就⽅便了程序在不同的器件之间的移植。

⽽使⽤RTOS的第⼀项⼯作往往就是将其移植到开发⼈员的硬件平台上,由于SYSTICK的存在⽆疑降低了移植的难度。

SysTick定时器除了能服务于操作系统之外,还能⽤于其它⽬的:如作为⼀个闹铃,⽤于测量时间等。

要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

SysTick时钟的选择SysTick寄存器说明在《Cortex-M3权威指南》(chap8.SysTick定时器章节)有说明⽤户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。

如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运⾏;⽽将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运⾏。

STM32单片机SysTick系统滴答功能解析

STM32单片机SysTick系统滴答功能解析

STM32 单片机SysTick 系统滴答功能解析
今天讲解“STM32F103SysTick 系统滴答”,“SysTIck系统滴答”是属于Cortex-M3 内核的一部分,主要是为运行的操作系统提供滴答时钟,如常见的操作系统:uCOS、RTOS 等。

不管M3 芯片属于哪一家公司,它都标配有SysTIck 这一部分。

因此,它属于芯片内核的一部分,主要是为了方便操作系统的移植。

其实,SysTIck 能实现的功能,都可以由TIM 来实现。

SysTick 无非就是定时中断的功能,它完全可以由TIM 定时器来完成。

之所以SysTick 独立出来就是因为它属于内核一部分,方便用户移植,而且简单方便。

学过uCOS 的人都知道,以前在51,或者430 上面是由定时器完成的时钟滴答,到后面ARM 公司就用到了一个好的办法,就是在内核中标配一个SysTick,这样下来移植系统不用那幺麻烦了。

SysTick 除了在操作系统中起到作用,其实在裸机程序中也起到很大作用,比如:定期处理一段程序、超时定时、串口接收超时等,今天就以“定期处理一段程序”为例来说一下。

内容讲解。

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分频器。

STM32的SysTick时钟源是来自Cortex系统定时器吗?

STM32的SysTick时钟源是来自Cortex系统定时器吗?
再次看SysTick_Config函数源码:
__STATIC_INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)
>SysTick_LOAD_RELOAD_Msk){return(1UL);/*Reloadvalueimpossible
SysTick_CTRL_INT_Msk|SysTick_CTRL_ENABLE_Msk;/*Enable
SysTickIRQandSysTickTimer*/return(0UL);/*Functionsuccessful*/}
你会发现,其实源码已经默认使用HCLK(内核)时钟。
而SysTick_Config函数属于内核(如core_cm3.h)已经写好源码,一般我
外部时钟。
通过对SysTick控制与状态寄存器的设置,可选择上述时钟或
Cortex(HCLK)时钟作为SysTick时钟。
--来自参考手册
也就是说SysTick时钟源可以来自两个地方:
AHB时钟8分频
HCLK(内核)时钟
通过SysTick控制与状态寄存器的设置进行选择时钟源。
具体就是通过CLKSOURCE(时钟源)这一Bit位来选择:
误区。
我顺便也搜索了一下,网上很多文章都说到:SysTick时钟源是来自
Cortex系统定时器,就是那个有8分频的时钟
这段代码实现1ms中断一次相信大家都能理解,但是这里SysTick初始化
和上面说的时钟『/8』有关系吗?
3
SysTick时钟源是来自哪里?
这个问题只要认真看参考手册都能找到答案。
RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(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片内外设 -- Systick

STM32片内外设 -- Systick

在很多场合下,我们经常会需要一个简单的延时函数。

为了不暂用片内的其他资源,往往会想到Cortex-M3自带的Systick这个定时器。

但是如何实现这样的功能呢,还得慢慢道来。

所谓磨刀不误砍柴工,因此我们先了解一下Systick到底有哪些寄存器,操作哪些寄存器才能达到我们的目的呢?每个Cortex-M3内核都含有一个称之为系统定时器的定时器,即SysTick,减计数,过零重载等基本功能。

它总共含有4个寄存器:分别是控制和状态寄存器,重载值寄存器,当前值寄存器和校正值寄存器。

控制和状态寄存器(Systick Control and Status Register),功能包含定时器使能位,是否使能异常( exception),以及配置Systick的时钟源和是否有计数到零的标志位。

其复位之后的默认值为0x00000000;--ENABLE,BIT0,决定了是否使能Systick。

0 = 定时器禁止1 = 定时器使能-- TICKINT,BIT1,决定了当Systick计数到零时,MCU是否会去响应该事件。

是否需要响应Systick中断就是由这个位控制了。

0 = 计数器向下计到零时,MCU不会响应Systick异常。

1 = 计数器向下计到零时,MCU会响应Systick异常。

-- CLKSOURCE,BIT2,指明了Systick的时钟源。

HFCORECLK或则是RTC。

0 = RTC计数器的Bit01 = HFCORECLK-- COUNTFLAG,BIT16,指明了定时器是否有过零事件发生。

即当定时器计数器从1变到0时,该标志位置1.重载值寄存器(Systick Reload Value Register),定义了定时器重载时的初值。

当定时器当前计数值减到0时,就会将重载值寄存器里面的值载入到定时器当前值。

重载发生在当前计数器为零之后的下一个时钟信号的边沿。

-- RELOAD,BIT0~BIT23,有效位为24Bit。

定时器计算方法

定时器计算方法

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学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器2011年3月21日系统时钟和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分频器。

STM32-Systick时钟

STM32-Systick时钟

针对STM32 3.5的库版本的SysTick编写的简单定时时钟的LDE灯闪烁,网上的大多Systick滴答时钟都是2.0版本的库,由于现在都是3.5库函数,所以,会出现编译错误,没有定义等问题,找了好久,这个问题才解决#include "stm32f10x.h"void Delay(u32 nTime);//声明延迟函数void GPIO_Configuration(void);int main(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_Configuration();while(SysTick_Config(SystemCoreClock/1000)!=0);//配置SysTick,装入初始值,装载值根据时钟源频率而定,72MHz时钟源则产生1ms中断需要装载值为(72000000/1000)while(1){GPIO_ResetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9);GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8);Delay(1000);GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8);GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9);Delay(1000);GPIO_Write(GPIOC,0x0140);Delay(1000);GPIO_Write(GPIOC,0x0280);Delay(1000);}}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);}volatile u32 TimingDelay;//定义全局变量,其声明在stm32f10x_it.c中void Delay(u32 nTime)//定义延迟函数TimingDelay=nTime;//将延迟数赋予全局变量while(TimingDelay!=0);}其中,在stm32f10x_it.c中:extern volatile u32 TimingDelay; 声明全局变量void SysTick_Handler(void){TimingDelay--;}3.2 结果编译烧入开发板后,LED等以1s的时间精确交替闪烁。

stm32几种时钟控制介绍,含原理图

stm32几种时钟控制介绍,含原理图

stm32几种时钟控制介绍,含原理图本文提到的有以下内容:• 时钟系统与总线矩阵• SysTick系统定时器• RTC实时时钟• 看门狗定时器• 通用定时器一、时钟系统与总线矩阵stm32F4的时钟树如下图所示:在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。

我们在学习51单片机的时候,其内部是没有晶振的,而stm32是有的。

stm32可以通过RCC(时钟控制寄存器)对时钟进行参数配置以及使能。

我们还可以通过修改system_stm32f4xx.c文件,来配置上述时钟树上的一些分频、倍频参数,得到理想的频率。

在单片机系统中,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序,组合电路需要好好理解清楚。

我们先来看一下总线矩阵。

片上总线标准种类繁多,而由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。

AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。

二者分别适用于高速与相对低速设备的连接。

一般性的时钟设置需要先考虑系统时钟的来源,是内部RC还是外部晶振还是外部的振荡器,是否需要PLL。

然后考虑内部总线和外部总线,最后考虑外设的时钟信号。

遵从先倍频作为CPU时钟,然后在由内向外分频,下级迁就上级的原则。

STM32 SysTick 系统时钟 超简易定时器SysTick

STM32 SysTick 系统时钟 超简易定时器SysTick

STM32 SysTick 系统时钟超简易定时器SysTick/*** @brief Configures the SysTick. 系统时钟配置函数main.c* @param None* @retval None*/void SysTick_Configuration(void){/* Setup SysTick Timer for 100 msec interrupts */if (SysTick_Config((SystemCoreClock) / 10))// 1/10s=100ms{ /* Capture error */ while (1);}NVIC_SetPriority(SysTick_IRQn, 0x0);}/*** @brief This function handles SysTick Handler. 系统时钟中断函数stm32f10x_it.c* @param None* @retval None*/void SysTick_Handler(void){/* Generate TIM1 COM event by software */TIM_GenerateEvent(TIM1, TIM_EventSource_COM);}SysTick_Config(SystemFrequency / 10) 函数的形参就是systick 重装定时器的值。

systck 计数频率为每秒72000000 次,所以72000 次就是1/10 秒,也就是100ms。

SysTick 是1 个24bit 递减计数器,通过对SysTick 控制与状态寄存器的设置,可选择HCLK 时钟(72M)或HCLK 的8 分频(9M,缺省是这个)作为SysTick 的时钟源。

SysTick 的重装寄存器决定了定时器频率。

若SysTick 的时钟源是72M, SystemFrequency = 72000000Hz 所以SysTick_Config(SystemFrequency / 1000);就是1ms 时基。

STM32的系统滴答定时器(Systick)

STM32的系统滴答定时器(Systick)

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置优先级 for
Cortex-M0 系统中断 */
SysTick->VAL = 0;
/* 装载计数器值(当前计数值清 0) */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* 重装值超过了 24 位,是不可
能的。返回失败值 0 */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置重装载寄存器 */
*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) {
/* 参数检查 */ assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); if (SysTick_CLKSource == SysTick_CLKSource_HCLK) {
在 misc.C 文件最后有下面一个函数
/** * @功能: 配置 SysTick 时钟源 * @输入参数: SysTick_CLKSource: 指定 SysTick 时钟源. * 该参数可以是以下其中一个值: * @ SysTick_CLKSource_HCLK_Div8: AHB 时钟 8 分频作为 SysTick 时钟源 * @ SysTick_CLKSource_HCLK: AHB 时钟作为 SysTick 时钟源.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32 SysTick 系统时钟超简易定时器SysTick
2010年11月22日星期一14:24
转载自282280072
最终编辑chinleo
/**
* @brief Configures the SysTick. 系统时钟配置函数 main.c
* @param None
* @retval None
*/
void SysTick_Configuration(void)
{
/* Setup SysTick Timer for 100 msec interrupts */
if (SysTick_Config((SystemCoreClock) / 10)) // 1/10s=100ms
{
/* Capture error */
while (1);
}
NVIC_SetPriority(SysTick_IRQn, 0x0);
}
/**
* @brief This function handles SysTick Handler. 系统时钟中断函数 stm32f10x_it.c * @param None
* @retval None
*/
void SysTick_Handler(void)
{
/* Generate TIM1 COM event by software */
TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
}
SysTick_Config(SystemFrequency / 10) 函数的形参就是systick重装定时器的值。

systck计数频率为每秒72000000次,所以72000次就是1/10秒,也就是100ms。

SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。

SysTick的重装寄存器决定了定时器频率。

若SysTick的时钟源是72M, SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000);就是1ms时基。

// 1/1000 s=1ms
关于SysTick校准寄存器的介绍(大多数情况下,我们可以不必理会它)
校准值寄存器提供了这样一个解决方案:它使系统即使在不同的CM3产品上运行,也能产生恒定的SysTick中断频率。

最简单的作法就是:直接把TENMS的值写入重装载寄存器,这样一来,只要没突破系统极限,就能做到每10ms来一次 SysTick异常。

如果需要其它的SysTick 异常周期,则可以根据TENMS的值加以比例计算。

只不过,在少数情况下,CM3芯片可能无法
准确地提供TENMS的值(如,CM3的校准输入信号被拉低),所以为保险起见,最好在使用TENMS 前检查器件的参考手册。

SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。

要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

下面利用 SysTick 产生的硬件延时函数延时 dly_ms 毫秒
/******************************************************************************* * Function Name : SysTickHandler
* Description :系统时钟,一般调教到1MS中断一次
*******************************************************************************/ void SysTick_Handler(void)
{
if(Timer1)
Timer1--;
}
/********************************************
**函数名:SysTickDelay
**功能:使用系统时钟的硬延迟
**注意事项:一般地,不要在中断中调用本函数,否则会存在重入问题.另外如果屏蔽了全局中断,则不要使用此函数
********************************************/
volatile u16 Timer1;
void SysTickDelay(u16 dly_ms)
{
Timer1=dly_ms;
while(Timer1);
}。

相关文档
最新文档