TIM2定时中断嵌套sytick定时器中断异常
- 格式:docx
- 大小:12.54 KB
- 文档页数:1
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 信号)。
定时器中断概述定时器中断是一种常见的硬件中断机制,用于在特定的时间间隔内触发中断并执行特定的任务。
在嵌入式系统中,定时器中断广泛应用于实时任务调度、时间计时、采样和数据处理等场景。
本文将介绍定时器中断的基本原理、功能、应用场景以及在Markdown文本格式下如何书写。
基本原理定时器中断的实现基于系统中的硬件定时器。
在嵌入式系统中,硬件定时器由计数器和控制逻辑组成,可以根据设定的计时周期自动递增计数器的值。
当计数器的值达到设定的中断触发值时,自动触发中断,进而执行中断服务函数。
功能与作用1.实时任务调度:通过定时器中断,可以周期性地触发中断服务函数,用于实时任务调度。
通过合理设置定时器的计时周期,可以使任务按照一定的时间间隔进行执行,有效提高系统的实时性。
2.时间计时:通过定时器中断,可以实现时钟的计时功能。
通过定时器中断,可以在每次中断发生时,将计数器的值自增,从而实现精确的时钟计时功能。
3.采样和数据处理:在一些实时数据处理应用中,定时器中断可以用于周期性地采样传感器数据或执行数据处理任务。
通过合理设置定时器的计时周期,可以使采样和数据处理按照一定的频率进行,以满足实时性要求。
应用场景定时器中断广泛应用于嵌入式系统中的各个领域,以下是几个常见的应用场景:实时操作系统在实时操作系统(RTOS)中,定时器中断是任务调度的重要手段。
通过在固定的时间间隔内触发中断,RTOS可以及时调度不同的任务,使得系统能够按照预定的响应时间完成任务。
数据采集与处理在数据采集与处理领域,定时器中断常用于周期性地进行数据采样和处理。
例如,通过定时器中断可以按照固定的采样率对传感器进行采样,或者按照固定的处理频率对数据进行处理,以满足实时性和精确性要求。
触摸屏控制在触摸屏控制中,定时器中断常用于扫描触摸屏的状态。
通过定时器中断,可以周期性地扫描触摸屏的状态,以检测用户的触摸操作,并实现相应的界面交互。
Markdown文本书写在Markdown文本中,可以使用以下语法来书写关于定时器中断的内容:标题使用#符号开头,后面跟随标题内容,表示不同级别的标题。
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频率运⾏。
定时器中断原理
定时器中断原理是指通过计时器来计数,当计数值达到某个特定值时,触发中断信号,执行相应的中断处理程序。
定时器中断可以用于实现周期性的任务执行、计时、延时等功能。
定时器中断的原理主要包括以下几个步骤:
1. 配置定时器参数:首先,需要设置定时器的计数方式、计数范围和计数速度等参数。
这些参数决定了计时器的计数精度和溢出时间。
2. 启动定时器:一旦定时器配置完成,就可以启动定时器开始计数。
定时器会根据设定的计数方式和计数范围进行计时,每计数一次会增加计数器的值。
3. 监控计数器值:系统会不断地监控定时器的计数器值。
当计数器值达到预设的特定值时,即达到了预定的时间间隔,就会触发中断信号。
4. 中断处理程序:一旦中断信号触发,系统会跳转到预设的中断处理程序中执行。
中断处理程序可以是预先编写好的代码,用于实现特定的功能或任务。
5. 复位计数器:在中断处理程序执行完毕之后,需要将计数器复位。
复位计数器可以重新开始计数,以实现周期性的任务执行。
通过定时器中断原理,可以实现定时执行某个任务,比如周期
性地检查传感器数据、更新显示等;可以进行计时操作,比如测量某个事件的时间间隔;还可以实现延时功能,比如实现延时执行某个任务或操作。
总结来说,定时器中断原理就是通过计时器进行计数,当计数值达到特定值时触发中断信号,进而执行相应的中断处理程序,实现周期性的任务、计时和延时等功能。
定时器中断的应用原理总结什么是定时器中断定时器是一种用来测量和控制时间间隔的设备。
定时器中断是指当定时器计时到达预设时间时,系统会触发一个中断请求,从而使程序执行特定的中断处理函数。
在嵌入式系统中,定时器中断被广泛应用于各种场景,例如任务调度、实时数值采集、通信协议处理等。
定时器中断的工作原理时钟源选择在使用定时器中断之前,需要首先选择一个适合的时钟源。
嵌入式系统中通常使用系统时钟或者外部晶体振荡器作为时钟源。
预设定时器计数初值定时器中断的触发是基于定时器计数器的计数值。
在使用定时器中断之前,需要预设定时器计数初值,即定时器计数器从哪个值开始计数。
预设定时器中断时间定时器中断的触发时间通过预设定时器中断时间来确定。
根据嵌入式系统的需求,可将定时器中断设置为周期性触发,或者仅触发一次。
中断服务函数当定时器中断被触发时,系统会自动进入中断服务函数处理中断。
中断服务函数是一段特殊的代码,用来响应中断请求,执行特定的任务或操作。
中断优先级设置在嵌入式系统中,经常会同时使用多个定时器中断。
为了避免不同中断之间的冲突,需要设置中断的优先级。
一般情况下,越重要的中断优先级越高。
定时器中断的应用场景嵌入式操作系统中的任务调度在嵌入式操作系统中,任务调度是实现多个任务协同运行的重要机制之一。
定时器中断可用于触发任务调度,当定时器计数到达预设时间时,引发任务切换,切换到下一个任务的执行。
实时数值采集在实时数值采集场景中,需要按照一定的频率对传感器进行采样。
定时器中断可用于定时触发采样操作,确保采样频率的准确性和稳定性。
通信协议处理通信协议处理是嵌入式系统中的一项重要任务。
定时器中断可用于定时检测接收到的数据,并触发相应的处理函数,实现通信协议的解析和执行。
时钟显示定时器中断可用于实现时钟显示功能,定时触发更新显示的时分秒。
定时器中断的优势和注意事项优势•精确控制时间间隔:定时器中断可实现精确的时间控制,适用于对时间精度要求较高的场景。
关于定时器中断使用第一篇:关于定时器中断使用【学习心得】关于定时器中断的使用看了这么久,第一次发帖,做点贡献。
最近了解了一下Arduino 的中断,除了外部中断外,还有定时器中断,前面已经有大神介绍过中断的概念,这里就不详细介绍了。
下面的程序是用定时器中断让13引脚 led灯每500ms变化一次。
(使用的库在帖子底端)ARDUINO 代码// led灯接UNO的13管脚#include//定时器库的头文件void flash()//中断处理函数,改变灯的状态 {static boolean output = HIGH;digitalWrite(13, output);output =!output;}void setup(){pinMode(13, OUTPUT);MsTimer2::set(500, flash);// 中断设置函数,每 500ms 进入一次中断MsTimer2::start();//开始计时 }void loop(){}再提供一种方法,利用mills()同样函数可以实现中断的功能。
mills()函数功能是获取系统运行的时间长度,单位ms。
最大为9小时22分,如果超出时间将从0开始。
函数的返回值为unsigned long型。
下面程序的功能让led灯亮灭各500ms : ARDUINO 代码unsigned long ledOn=500,ledOff=500;//定义led灯变化的时间长度,每500ms变化一次 int ledStatus;//定义LED灯的状态,HIGH or LOWm void setup(){pinMode(13,OUTPUT);digitalWrite(13,HIGH);ledStatus=HIGH;} void loop(){unsigned long nowtime=millis();//获取当前的系统运行时间长度if(ledStatus==HIGH)//如果当前lled灯状态为高电平,则执行该程序{if(nowtime>ledOn)//检测系统运行时间长度是否到500ms{ledOn=nowtime;//记录当前时间长度,第一次为500ms,赋值给ledOnledOff=nowtime+500;//计算出下一次led灯变化的时刻,第一次运行程序时应该在1000ms时关灯digitalWrite(13,LOW);//关掉led灯ledStatus=LOW;//记录当前led灯状态,下一次使用}}else{if(nowtime>ledOff){ledOff=nowtime;ledOn=nowtime+500;digitalWrite(13,HIGH);ledStatus=HIGH;}} }如果需要,可以控制led灯在某一时间段或某一时刻亮灭。
现象:
TIM2设置10Ms定时中断,运行delay(2),程序就停滞了
分析:
Sytick滴答定时器中断优先级是占线式的(实践的出来的血的经验),因为中断优先级组配置为0时,虽然TIM2的响应式优先级为2,应该说sycik的优先级已经是0了,可以走delay中断的,但是还是不行。
把中断优先级类型配置为4,即全部是抢占式优先级式,TIM2也开始走了,delay也开始走了。
这个折腾很久的,systick在R008文档中说的太少,网友的博客说了很多,只是提到systick 的中断优先级可以改,但是么有说他是抢占式的。
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
// NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
NVIC_SetPriority (SysTick_IRQn, 0);
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_Init( &NVIC_InitStructure);。