STM32 中 SysTick 定时器简介(CMSIS版本 5.3.0)

本文详细介绍了STM32中的SysTick定时器,包括其寄存器、工作原理和在STM32系统中的使用。SysTick是一个集成在Cortex-M内核中的24位向下计数器,常用于OS的任务管理和上下文切换,也可作为通用定时器。文中还展示了如何在STM32 HAL库中配置和使用SysTick,包括设置时钟、配置寄存器和中断处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

SysTick 定时器

简介       

SysTick 的寄存器

SysTick 控制和状态寄存器 CTRL

SysTick 重装载值寄存器LOAD

SysTick 当前值寄存器VAL

SysTick 校准值寄存器CALIB

SysTick 定时器框图 

SysTick 运行原理简述

STM32 SysTick 的使用

工具

时钟的选择

STM32_HAL库中SysTick的使用


SysTick 定时器

简介       

SysTick 定时器在 Cortex-M 内核中集成,属于 NVIC 的一部分,能够产生 SysTick 异常(#15)。SysTick 是一个向下计数的 24 位计数器,时钟来源为处理器时钟或外部时钟。

在现代操作系统中,需要一个周期性的中断来触发 OS 内核,用于任务的管理和上下文的切换,处理器也可以在不同的时间片内处理不同的任务。处理器设计还需要确保运行在非特权等级的任务无法禁止该定时器,不然会因禁止 SysTick 导致整个系统被锁定。在内核集成 SysTick 定时器提高了软件的可移植性,所以的Cortex-M内核都集成了 SysTick ,内核为Cortex-M3/M4的微控制器都可以使用该为内核实现的OS 。

Unprivileged:非特权级,起到保护用户任务的作用,防止用户可以在任意任务中访问和修改系统寄存器,操作不当会造成系统崩溃。

Privileged:特权级,这种模式下用户可以在任意任务中对系统控制寄存器的访问和修改。

特权级这些详细可以查看该文章https://blog.csdn.net/weixin_33775582/article/details/85927787

在不使用OS的情况下,SysTick 定时器还一颗用作定时器外设,产生周期性中断,精准延时或时间测量。

SysTick 的寄存器

SysTick 计数器有四个相关的寄存器,分别是

SysTick 控制和状态寄存器 CTRL

SysTick 重装载值寄存器LOAD

SysTick 当前值寄存器VAL

SysTick 校准值寄存器CALIB

SysTick 控制和状态寄存器 CTRL

SysTick 重装载值寄存器LOAD

SysTick 当前值寄存器VAL

SysTick 校准值寄存器CALIB

SysTick 定时器框图 

 

SysTick 运行原理简述

通过配置控制和状态寄存器(CTRL)Bit[0]使能计数器、Bit[1]配置异常中断、Bit[2]时钟选择、Bit[16]计数器计数到0的标志位

重装载值寄存器LOAD,当计数器减计数到零是,重装载值寄存器LOAD将值从新加载到计数器中继续计数

当前值寄存器VAL,该寄存器就是计数器当前的计数值(减去若干个数后的计数器)

校准值寄存器CALIB,查看寄存器简介就可以理解,此处不做解释

 

STM32 SysTick 的使用

工具

IDE:Keil_MDK 5.29

配置工具:STM32CubeMX 6.2.0

软件代码:CMSIS_Core 5.3

时钟的选择

STM32_HAL库中SysTick的使用

CubeMX配置好工程,在main.c文件的时钟初始化函数中的 HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_2) 中的结尾处初始化了 SysTick 时钟(HAL_InitTick(uwTickPrio))。

void SystemClock(void)
{

}

在 SysTick 时钟初始化函数(HAL_InitTick(uwTickPrio))中,进行了Systick 相关寄存器及异常中断优先级的配置。在HAL_SYSTICK_Config配置函数中的入口参数是重装载寄存器的值,据此可算出 SysTick 的异常中断时间为1ms(以下图代码为例)

__weak HAL_StatusTypedef HAL_InitTick(uint32_t TickPriority)
{
    if(HAL_SYSTICK_Config(SystemCoreclock/(1000U/uwTickFreq))>0)
    {
        return HAL_ERROR;
    }
    if(TickPriority <(1UL << __NVIC_PRIO_BITS))
    {
        HAL_NVIC_SetPriority(SysTick_IRQn,TickPriority,0);
        uwTickPrio = TickPriority;
    }
    else
    {
        return HAL_ERROR
    }
    return HALL_OK
}

配置完成后我们可以在 stm32f3xx_it.c 文件夹中的相应中断中添加需要的代码,如下所示

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Stark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值