layout: post
title: “其它特性”
date: 2024-1-18 15:39:08 +0800
tags: Cotex-M3
其它特性
Systick定时器
SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息
CM3允许为SysTick提供两个时钟源以供选择
第一个是内核的“自由运行时钟”FCLK。“自由”表现在它不来自系统时钟HCLK,因此在系统时钟停止时FCLK也继续运行。第二个是一个外部的参考时钟。但是使用外部时钟时,因为它在内部是通过FCLK来采样的,因此其周期必须至少是FCLK的两倍(采样定理)。
通过检查校准寄存器的位31,可以判定是否有可用的外部时钟源
当SysTick定时器从1计到0时,它将把COUNTFLAG位置位;清零方式
- 读取SysTick控制及状态寄存器(STCSR)
- 往SysTick当前值寄存器(STCVR)中写任何数据
如欲使能SysTick异常,则把STCSR.TICKINT置位。另外,如果把向量表重定位到了SRAM中,还需要为SysTick异常建立向量
; 建立SysTick异常服务例程
MOV R0, #0xF ; 异常号:15
LDR R1, =systick_handler ; 加载服务例程的入口地址
LDR R2, =0xE000ED08 ; 加载向量表偏移量寄存器的地址
LDR R2, [R2] ; 读取向量表的首地址
STR R1, [R2, R0, LSL #2] ; 写入向量
下面的代码演示启用SysTick的基本程序
; 使能SysTick定时器,并且使能SysTick异常
LDR R0, =0xE000E010 ; 加载STCSR的地址
MOV R1, #0
STR R1, [R0] ; 先停止SysTick,以防意外产生异常请求
LDR R1, =0x3FF ; 让SysTick每1024周期计完一次。因为是从1023数到
; 0,总共数了1024个周期,所以加载值为0x3FF
STR R1, [R0,#4] ; 写入重装载的值
STR R1, [R0,#8] ; 往STCVR中写任意的数,以确保清除COUNTFLAG标志
MOV R1, #0x7 ; 选择FCLK作为时钟源,并使能SysTick及其异常请求
STR R1, [R0] ; 写入数值,开启定时器
SysTick定时器还提供了走完10ms所需要的格数(TENMS位段),作为时间校准的参考信息。在CM3处理器的顶层有一个24位的输入,芯片厂商可以写入一个10ms的加载值,写程序时就可以读取STCR寄存器中的TENMS位段来获取此信息
STM32实现的是1ms的值
电源管理
在睡眠时,可以停止系统时钟,但可以让FCLK继续走,以允许处理器能被SysTick异常唤醒。
- 睡眠:由CM3处理器的SLEEPING信号指示
- 深度睡眠:由CM3处理器的SLEEPDEEP信号指示
0xE000_ED10
通过执行WFI/WFE指令,请求CM3进入睡眠模式,它们在CM3中的地位就类似于某些处理器的” sleep/slp”指令。WFI表示Wait -For -Interrupt,而WFE表示Wait -For -Event。那么什么可以算是event呢?新来的中断、早先被悬起的中断,或者是通过RXEV信号表示的一个外部事件信号脉冲,都属于event。在处理内部,对事件有一个锁存器,因此过去发生的事件可以用来唤醒将来才执行到的WFE。
当从WFI唤醒时,要根据异常系统的游戏规则来决定是否唤醒。只有当该中断的优先级比当前优先级要高(如果是在服务例程中使用WFI),并且比BASEPRI掩蔽的高时,才唤醒处理器并执行ISR。但如果PRIMASK置位,则依然唤醒处理器,然而ISR却不执行了。
WFE则有点区别,不管优先级和掩蔽情况如何,只要SETONPEND置位,它就会不错过任何一个事件,在发生事件时一定把处理器唤醒。至于是否执行ISR,则与WFI的规则相同。
PRTMASK是总的中断开关, SEVONPEND设置为1的时候任意事件都会唤醒
- 只有PRIMASK=0时,才执行ISR
- 对于WFE,只要SEVONPEND=1,则不管何时发生了什么中断,都一定会唤醒处理器
- 不管PRIMASK为何值,只要优先级高到BASEPRI不能掩蔽,就将唤醒处理器
- 当PRIMASK=0时,它不会对唤醒产生影响
自动睡眠
从中断服务例程返回后立即睡眠。
需要把系统控制寄存器中的SLEEPONEXIT位置位。
多处理机通信
CM3竟然还支持简单的多核功能
处理机有一个名为TXEV(Transmit Event)的输出信号,用于发送信号给其它处理机;还有一个名为RXEV(Receive Event)的输入信号
如上一小节所述,当处理机因为WFE而睡眠时,可以由外部事件——即RXEV唤醒。CM3提供了SEV指令(Send EVent)。当执行该指令时,当事处理机就会在TXEV上发送一个脉冲,从而可以唤醒另外的睡眠中的处理机,从而实现同步
自复位控制
CM3允许由软件触发复位序列,用于特殊的调试或维护目的
第一种方法,是通过置位NVIC中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET位(位偏移:0)
这种复位的作用范围覆盖了整个CM3处理器中,除了调试逻辑之外的所有角落,但是它不会影响到CM3处理器外部的任何电路,所以单片机上的各片上外设和其它电路都不受影响。
STM32不可用, 只用于Debug
复位的第二种方法,是置位同一个寄存器中的SYSRESETREQ位。这种复位则会波及整个芯片上的电路:它会使CM3处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是CM3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。