SysTick计时器Word文档格式.docx
- 文档编号:20778425
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:21
- 大小:58.24KB
SysTick计时器Word文档格式.docx
《SysTick计时器Word文档格式.docx》由会员分享,可在线阅读,更多相关《SysTick计时器Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
4-10-保留---
11-5SVCall可配置e0x0000002C同步
12-13-保留---
14-2PendSV可配置e0x00000038异步
15-1SysTickc可配置e0x0000003C异步
15-保留---
16及之上d0及之上IRQ可配置e0x00000040及之上f异步
a.为简化软件层,CMSIS仅使用IRQ号,因此采用负数作为异常的编号,IPSR返回异常编号,详见第2-7页的中断程序状态寄存器。
b.有关更多的信息,请看中断向量表。
.
c.如果处理器没有系统滴答定时器,则异常15保留。
d.IRQ中断号是在处理器实现时定义的,范围是1-32。
未实现的IRQ异常编号被保留,例如,如果某处理器仅实现一个IRQ,则异常号17及以上的编号均被保留。
e.见第4-7页的中断优先级寄存器。
f.增长步长为4。
对于异步异常,除Reset外,处理器在异常被触发到异常开始被处理的这段时间内,仍能继续执行指令。
特权软件可以禁止第2-20页的表2-11中所列出的具有可配置优先级的异常,参见第4-5页的中断可清除寄存器(InterruptClear-enableRegister)。
更多关于硬故障的信息,可参见第2-27页的故障处理。
2.3.3异常处理
处理器使用以下方式处理异常:
ISRs中断服务子程序(ISRs)处理IRQ中断异常。
Faulthandler故障处理程序(Faulthandler)处理硬故障。
Systemhandlers系统处理程序(Systemhandlers)处理系统异常:
NMI,PendSV,SVCallSysTick和硬故障。
2.3.4异常向量表
异常向量表包含堆栈指针的复位值,以及起始地址。
堆栈指针的复位值和起始地址一起被称为异常向量,用于所有异常处理。
第2-22页的图2-1列出了异常向量表中的异常向量的次序。
每一个向量的最低位必须为1,表明异常处理是用Thumb代码实现的。
Exceptionnumber
IRQnumber
Vector
Offset
16+nn
IRQn
0x40+4n
182
171
160
15-1
14-2
13
12
11-5
10
9
8
7
6
5
4
3-13
2-14
1
IRQ2
IRQ1
IRQ0
SysTick,ifimplemented
PendSV
保留
SVCall
保留
HardFaultNMIReset
InitialSPvalue
0x48
0x44
0x40
0x3C
0x38
0x2C
0x10
0x0C
0x08
0x04
0x00
向量表起始地址固定于0x00000000。
2.3.5异常优先级
图2-1向量表
如第2-20页的表2-11所示,所有的异常都有一个优先级。
•优先级数值越小,优先级越高。
•除Reset,HardFault和NMI之外,其余所有异常都能配置其优先级。
如果软件没有配置优先级,那么所有可配置优先级的异常的优先级为0,关于配置异常的优先级的信息见:
•第4-18页的系统处理程序优先级寄存器(SystemHandlerPriorityRegisters)。
•第4-7页的中断优先寄存器(InterruptPriorityRegisters)。
可配置优先级的数值范围是0-192,步长为64。
Reset、HardFault和NMI是具有负数值的固定优先级异常,比其它异常具有更高的优先级。
给IRQ[0]分配一个较大的优先级数值,而给IRQ[1]分配一个较小的优先级数值,就意味着IRQ[1]比IRQ[0]的优先级高,如果IRQ[1]和IRQ[0]都被触发,则IRQ[1]比IRQ[0]先执行。
如果多个挂起的异常具有同等的优先级,那么具有较小异常号的异常优先执行。
例如,如果IRQ[0]和IRQ[1]具有相同的优先级,且都挂起,则IRQ[0]比IRQ[1]优先执行。
当处理器在执行一个异常处理时,如果有更高优先级的异常发生,则该异常可以被抢占。
如果发生的异常与正在执行的异常具有相同的优先级,则不管其异常号为多少,正在执行的异常都不会被抢占,而新发生的异常的状态变为挂起。
2.3.6异常处理的进入与返回
描述异常处理的一些术语:
抢占(Preemption)当处理器在执行一个异常处理时,另一个异常处理可以抢占这个正在被执行的异常处理,只要其优先级比正在被处理的异常优先级高。
一个异常处理抢占另一个异常处理,被称为异常嵌套,更多信息见第2-24页的异常入口。
返回(Return)当没有以下情况时,异常处理结束之后就异常返回:
•没有挂起的异常需要服务。
•所完成的异常处理不是一个迟到异常。
处理器从堆栈弹出数据,现场恢复到中断发生之前的状态。
更多信息见第2-25页的异常返回。
尾链(Tail-chaining)该机制加速了异常服务。
当一个异常处理刚好完成时,若此时有一个挂起的异常满足进入执行的条件,则从堆栈弹出数据的操作就跳过,直接转到这个新的异常处理。
迟到(Late-arriving)该机制加速抢占。
当一个异常处理正在保存状态时,如果出现了一个更高优先级的异常,则处理器切换去执行这个更高优先级的异常,为新异常初始化预取向量。
迟到异常并不影响向量的保存,因为两个异常需要保存的状态是一致的。
在迟到异常返回时,正常的尾链规则依然有效。
异常进入
有一个具有足够高优先级的挂起异常,以及以下条件之一,则可以进入异常:
•处理器处于Thread模式。
•新的异常比正在处理的异常具有更高的优先级。
这种情况下,新异常抢占正在执行的异常。
当一个异常抢占另一个异常时,将出现异常嵌套。
足够高优先级的含义是,该异常比屏蔽寄存器限制的所有异常的优先级都高,而优先级低的异常将挂起,不执行。
当处理器处理一个异常时,除非该异常是一个尾链或迟到的异常,处理器把信息压入当前堆栈,这一操作称为入栈,而这个8字的数据结构被称为一个堆栈帧,堆栈帧包含如下的信息:
SPpointsherebeforeinterrupt
Decreasingmemoryaddress
SP+0x1C
SP+0x18
SP+0x14
SP+0x10
SP+0x0C
SP+0x08
SP+0x04
<
previous>
xPSR
PC
LR
R12
R3
R2
R1
R0
SP+0x00
SPpointshereafterinterrupt
入栈后,堆栈指针指向帧的最低地址,堆栈帧是双字地址对齐的。
堆栈帧信息包含返回地址,这个返回地址是被中断程序的下一条要执行指令的地址,该地址值保存在堆栈帧信息的PC中,因此被中断程序能恢复现场。
处理器从向量表中读取异常处理程序的起始地址,当保护现场的入栈操作完成后,处理器开始执行异常处理程序。
与此同时,处理器会将一个EXC_RETURN值写到LR寄存器,这能指明与堆栈信息帧相应的堆栈指针,以及进入异常之前处理器所处的操作模式。
如果在进入异常时没有发生更高优先级的异常,则处理器开始执行该异常处理,并自动把该异常的状态由挂起修改为激活
如果在进入异常时发生了另一个更高优先级的异常,则处理器将执行高优先级的异常处理,先前的异常的挂起状态保持不变,这属于迟到异常的情况。
异常返回
当处理器处于Handler模式,且执行以下之一指令将PC的值置为EXC_RETURN的值,则发生异常返回:
•执行POP指令,加载PC寄存器。
•执行BX指令(任何寄存器均可)。
在异常进入时,处理器把EXC_RETURN的值保存到LR寄存器。
处理器根据此数值来决定异常处理完成时的动作。
EXC_RETURN值的[31:
4]位是0xFFFFFFF,当处理器加载的值与之匹配时,处理器将检测到这不是一个正常的分支操作,而是异常结束。
因此,处理器将开始异常返回操作。
EXC_RETURN值的[3:
0]位指出所需的返回堆栈以及处理器模式,如第2-26页的表2-12所示。
表2-12异常返回行为
EXC_RETURN描述
0xFFFFFFF1返回Handler模式。
异常返回从主栈获取状态。
返回之后使用MSP。
0xFFFFFFF9返回Thread模式。
返回之后使用MSP。
0xFFFFFFFD返回Thread模式。
异常返回从进程栈获取状态。
返回之后使用PSP。
其他值保留.
2.4故障处理
故障是异常的一个子集,见第2-19页的异常处理模型。
在NMI或HardFault异常处理时发生的故障将会引起HardFault异常或导致锁定(Lockup)。
故障包含:
•执行一条SVC指令,该指令的优先级高于或等于SVCall。
•缺少调试器连接时,执行BKPT指令。
•在加载或存储数据时,系统产生总线错误。
•执行XN存储区的指令。
•执行来自系统已产生总线故障的地址位置的指令。
•取向量时系统产生总线错误。
•执行一条未定义的指令。
•T位已清为0,处理器不在Thumb状态时执行指令。
•试图读取或保存数据到未对齐的地址。
只有Reset和NMI能抢占具有固定优先级的HardFault异常。
而HardFault异常则能抢占除Reset、NMI或另一个HardFault异常之外的所有异常。
2.4.1锁定(Lockup)
以下这些情况处理器会进入锁定状态:
执行NMI或HardFault异常处理时发生故障;
或在使用MSP异常返回时,还没有从堆栈恢复PSR寄存器的值系统就产生总线错误。
当处理器处于锁定状态时,不能执行任何指令。
处理器将保持锁定状态直到以下情况之一发生:
•处理器被复位;
•调试器中止处理器运行;
•发生NMI异常,并且当前锁定是处于HardFault异常处理中。
如果锁定状态出现在NMI异常处理中,后续的NMI异常不能导致处理器离开锁定状态。
2.5功耗管理
Cortex-M0处理器的睡眠模式可减少功耗,睡眠模式是在处理器实现时定义的,可以是以下的一种或两种:
•停止处理器时钟的睡眠模式。
•深度睡眠模式,停止系统时钟,并关掉PLL和flash存储器。
如果处理器实现了两种睡眠模式,则能提供不同级别的节能,SCR寄存器的SLEEPDEEP位用于选择睡眠模式,见第4-16页的系统控制寄存器。
关于深度睡眠模式的更多信息见处理器提供商所提供的资料。
本节将描述进入睡眠模式的机制,以及从睡眠模式唤醒的条件。
2.5.1进入睡眠模式
本节描述使处理器进入睡眠模式的软件机制。
系统可能产生伪唤醒事件,例如,一个调试操作可唤醒处理器。
因此软件在此事件后,必须能重新让处理器进入睡眠模式。
为了把处理器置回睡眠模式,程序可能需要一个空闲循环。
等待中断指令
等待中断指令WFI,能使处理器立即进入睡眠模式,当处理器执行一条WFI指令时,它停止执行指令,并进入睡眠模式,见第3-60页的WFI以获取更多的信息。
等待事件指令
等待事件指令,WFE,根据条件让处理器进入睡眠模式,条件是根据1位事件寄存器的值。
当处理器执行一条WFE指令时,它检查事件寄存器的值:
0处理器停止执行指令,进入睡眠模式。
1处理器将寄存器该位的值置为0,并继续执行指令,不进入睡眠模式。
更多信息见第3-59页的WFE指令。
如果事件寄存器的值为1,表明处理器在执行WFE指令时不能进入睡眠模式。
典型的情况:
这是由于一个外部事件信号的要求,或在多处理器系统中的另一个处理器执行了一条SEV指令,见第3-57页的SEV指令。
软件不能直接访问这个寄存器。
异常退出时睡眠(sleep-on-exit)
如果SCR寄存器的SLEEPONEXIT位置为1,则当处理器完成执行一个异常处理并返回Thread模式时,处理器立即进入睡眠状态,这一机制用于仅仅需要处理器在中断发生时才运行的应用中。
2.5.2从睡眠模式唤醒
唤醒处理器的条件依赖于导致处理器进入睡眠模式的机制。
从WFI或sleep-on-exit产生的睡眠中唤醒
正常情况下,处理器只在检测到具有足够优先级的异常,并进入异常时才会唤醒。
处理器唤醒后,在执行中断处理之前,某些嵌入式系统可能必须执行系统恢复任务。
这通过置PRIMASK位为1来实现。
如果有一个中断到达,该中断被允许,并比当前异常的优先级高,则处理器唤醒,但直到PRIMASK位置为0,处理器才执行中断处理。
更多关于PRIMASK的信息,见第2-8页的异常屏蔽寄存器。
从WFE产生的睡眠中唤醒
如果出现以下情况,处理器将被唤醒:
•处理器检测到一个足够高优先级的异常而进入异常。
•处理器检测到一个外部事件信号,外部事件信号详见第2-30页。
•在多处理器系统中的另一个处理器执行了一条SEV指令。
另外,如果SCR寄存器的SEVONPEND位置为1,任何一个新的挂起的中断都能触发一个事件并唤醒处理器,哪怕该中断是禁止的或没有足够的优先级而不能进入异常。
关于SCR的更多信息见第4-16页的系统控制寄存器。
2.5.3可选的唤醒中断控制器
处理器可能包含了一个唤醒中断控制器(WIC),WIC是一个可选的外设,能检测中断并将处理器从深度睡眠模式唤醒。
仅当SCR寄存器的DEEPSLEEP位置1时,WIC才被允许,见第4-16页的系统控制寄存器。
WIC是不可编程的,也没有任何寄存器或用户接口,完全通过硬件信号工作。
当WIC被允许,处理器进入深度睡眠模式时,系统功耗管理单元能关闭Cortex-M0处理器大部分组成部分的功耗。
但同时也有一个副作用,就是停止了系统滴答定时器。
当WIC接收到一个中断时,它需要花费几个时钟周期唤醒处理器,并恢复处理器的状态,而后处理器才能处理中断。
这意味着在深度睡眠模式下,中断延时增加了。
2.5.4外部事件信号
处理器可能包含一个外部事件信号,处理器外设使用此信号与处理器联络,用于将处理器从WFE状态唤醒;
或将内部的WFE事件寄存器置为1,以表示处理器在执行下一个WFE指令后不能进入深度睡眠模式。
更多信息见第2-28页的WFE,处理器商提供的文档可能给出更多关于此信号的信息。
2.5.5功耗管理编程
ISO/IECC语言不能直接产生WFI、WFE和SEV指令,CMSIS为这些指令提供以下内部函数:
voidWFE(void)//WaitforEvent
voidWFI(void)//WaitforInterrupt
voidSEV(void)//SendEvent
4.4可选的系统计时器,SysTick
如果执行并且使能的话,计数器从重载值计数到0,在下一个时钟周期重载或更换SYST_RVR寄存器里的值,然后在接下来的时钟周期里依次递减。
在下一次更换时,往SYST_RVR寄存器里写0值以禁用计数器。
当计数器转变为0时,COUNTFLAG状态位置为1。
读SYST_CSR寄存器将对COUNTFLAG状态位清0.
往SYST_CVR寄存器中写值以清楚寄存器,并将COUNTFLAG状态位清0。
写操作不会触发SysTick的异常逻辑。
在访问的时候读寄存器并返回其值。
当处理器停止下来去进行调试时,计数器将不再递减。
系统计数器寄存器如下:
地址名称类型复位值
表4-19系统计时器寄存器汇总
描述
0xE000E010SYST_CSRRW-aSysTick控制与状态寄存器在4-22页
0xE000E014SYST_RVRRWUnknownSysTick重载值寄存器在4-23页
0xE000E018SYST_CVRRWUnknownSysTick当前值寄存器在4-23页
0xE000E01CSYST_CALIBRO-aSysTick校准值寄存器在4-24页
a.参见寄存器描述以获取跟多信息。
4.4.1SysTick控制与状态寄存器
SYST_CSR使能SysTick功能。
参见4-21页的表4-19的寄存器汇总以了解它的属性。
若您的设备提供SysTick部件,SYST_CSR寄存器复位值为0x00000000,否则,复位值为0x00000002。
位分配如下:
31
1716
15
3210
COUNTFLAGCLKSOURCETICKINTENABLE
表4-20SYST_CSR位分配
位域
名称
功能描述
[31:
17]
--
[16]
COUNTFLAG
从上次读该寄存器之后,如果定时器计数为0,则返回1.
[15:
3]
-
保留.
[2]
CLKSOURCE
选择SysTick的时钟源:
0=参考时钟
1=处理器时钟
如果您的设备处理器无参考时钟,则该位读为1,
写无效。
[1]
TICKINT
SysTick异常请求允许:
0=计数为0后,不发出SysTick异常请求
1=计数为0后,发出SysTick异常请求。
[0]
ENABLE
计数器使能:
0=计数器禁用
1=计数器使能。
4.4.2SysTick重载值寄存器
SYST_RVR指定开始值载入到SYST_CVR中。
参见4-21页的表4-19的寄存器汇总以了解它的属性。
24
23
重载
表4-21SYST_RVR位分配
24]
[23:
0]
RELOAD
当计数器使能并且达到0时,值载入到SYST_CVR寄存器中,参见下面的
重载值计算
重载值的范围是0x00000001-0x00FFFFFF。
可以编程赋值为0,但是并没有效果因为SysTick的异常请求以及当从1计数到0时COUNTFLAG被激活。
若要在N处理器时钟周期内产生一个多脉冲计数器,重载值应为N-1。
例如,如果每100个时钟脉冲SysTick中断请求一次,应将重载值设为99。
4.4.3SysTick当前值寄存器
SYST_CVR寄存器包含SysTick计数器的当前值。
当前值
表4-22SYST_CVR位分配
CURRENT
读取SysTick计数器的当前值
向该位域写任何值都将清0该位域,同时SYST_CSR的COUNTFLAG位也被清0。
4.4.4SysTick校准值寄存器
SYST_CALIB寄存器表明SysTick的校准属性。
该寄存器的复位值是定义实现的。
参见您的设备提供商所提供的文档以获取更多关于SYST_CALIB位域值含义的信息。
313029
TENMS
SKEWNOREF
表4-23SYST_CALIB寄存器位分配
[31]
NOREF
指示处理器是否提供基准时钟:
0=有基准时钟
1=无基准时钟
如果您的设备无基准时钟,那么SYST_CSR的CLKSOU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SysTick 计时器
![提示](https://static.bdocx.com/images/bang_tan.gif)