Cotex-M3内核定时器Systick,电源管理,复位以及多处理器机制

本文详细介绍了Cortex-M3处理器的SysTick定时器功能、如何配置电源管理以支持睡眠模式,以及处理器支持的多处理机通信和自复位控制机制。特别提到STM32的处理区别和两种复位触发方式。
摘要由CSDN通过智能技术生成

layout: post
title: “其它特性”
date: 2024-1-18 15:39:08 +0800
tags: Cotex-M3


其它特性

Systick定时器

SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息

image-20240118180555518

CM3允许为SysTick提供两个时钟源以供选择

第一个是内核的“自由运行时钟”FCLK。“自由”表现在它不来自系统时钟HCLK,因此在系统时钟停止时FCLK也继续运行。第二个是一个外部的参考时钟。但是使用外部时钟时,因为它在内部是通过FCLK来采样的,因此其周期必须至少是FCLK的两倍(采样定理)。

通过检查校准寄存器的位31,可以判定是否有可用的外部时钟源

image-20240118181005216

当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的值

image-20240118181736332

电源管理

在睡眠时,可以停止系统时钟,但可以让FCLK继续走,以允许处理器能被SysTick异常唤醒。

  • 睡眠:由CM3处理器的SLEEPING信号指示
  • 深度睡眠:由CM3处理器的SLEEPDEEP信号指示

0xE000_ED10

image-20240118183937672

通过执行WFI/WFE指令,请求CM3进入睡眠模式,它们在CM3中的地位就类似于某些处理器的” sleep/slp”指令。WFI表示Wait -For -Interrupt,而WFE表示Wait -For -Event。那么什么可以算是event呢?新来的中断、早先被悬起的中断,或者是通过RXEV信号表示的一个外部事件信号脉冲,都属于event。在处理内部,对事件有一个锁存器,因此过去发生的事件可以用来唤醒将来才执行到的WFE。

image-20240118184126106

当从WFI唤醒时,要根据异常系统的游戏规则来决定是否唤醒。只有当该中断的优先级比当前优先级要高(如果是在服务例程中使用WFI),并且比BASEPRI掩蔽的高时,才唤醒处理器并执行ISR。但如果PRIMASK置位,则依然唤醒处理器,然而ISR却不执行了。

WFE则有点区别,不管优先级和掩蔽情况如何,只要SETONPEND置位,它就会不错过任何一个事件,在发生事件时一定把处理器唤醒。至于是否执行ISR,则与WFI的规则相同。

image-20240118184522978

image-20240118184757210

PRTMASK是总的中断开关, SEVONPEND设置为1的时候任意事件都会唤醒

  1. 只有PRIMASK=0时,才执行ISR
  2. 对于WFE,只要SEVONPEND=1,则不管何时发生了什么中断,都一定会唤醒处理器
  3. 不管PRIMASK为何值,只要优先级高到BASEPRI不能掩蔽,就将唤醒处理器
  4. 当PRIMASK=0时,它不会对唤醒产生影响

自动睡眠

从中断服务例程返回后立即睡眠。

需要把系统控制寄存器中的SLEEPONEXIT位置位。

image-20240118185158663

多处理机通信

CM3竟然还支持简单的多核功能

处理机有一个名为TXEV(Transmit Event)的输出信号,用于发送信号给其它处理机;还有一个名为RXEV(Receive Event)的输入信号

image-20240118185317944

如上一小节所述,当处理机因为WFE而睡眠时,可以由外部事件——即RXEV唤醒。CM3提供了SEV指令(Send EVent)。当执行该指令时,当事处理机就会在TXEV上发送一个脉冲,从而可以唤醒另外的睡眠中的处理机,从而实现同步

image-20240118185357420

自复位控制

CM3允许由软件触发复位序列,用于特殊的调试或维护目的

第一种方法,是通过置位NVIC中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET位(位偏移:0)

这种复位的作用范围覆盖了整个CM3处理器中,除了调试逻辑之外的所有角落,但是它不会影响到CM3处理器外部的任何电路,所以单片机上的各片上外设和其它电路都不受影响。

STM32不可用, 只用于Debug

复位的第二种方法,是置位同一个寄存器中的SYSRESETREQ位。这种复位则会波及整个芯片上的电路:它会使CM3处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是CM3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值