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分频器。
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时钟做延时函数的学习笔记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学习笔记

2011年1月15日星期六SysTick 是MDK定义了的一个结构体(在stm32f10x_map.里面),里面包含CTRL、LOAD、VAL、CALIB 等4 个寄存器,我自己理解为要是使用systick时钟是肯定要对这个寄存器进行设置的。
具体到什么事寄存器什么为什么内部会是这个样子,那我就不得而知了但是我懂得这个是配置必须的东西而且这个寄存器是被mdk定义为了一个结构体stm32f10x_map今天算是又学到了一招利用mdk 里边右键里面有一个go to definition 可以跟踪到这个元素的初始的位置,就相当于是找到它最为原始的定义。
然后找到了一些个U8 u16 u32 等等的含义哈哈原来STM32就是如此的简单当然群里的威力也是很大的。
typedef signed long s32;typedef signed short s16;typedef signed char s8;typedef signed long const sc32; /* Read Only */typedef signed short const sc16; /* Read Only */typedef signed char const sc8; /* Read Only */typedef volatile signed long vs32;typedef volatile signed short vs16;typedef volatile signed char vs8;typedef volatile signed long const vsc32; /* Read Only */typedef volatile signed short const vsc16; /* Read Only */typedef volatile signed char const vsc8; /* Read Only */typedef unsigned long u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long const uc32; /* Read Only */typedef unsigned short const uc16; /* Read Only */typedef unsigned char const uc8; /* Read Only */typedef volatile unsigned long vu32;typedef volatile unsigned short vu16;typedef volatile unsigned char vu8;typedef volatile unsigned long const vuc32; /* Read Only */typedef volatile unsigned short const vuc16; /* Read Only */typedef volatile unsigned char const vuc8; /* Read Only */2011年1月16日星期日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; //清空计数器}我现在有点不明白CTRL之前设置的有相应的选择,为什么这个地方只要第0位置位就行了,而不需要相应的其他设置了,比较郁闷但是后便的不难理解,首先do-while语句就是先执行do{}内的内容,再判断while{}内的内容,如果while中的内容为非0,则再返回do{}内执行,再判断while{},直到while{}内部条件按为0,跳出循环。
stm32定时器笔记

无疑STM32的定时器是复杂的,主要有定时,捕获,PWM产生功能。
我花了点时间看通用定时器2,3,4的框图,tim1则在通用定时器的基础上多加了些功能,称为高级定时器。
////////////////////////////////////////////////////////////////////////////////根据程序来分析://///////////定时器2配置500ms///////////////////////////////////////////////////////TIM_DeInit(TIM2);//TIM2,3,4:SystemClk=APB1(Max36Mhz)RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;//使能TIM2的时钟//////////定时器2配置/////////////////////////////////计划:PSC=349则CK_CNT=36Mhz/(349+1)=>10us//ARR=500001us*50000=50msm_TIM_TimeBaseInitTypeDef.TIM_Prescaler=349;//预分频PSC(0-65535)m_TIM_TimeBaseInitTypeDef.TIM_CounterMode=TIM_CounterMode_Up;//计数模式m_TIM_TimeBaseInitTypeDef.TIM_Period=50000;//自动重载ARR(0-65535)m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频因子1,2,4m_TIM_TimeBaseInitTypeDef.TIM_RepetitionCounter=0;//循环计数次数(只是TIM1,8有)TIM_TimeBaseInit(TIM2,&m_TIM_TimeBaseInitTypeDef);//////////////////////////////////////////////////////使能配置中断=>:使能更新事件中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Enables or disables the specified TIM interrupts.//注意TIM_UpdateDisableConfig用DISABLE函数处才将对应为清零而达到使能(UDIS=0:使能更新事件)TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.NVIC->ISER[0]|=(1<<(TIM2_IRQChannel&0x1F));//enable interrupt//开始计数TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.首先在在定时功能上和传统的51,avr比,多了些功能,其他的一样。
STM32学习笔记—SysTick定时器

STM32学习笔记—SysTick定时器
则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。
SysTick 定时器能产生
中断,CM3 为它专门开出一个异常类型,并且在向量表中有它的一席之地。
它使操作系统和其它系统软件在CM3 器件间的移植变得简单多了,因为在所有CM3 产品间对其处理都是相同的。
(3)作为一个闹铃测量时间。
SysTick 定时器除了能服务于操作系统之外,还能用于其它目的:如作为一
个闹铃,用于测量时间等。
要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick 定时器亦将暂停运作。
Q:Systick 如何运行?
首先设置计数器时钟源,CTRL-CLKSOURCE(控制寄存器)。
设置重载值(RELOAD 寄存器),清空计数寄存器VAL(就是下图的CURRENT)。
置CTRL- ENABLE 位开始计时。
如果是中断则允许Systick 中断,在中断例程中处理。
如采用查询模式则不
断读取控制寄存器的COUNTFLAG 标志位,判断是否计时至零。
或者采取下
列一种方法
当SysTick 定时器从1 计到0 时,它将把COUNTFLAG 位置位;而下述方法可以清零之:
1. 读取SysTick 控制及状态寄存器(STCSR)
2. 往SysTick 当前值寄存器(STCVR)中写任何数据
只有当VAL 值为0 时,计数器自动重载RELOAD。
Q:如何使用SysTicks 作为系统时钟?。
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学习手记⑤SysTick精确延时

STM32学习手记⑤-SysTick精确延时/************************************************ ***********例程名称:SysTick实验硬件连接:指示灯连接 PE0功能描述:每秒PEO翻转一次*/#include "stm32f10x_lib.h"extern vu32 TimingDelay; //在本文件引用stm32f10x_it.c定义的精确计时变量/************************************************ ************* 函数名称:void RCC_Configuration()* 功能描述:复位和时钟控制配置* 参数:无* 返回值:无* 全局变量:无* 全局静态变量:无* 局部静态变量:无************************************************* *******/void RCC_Configuration(){ErrorStatus HSEStartUpStatus; //定义外部高速晶振启动状态枚举变量RCC_DeInit(); //复位RCC外部寄存器到默认值RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好if(HSEStartUpStatus==SUCCESS){ //外部高速时钟已经准备好FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enab le); //开启FLASH预读缓冲功能,加速FLASH的读取。
所有程序中必须的用法,位置:RCC初始化子函数里面,时钟起振之后FLASH_SetLatency(FLASH_Latency_2); //FLASH时序延迟几个周期,等待总线同步操作。
- 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自学手册(北京航空航天出版社\蒙博宇编著)