SysTick:系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置
系统时钟 SYSCLK 等于 72M .它只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。

功能框图

image.png

SysTick 寄存器介绍

SysTick—系统定时器有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。
image.png
image.png
image.png

SysTick定时时间计算

1-t:一个计数循环的时间,跟reload和CLK有关
2-CLK: 72M或者9M,由CTRL寄存器配置
3-RELOAD: 24位,用户自己配置
image.png

SysTick寄存器结构体

image.png
image.png
image.png

SysTick中断优先级

**systick的优先级比外设的优先级高还是低?

分析:
1、只要内核的优先级可以配置,那么内核的优先级就不是一定比外设的高,而是要先比较软件优先级,如果软件优先级一样,那么就比较他们的硬件的中断编号,编号就是在中断向量表中的位置,越小,优先级越高。

2、以systick为例,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1<<4-1 = 15,这里面的4是因为STM32 使用4个位来配置中断优先级。

3、那么问题来了,这里systick的中断优先级配置成15,应该是最低的,那跟外设来比,那是systick的优先级比外设是高还是低? 这个得看外设配置中断优先级时的优先级分组。

4、如果分组为 2,那抢占优先级和子优先级各有2个位表示优先级,抢占的取值范围为0~3,子优先级的取值范围为:0~3。那这时systick的优先级15,该怎么对比,只需要把15转换成二进制:1111,这四位同样受优先级分组的控制,即前两位表示抢占优先级,那就是3,后两位表示子优先级,也是3。在分组2里面都是最低的。如果你的外设也配置成组2,主和子优先级配置的不是3,那就肯定比systick的优先级高。

5、内核的优先级并非一定比外设的优先级高,只要你的优先级可以配置。

补充:
systick中断优先级配置的是scb->shprx寄存器;而外设的中断优先级配置的是nvic->iprx,有优先级分组,有抢占优先级和子优先级的说法

1-STM32里面无论是内核还是外设都是使用4个二迚制位来表示中断优先级。
2-中断优先级的分组对内核和外设同样适用。当比较的时候,只需要把内核外设的中断优先级的四个位按照外设的中断优先级来分组来解析即可,即人为的分出抢占优先级和子优先级。

systick优先级的理解
**
sysTick系统嘀嗒定时器并非STM32独有的,它是Cortex内核的部分,CM3为它专门开出一个异常类型,并且在中断向量表中占有一席之地(异常号15)。这样它可以很方便的移植到不同厂商出CM3内核的芯片上,尤其对于有实时操作系统的软件,它一般会作为整个系统的时基,所以这个对操作系统非常重要。

  1. systick属于内核异常中断应该用SHPR设置其优先级;外设中断属于ISR应该按NVIC_IPRx来设置优先级。

2.STM32用4个位(共16级优先级)来管理所有的中断优先级(内核中断systick也用此安排),中断向量表中用inline的方式规定死了SYSTICK的优先级为最低:15。但可以通过NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - x); //默认X=1

3.那么如何理解systick在采用比如优先级2组时(抢占2位共4级(0~3);子2位共4级(0~3))呢?答:15即抢占=3;子优先级=3;也就是说始终都是15看你分组怎么分,它总是排在最后。

总结:这也就说明了在移植UCOS时如何看待外设中断与软件定时器及任务的优先级的问题:如果不修改默认systick的硬件优先级,则优先级顺序为:外设中断、软件定时器(各软件定时器暂时没有分优先级按照FIFO顺序)、任务级优先级。

特殊说明:
1 .如果外设中断的优先级也分成了15(无论你怎么分组:GROUP2(3:3)/GROUP3(7:1))则此时SYSTICK优先级高于同优先级的外设(毕竟内核异常优先级高于外设中断)
2.如果想要精确定时也可使用以下函数将systick整成最高优先级)NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 15);

编译错误#20: identifier “IRQn_Type” is undefine

stm32f10x.h包含core_CM3.h,
在bsp_systick.h头文件编写中,只写#include stm32f10x.h即可
或者#include”stm32f10x.h”
#include”core_cm3.h”
必须先写#include”stm32f10x.h”,否则编译会显示 error: #20: identifier “IRQn_Type” is undefined
语雀内容