历史上的今天
今天是:2024年12月06日(星期五)
2021年12月06日 | STM32系统定时器(SysTick)笔记
2021-12-06 来源:eefocus
一、简介
SysTick:系统定时器,由四个寄存器控制,存在于内核,嵌套在NVIC中,所有的Cortex-M3内核的单片机都具有这个定时器。
二、相应寄存器(这里介绍常用的几个寄存器)
①SysTick控制及状态寄存器(地址:0xE000_E010)

只有上面红色线框柱的位有效,其他位都是保留。

②SysTick重装载数值寄存器(地址:0xE000_E014)


③SysTick当前数值寄存器(地址:0xE000_E018)


三、结合框图

图中STK_CLK对应的上面的CLKSOURCE,结合RCC时钟树:

当CLKSOURCE位为0时,时钟是AHB/8=(72/8)M=9M,当CLKSOURCE位为1时,时钟是AHB=72M。
图中STK_LOAD对应上面的RELOAD,STK_VAL对应上面的CURRENT。
递减计数器(值为STK_VAL)在时钟的驱动下,从RELOAD初值开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从RELOAD值开始重新递减计数,如此循环。
四、SysTick定时时间计算
①t:一个计数循环的时间,跟RELOAD和CLK有关。
②CLK:72M或者9M,由CTRL寄存器配置。
③RELOAD:24位,用户自己配置。
t=RELOAD*(1/CLK)。
例:更改RELOAD的值。
当CLK=72M时,t=(72) * (1/72M)=1us。
当CLK=72M时,t=(72000) * (1/72M)=1ms。
1s = 1000 ms = 1000 000 us = 1000 000 000 ns。
如果要实现一个1ms的延时,那么将始终配置成72M,然后计数72000次。这就实现了一个1ms的延时。一般我们的程序都是毫秒级别的。
五、库函数中相关寄存器描述
1.SysTick结构体
//在core_cm3.h中
__IO uint32_t CTRL; //控制及状态寄存器
__IO uint32_t LOAD; //重装载数值寄存器
__IO uint32_t VAL; //当前数值寄存器
__IO uint32_t CALIB; //校准寄存器
2.SysTick配置库函数
//在core_cm3.h中定义
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//RELOAD寄存器为24bit,最大值为2^24
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//配置RELOAD寄存器的初始值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//配置中断优先级为1<<4-1 = 15,优先级为最低
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//配置递减计数器的值
SysTick->VAL = 0;
//配置systick的时钟为72M
//使能中断
//使能systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
其中SysTick_LOAD_RELOAD_Msk的定义如下,也就是2^24。
#define SysTick_LOAD_RELOAD_Pos 0
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)
__NVIC_PRIO_BITS的定义如下。
#define __NVIC_PRIO_BITS 4
__NVIC_PRIO_BITS通过改变这个宏定义和1<<__NVIC_PRIO_BITS中"<<"左边的数(0或1),可以实现对systick中断(内核中断)的分组。
NVIC_SetPriority固件库函数如下。
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
//设置优先级for Cortex-M3 系统中断
if(IRQn < 0) {
SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
//设置优先级for外设中断
else {
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
}
在STM32的中断中,有内核中断和外设中断,内核中断并不一定比外设中断的优先级高,这得看具体的设计。
STM32里无论是内核还是外设都是使用4个二进制位来表示中断优先级。内核中断设置的是System handler priority registers (SHPRx)寄存器:

SysTick中断是设置System handler priority register 3 ( SCB_ SHPR3)寄存器:

SysTick用的是上面红色线框住的的四个位(给SysTick中断分了8位,但是STM32只用高四位)。
中断优先级的分组对内核和外设同样适用,当比较的时候,只需把内核外设的中断优先级的四个位按照外设的中断优先级来解析即可,即认为的分出抢占优先级和子优先级。
史海拾趣
|
流水线结构 pipeline MIPS 是最简单的体系结构之一,所以使大学喜欢选择 MIPS 体系结构来介绍计算体系结构课程。 ARM has barrel shifter shifter是两面性的,一 ...… 查看全部问答> |
|
本开发板命名为Landbcm 2008 下面开始介绍介绍Landbcm 2008 1.Landbcm 2008系统框图 1.Landbcm 2008学习板提供了 硬件: 1个WAN口, 1个100M以太网口, 4M Flash,16M SDRAM , 主控芯片为BCM47XX , 交换芯片为BCM5XXX 软件: 全套开发 ...… 查看全部问答> |
|
小弟准备测试下网络,下了Iperf源代码。用在ARMV4I wince 6.0上。 但是不知道怎么在VS2005下面编译 目前SDK已经导出 哪位老大有成功的经验,分享下,多谢了!… 查看全部问答> |
|
WINCE6系统 烧入扳子启动后是不是根据组件的多少启动的服务多少来占有内存呢? 我现在用的板子的总的内存是128M,但是我进去后看系统属性->内存 看到能使用的存储内存和程序内存总的是40M左右, 而其中存储内存和程序内存正在使用总的是17M左右 那我的还有88M左右的内存到哪里去了啊?… 查看全部问答> |




