SysTick定时器自学笔记(含Stm32源程序)
学习笔记: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处理器的微控制器都可以由这个定时器获得⼀定的时间间隔。
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频率运⾏。
STM32F4xx的SysTick定时器应用

STM32F4xx的SysTick定时器应用本例程为STM32F4XX(M4内核)关于systick应用的程序。
主函数main.c文件如下:#include "stm32f4xx.h"/**************************************************************************\** 文件名: mian.c ******************************************************* 库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.0.1 ************************* 工作环境: RealView MDK-ARM 4.23 ************************************* 作者: 曾有根***************************************************** 生成日期: 2012-08-03 ************************************************** 功能:SysTick的应用,精确延时,使led灯翻转********************\************************************************************************/extern void led_init(void);extern void TimingDelay_Decrement(void);extern void Delay(__IO uint32_t nTime);int main(){SystemInit();led_init();if (SysTick_Config(168000)) //时钟节拍中断时10ms一次,用于定时,168000也可以用SystemCoreClock / 1000 替代{while (1);}while(1){GPIO_SetBits(GPIOE,GPIO_Pin_7 | GPIO_Pin_8 );Delay(500); //延时500ms,led灯1s闪烁一次GPIO_ResetBits(GPIOE,GPIO_Pin_7 | GPIO_Pin_8 );Delay(500);}}相关配置systick_config.c文件如下:#include "stm32f4xx.h"static __IO uint32_t TimingDelay;void led_init(void){GPIO_InitTypeDef GPIO_InitStructure;/* Enable the GPIO_LED Clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Configure the GPIO_LED pin */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8; //led IO口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//模式:输出// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉,硬件自带上拉电阻,故此处不需要软件上拉,若不屏蔽则led灯很暗GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50M翻转GPIO_Init(GPIOE, &GPIO_InitStructure);}void TimingDelay_Decrement(void)//记得将此函数加入stm32f4xx_it.c文件中(第143行),并申明外部函数{if (TimingDelay != 0x00){TimingDelay--;}}void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}另外,在stm32f4xx_it.c文件中,需打开中断,操作如下:将此函数打开,并在stm32f4xx_it.c的前面申明extern void TimingDelay_Decrement(void);void SysTick_Handler(void){TimingDelay_Decrement(); //本行程序原本是屏蔽了的,切记要打开}未屏蔽程序如下:说明:已经经本人下载至STM32F4的开发板上成功调试,LED能够正常的翻转!可供广大奋斗在前线的机油们参考!。
STM32入门教程系统时钟SysTick

STM32入门教程系统时钟SysTickSTM32 入门教程系统时钟 SysTick(一) 背景介绍在传统的嵌入式系统软件按中通常实现 Delay(N) 函数的方法为:for(i = 0; i <= x; i ++);x --- 对应于对应于 N 毫秒的循环值对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行 for 循环时,要实现 N 毫秒的 x 值非常大,而且由于系统频率的宽广,很难计算出延时 N 毫秒的精确值。
针对 STM32 微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。
(二) 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 类型 , 延迟时间将不随系统时钟频率改变。
(三) ST SysTick 库文件使用ST的函数库使用systick的方法1、调用SysTick_CounterCmd() -- 失能SysTick计数器2、调用SysTick_ITConfig () -- 失能SysTick中断3、调用SysTick_CLKSourceConfig() -- 设置SysTick时钟源。
4、调用SysTick_SetReload() -- 设置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单片机利用ST库函数设置Systick

基于STM32单片机利用ST库函数设置Systick
Systick是STM32中特有的系统时钟SysTIck有两个功能:1.可以产生精
确延时;2.可以提供给系统一个单独的时钟节拍。
一般延时程序:
DELAY(N)
{ for(i=0 ; i《=x ; i++ );
}
对于STM32系列的微处理器中,执行一条指令只需要几十ns,进行for
循环时,要实现N毫秒延时,那幺x的意义非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值,那幺在一些高速电路中,是不允许的,容易出现问题,很难查找出来。
尤其在液晶驱动中,延时要求非常精确。
针
对STM32的处理器中,需要重新设计一个方法实现该功能,来代替
DELAY(N)延时;。
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。
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分频器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所有基于ARM Cortex-M3内核的控制器都带有SysTick定时器。使用定时器与使用while循环定时的区别在于定时器是独立于主程序运行的,当时 间到达的时候会发生中断,运行预先设定的中断程序。这样中断的程序的运行就不会受到主程序的影响。及时在主程序中发生了卡死,定时器仍然 会正常产生中断,运行中断程序。
首先,我们需要设定SysTick的时钟源,然后给其装在一个重装值。在时钟源的驱动下,定时器会进行减一操作,发生溢出后会产生中断。
STM32编程
在最新的库中,仅需使用SysTick_Config设置其时钟源即可。 #include "Include.h" uint32_t time=1000; int main(void) { Init_LED(); SysTick_Config(SystemCoreClock/1000); while (1) { if(time==0) { D5_TOGGLE; time=1000; } } }
其中Init_LED();包含了GPIO的初始化,D5_TOGGLE包含了命令是D5端口的LED灯电压翻转。
在STM32f10x_it.c中SysTick定时器中断部分添加 extern uint32_t time; void Sys
SysTick_Handler是系统关键字,放在STM32f10x_it.c中是为了把所有的中断都放在一起方便管理,也可以直接书写在main.c中。
参考文献:
stm32自学手册(北京航空航天出版社\蒙博宇编著)