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定时器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:这是一个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单片机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学习笔记(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库开发实战指南-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 校准数值寄存器
位段 名称
类型 复位值 描述
STM32--SYSTICK超简易定时器
STM32--SYSTICK超简易定时器STM32 2010-04-07 17:44:42 阅读487 评论0 字号:大中小上次的定时器搞得我比较晕,勉强调通了程序,就实用主义来说应该算是勉强合格了。
当然CORTEX-M3独有的定时功能可是超级简单的那就是SySTick,所谓的系统定时器.配置方式简单简单的不能再简单,因为STM32 的库函数已经帮我们搞好了,只需要调用一个函数,就可以配置系统时钟的频率和开启系统时钟的中断.呵呵....不过这么好用的定时器只有一个。
//SYSTICK 分频--1ms的系统时钟中断if (SysTick_Config(SystemFrequency / 1000)){/* Capture error */while (1);}就是这么简单,系统就会产生一个1MS 的系统时钟中断(如果除数是500,那么当然地就是2MS的中断了).中断函数是:void SysTick_Handler(void);这个函数将以每1MS 就会运行一次,而且进入中断后不需要清除任何标志位,特省时间.而且还有点要说明的,SysTick是24 位倒计时的.设置的定时值最大就是2 的24 次方个系统时钟---已经很大了.直接SysTick_Config(SystemFrequency / 1000); 也行。
/***********************************************const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz;#define SYSCLK_FREQ_72MHz 72000000************************************************//******************************************************************************** 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);}/**********************************************************************************3.0的库相对2.0来说貌似删减了部分内容/*** @brief Configures the SysTick clock source.* @param SysTick_CLKSource: specifies the SysTick clock source.* This parameter can be one of the following values:* @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8* selected as SysTick clock source.* @arg SysTick_CLKSource_HCLK: AHB clock selected as* SysTick clock source.* @retval : None*/void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource){/* Check the parameters */assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); if (SysTick_CLKSource == SysTick_CLKSource_HCLK){SysTick->CTRL |= SysTick_CLKSource_HCLK;}else{SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;}}。
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时钟做延时函数的学习笔记SysTick 就是一个定时器而已,只是它放在了NVIC(嵌套中断控制器)中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。
滴答中断:操作系统进行运转的时候,也会有“心跳”。
它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。
这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。
很明显,这个“心跳”是不允许任何人来随意地访问和修改的。
只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
systick 的使用有四个寄存器:STK_CSR, 0xE000E010-- 控制寄存器STK_LOAD,0xE000E014 -- 重载寄存器STK_VAL,0xE000E018 -- 当前值寄存器STK_CALRB,0xE000E01C -- 校准值寄存器1、STK_CSR控制寄存器:寄存器内有4个位具有意义第0 位:ENABLE,Systick使能位(0:关闭Systick 功能;1:开启Systick功能)第1 位:TICKINT,Systick中断使能位(0:关闭Systick 中断;1:开启Systick 中断)第2 位:CLKSOURCE,Systick时钟源选择(0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick 时钟)第3 位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。
如果读取该位,该位将自动清零。
2、STK_LOAD 重载寄存器Systick 是一个递减的定时器,当定时器递减至0 时,重载寄存器中的值就会被重装载,继续开始递减。
STK_LOAD 重载寄存器是个24 位的寄存器最大计数0xFFFFFF。
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入门系列教程之十一《Systick编程》
STM32 入门系列教程Systick 的编程(2010-04-25)提到systick不得不抱怨以下STM32的用户手册,既然提供了systick的功能,为啥手册里却只提了一下?后来笔者上网搜的时候,才发现,抱怨的不仅仅是我一个人。
闲话不说,下面将笔者搜集的资料进行总结。
介绍Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。
没有学过操作系统的同学,可能会很郁闷,啥叫滴答中断?这里来简单地解释一下。
操作系统进行运转的时候,也会有“心跳”。
它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。
这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。
很明显,这个“心跳”是不允许任何人来随意地访问和修改的。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
知道systick在系统中的地位后,我们来了解systick的实现。
注意,本期教程并没有讲述systick如何在操作系统中的运行,因为这对初学者来说比较复杂。
我们这里只是举例说明systick的使用。
它有四个寄存器,笔者把它列出来:STK_CSR,0xE000E010--控制寄存器STK_LOAD,0xE000E014--重载寄存器STK_VAL,0xE000E018--当前值寄存器STK_CALRB,0xE000E01C--校准值寄存器以下部分参考互联网的一篇文章,网址为:/my/space.php?uid=116357&do=blog&id=31714感谢作者“416561760的博客”提供如此详细的寄存器说明的文章。
1、控制寄存器:寄存器内有4个位t具有意义第0位:ENABLE,Systick使能位(0:关闭Systick功能;1:开启Systick功能)第1位:TICKINT,Systick中断使能位(0:关闭Systick中断;1:开启Systick中断)第2位:CLKSOURCE,Systick 时钟源选择(0:使用HCLK/8作为Systick时钟;1:使用HCLK作为Systick时钟)第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。
09 STM32_SysTick
© 江苏师范大学物理与电子工程学院
陈斯
chensism@
粗略的延时函数
//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; } } //毫秒级的延时 void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000; //自己定义 while(i--) ; } }
陈斯
chensism@
什么是 SysTick 定时器
SysTick
– SysTick 定时器就是系统滴答定时器,一个
24 位的倒计数定时器,计到0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要不 把它在 SysTick 控制及状态寄存器中的使能位 清除,就永不停息,即使在睡眠模式下也能工作。 – SysTick定时器被捆绑在NVIC中,用于产生 SysTick 异常(异常号:15)。
嵌入式系统 及应用
陈斯 chensism@
09 STM32_SysTick
© 江苏师范大学物理与电子工程学院 陈斯 chensism@
1 2
什么是Systick定时器?
Systick 相关寄存器 STM32的 SysTick 配置步骤
ቤተ መጻሕፍቲ ባይዱ
3
4
delay文件夹讲解
© 江苏师范大学物理与电子工程学院
陈斯
chensism@
时钟源。//V3.5默认为HCLK时钟 SysTick的重装寄存器决定了定时器频率。 若SysTick的时钟源是72M, SystemFrequency = 72000000Hz 所以 SysTick_Config(SystemCoreClock / 1000); 就是1ms时 基。
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 基本定时器 学习笔记
1. STM32的Timer简介STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。
今天主要是研究剩下的8个定时器。
其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。
TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。
由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。
因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。
2基本定时器TIM6-TIM72.1 时钟基本特征基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC) 提供时钟。
实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。
这2个定时器是互相独立的,不共享任何资源。
2.2 TIM6-7主要特征TIM6和TIM7定时器的主要功能包括:● 16位自动重装载累加计数器● 16位可编程( 可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值分频● 触发DAC的同步电路● 在更新事件(计数器溢出)时产生中断/DMA 请求图144 基本定时器框图2.3 计数器模式TIM6-TIM7可以由向上计数。
向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。
2.4 编程步骤1. 配置优先级;2. 使能时钟3. 配置GPIO;4. 配置TIME;5.使能计数器;6.开中断;7.清除标志位;具体配置如下:(1) NVIC_Configuration(void);配置优先级(2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能时钟(3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct);配置GPIO(4) TIM_Configuration (void);配置TIM6/TIM7(5) TIM_Cmd(TIM7, ENABLE);使能定时器(6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中断(7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除标志位步骤(4)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。
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 时钟源.
STM32定时器学习笔记
STM32定时器学习笔记一.定时器I捕获模式1.测量PWM波的占空比此模式下要设置定时器2的主从模式,需要定时器的两个通道。
主从模式中,主模式通道的触发事件与从模式的触发事件相反,也就是说主模式是上升沿触发,则从模式则为下降沿触发。
主要的寄存器设置步骤如下,主从模式通常是使用一个定时器的1通道和2通道(固件库中设置的是这两个通道)。
①设置主模式通道(也就是主机)TIM2_CH2的捕获/比较通道映射在TI2上,映射功能设置在CCMR1寄存器的CCxS的两位为1B。
设置该捕获通道的滤波器,及其一个周期内采样点数,通常设置成默认值,也就是将CCMR1寄存器的ICxF[3:0]设置成0B。
②设置主机TIM_CH2为上升沿触发并且使能该通道的捕获功能,CCER 寄存器的CCxP位为触发事件的选择位,也就是上升沿和下降沿的选择位。
CCER寄存器的CCxE位通道捕获功能的使能位。
③设置主机TIM_CH2通道的分频数为1,也就是设置CCMR1寄存器的ICxPSC[1:0]为0B。
④触发源的选择,设置SMCR的TS[2:0]为110B,选择滤波后的定时器输入TI2。
⑤设置从机模式为复位模式,设置SMCR的SMS[2:0]为100B。
⑥开启复位模式,是主通道与从通道同步,SMCR寄存器的MSM 设置为1。
⑦开启TIM2_CH2(主机)的捕获中断,DIER寄存器的CC2IE位置1B。
⑧开启TIM2定时器,设置CR1寄存器CEN位为1B。
⑨从机TIM2_CH1被配置为输入也被映射到TI2上,设置成默认的滤波器和采样点数,并设置成下降沿触发,使能TIM2_CH1的捕获功能。
以下是用寄存器写的代码:TIM2->CCMR1 &= ~(3<<8); //清空对应位TIM2->CCMR1 |= 1<<8; //将CC2映射到TI2上TIM2->CCMR1 &= ~(0XF<<12); //输入捕获2滤波器为默认值TIM2->CCMR1 &= ~3; //清空对应位TIM2->CCMR1 |= 2; //将CC1映射到TI2上TIM2->CCMR1 &= ~(0XF<<4); //输入捕获1滤波器为默认值TIM2->CCER |= 1<<4 | 0<<5; //使能TIM2_CH2的捕获功能,上升沿触发TIM2->CCER |= 1 | 1<<1; //TIM2_CH1下降沿触发TIM2->CCMR1 &= ~(3<<10); //分频数位1TIM2->SMCR &= ~(7<<4); //清空对应位TIM2->SMCR |= 6<<4; //选择滤波后的定时器输入TI2TIM2->SMCR &= ~7; //清空对应位TIM2->SMCR |= 4; //从机模式为复位模式TIM2->SMCR |= 1<<7; //开启复位模式,是主从同步TIM2->DIER |= 1<<2; //开启捕获中断当然最后可别忘了使能定时器2哦。
STM32学习笔记——使用SysTick定时器做延时
STM32学习笔记——使用SysTick定时器做延时
开学了,无法再像假期一样能够一整天玩板了!好在这学期的课说少不少,说多也不多,每周也有十几大节。
剩下的时间除去学生工作等一些七七八八的
事情,间断着还是能看看教程玩玩板!越发发现《STM32菜鸟学习手册啰嗦版》真是不错的入门教程,简单易懂。
其他诸如《固件库手册》等等官方文件更是
必不可少,可惜ST公司的网页找手册实在麻烦得很呐!这两天一直在看有关
于系统嘀嗒时钟SysTick的文件,但由于3.5版的固件库较2.0版的库,已经将SysTick相关的驱动函数移除,用户要使用SysTick就必须改为调用CMSIS中的函数,而网上大多数的例程(包括《菜鸟学习手册》)使用的都是2.0的库,以至于在学习中遇到许多问题,程序编译总会出现问题。
一般都是无法找到与SysTick相关的函数,函数未定义错误。
因此,查找了许多文献才得以解决。
SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。
主要应用于操作系统,作为嘀嗒中断维持操作系统心跳的节律。
当然,SysTick
定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用
于测量时间等。
要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。
1.SysTick寄存器:
寄存器
说明
地址
CTRL
SysTick控制和状态寄存器
0xE000E010。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Q:什么是SYSTick定时器?
SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD 寄存器中自动重装载定时初值。
只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
Q:为什么要设置SysTick定时器?
(1)产生操作系统的时钟节拍
SysTic k定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。
因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
(2)便于不同处理器之间程序移植。
Cortex‐M3处理器内部包含了一个简单的定时器。
因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。
该定时器的时钟源可以是内部时钟(FC LK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。
不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。
SysTic k定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。
它使操作系统和其它系统软件在C M3器件间的移植变得简单多了,因为在所有C M3产品间对其处理都是相同的。
(3)作为一个闹铃测量时间。
SysTic k定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。
要注意的是,当处理器在调试期间被喊停(halt)时,则SysTic k定时器亦将暂停运作。
Q:Systick如何运行?
首先设置计数器时钟源,C TRL->CLKSOURCE(控制寄存器)。
设置重载值(RELOAD寄存器),清空计数寄存器VAL(就是下图的CURRENT)。
置CTRL->ENABLE位开始计时。
如果是中断则允许Systic k中断,在中断例程中处理。
如采用查询模式则不断读取控制寄存器的COUNTFLAG标志位,判断是否计时至零。
或者采取下列一种方法
当SysT ick 定时器从1计到0时,它将把COUNTFLAG 位置位;而下述方法可以清零之:
1. 读取SysTick 控制及状态寄存器(STCSR)
2. 往SysT ick 当前值寄存器(STCVR)中写任何数据
只有当VA L值为0时,计数器自动重载RE LOAD。
Q:如何使用SysTicks作为系统时钟?
SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。
OS 都需要这种“滴答”来推动任务和时间的管理。
如欲使能SysT ick 异常,则把STCSR.TICKINT置位。
另外,如果向量表被重定位到SRAM中,还需要为SysTick 异常建立向量,提供其服务例程的入口地址。
Q:如何使用SysTick完成一段延时?
查询方式参考:http://blog.ednc /atom6037/188271/message.aspx
中断方式参考:
初始化函数SysTic k_C onf iguration(void)放在while()循环外,执行一次:
view plainc opy to clipboardprint?
1.void SysT ick_Configuration(void)
2.{
3./* Selec t AHB clock(HCLK) as SysTic k clock sourc e 设置AH B时钟为SysTic k时钟*/
4. SysT ick_CLKSourc eConf ig(SysT ick_CLKSourc e_HCLK);
5.
6./* Set SysTick P riority to 3设置SysT icks中断抢占优先级 3,从优先级0*/
7. NVIC_Sys temH andlerPriorityC onf ig(Sys temHandler_SysTick, 3, 0);
8.
9./* SysTic k interrupt eac h 1ms with HCLK equal to 72MH z 每1ms发生一次SysTic k中断*/
10. SysT ick_SetReload(72000);
11.
12./* E nable the SysTic k I nterrupt */
13. SysT ick_ITConfig(ENABLE);
14.}
延时函数,需要延时处调用:
view plainc opy to clipboardprint?
1.void Delay(u32 nTime)
2.{
3./* E nable the SysTic k Counter 允许SysTic k计数器*/
4. SysT ick_CounterC md(SysTick_Counter_E nable);
5.
6. T imingDelay = nTime;
7.
8.while(T imingDelay != 0)
9. ; //等待计数至0
10.
11./* Disable the SysTick C ounter 禁止SysTic k计数器*/
12. SysT ick_CounterC md(SysTick_Counter_Dis able);
13./* Clear the SysTick C ounter 清零SysTic k计数器*/
14. SysT ick_CounterC md(SysTick_Counter_C lear);
15.}
中断函数,定时器减至零时调用,放在s tm32f10x_it.c文件中
view plainc opy to clipboardprint?
1.void SysT ickH andler(void)
2.{
3. T imingDelay--;
4.}。