一、简介
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只用高四位)。
中断优先级的分组对内核和外设同样适用,当比较的时候,只需把内核外设的中断优先级的四个位按照外设的中断优先级来解析即可,即认为的分出抢占优先级和子优先级。
上一篇:STM32F10xx外设GPIO模式配置
下一篇:正点原子STM32学习笔记——MPU6050介绍
推荐阅读最新更新时间:2024-11-12 10:21
设计资源 培训 开发板 精华推荐
- 用于 M24LR64-R 双接口 EEPROM 的 ANT4-M24LR-A、2 x 64 Kbit 多组天线参考设计板
- 使用 ON Semiconductor 的 LA42051 的参考设计
- 具有反向输入保护的 LTC3897EFE 高效两相 48V 升压转换器的典型应用电路
- ATQT2-XPRO、QT2 Xplained Pro 扩展套件
- 带板载 L4940 和 L4941 低压降稳压器的分布式电源典型应用电路
- LT1371、5V、9W 转换器在宽输入范围内以良好的效率工作
- LT3971-3.3、5V 降压转换器的典型应用电路
- 1420MHz低噪声放大器&声表面波滤波器
- NOIP1SN0480A-STI-A-GEVK:PYTHON 480 评估套件(单色)
- HomeKit智能鱼缸控制器