SysTick——系统定时器(标准库)

STM32F4的SYSTick是一个24位的系统定时器,常用于操作系统的时基,产生中断。配置涉及CTRL、LOAD和VAL寄存器,通过SysTick_Config()库函数设置。中断优先级默认最低,可通过NVIC_SetPriority()调整。文章还介绍了SYSTick中断时间的计算方法和注意事项,如使用volatile修饰中断服务程序中的变量。

1、STM32F4的SYSTick定时器

STM32F4系统定时器SYSTick是属于内核CM4的一个外设,内嵌在NVIC中。所有基于CM4的单片机都具有这个系统定时器,使得软件能够在CM4单片机中可以很容易的移植。

系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK。当重装载数值寄存器的值递减到0时,系统定时器就产生一个中断,以此循环往复。

2、SYSTick的寄存器

SYSTick系统定时器有四个寄存器。在使用SYSTick产生定时时,一般只需要配置前三个寄存器,最后一个校准寄存器不需要使用。

   CTRL              SYSTick控制及状态寄存器

   LOAD             SYSTick重装载数值寄存器

   VAL                 SYSTick当前数值寄存器

   CALIB             SYSTick校准数值寄存器

3、SYSTick配置库函数

(1)库函数解析

SYSTick是属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm4.h中。

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks);

使用固件库编程的时候,我们只需要调用库函数SysTick_Config()即可。

   &

07-10
<think>我们正在讨论SysTick定时器在嵌入式系统中的作用和级别。用户之前的问题是关于HAL_Delay的延时级别,现在转向SysTick本身。根据引用内容,SysTick是ARM Cortex-M内核的一个内置定时器,用于提供系统节拍(systick),通常作为操作系统的时基或实现精确延时。 引用[1]说明SysTick是递减计数器,HAL_Delay基于SysTick实现毫秒级延时。引用[2][3]则展示了如何直接操作SysTick寄存器来实现微秒和毫秒延时。 因此,回答应该围绕: 1. SysTick是什么(硬件级别,内核内置定时器) 2. SysTick的典型用途(系统节拍,延时函数的基础) 3. SysTick的精度级别(取决于系统时钟,可实现微秒到毫秒级延时) 同时,注意用户要求使用中文,并按照格式要求处理数学表达式(虽然本问题可能涉及较少数学,但涉及时间计算时需注意)。 另外,生成相关问题。</think>### SysTick定时器在嵌入式系统中的作用与级别分析 SysTick是**ARM Cortex-M内核级别的硬件定时器**,属于处理器核心的一部分(而非外设定时器)。它在嵌入式系统中提供**高精度、低抖动的系统节拍**,其作用级别和特性如下: #### 一、SysTick的级别特性 | **特性** | **说明** | |-----------------|--------------------------------------------------------------------------| | **硬件级别** | Cortex-M内核内置的24位递减计数器,独立于外设定时器[^1] | | **精度级别** | 取决于系统时钟($$f_{sysclk}$$),最高可达$$ \frac{1}{f_{sysclk}} $$秒级精度 | | **最小延时** | 单次计数周期($$ \frac{1}{f_{sysclk}} $$),例如168MHz系统下约6ns[^3] | | **最大延时** | $$ \frac{2^{24}}{f_{sysclk}} $$秒(24位计数器),168MHz系统下约0.1秒 | | **中断级别** | 具有独立中断向量(Non-Maskable Interrupt),优先级可配置 | #### 二、核心作用 1. **系统时基提供者** - 周期性触发中断(通常1ms),维护全局时间戳`uwTick`,为`HAL_Delay()`等函数提供基础[^1] - 计算公式: $$ \text{重装载值} = \frac{\text{SystemCoreClock}}{\text{目标频率}} $$ 例如1kHz中断:`HAL_SYSTICK_Config(SystemCoreClock/1000)` 2. **精准延时实现** - **微秒级延时**:直接操作计数器(引用[2][3]): ```c SysTick->LOAD = nus * (SystemCoreClock/1000000); // 设置微秒计数值 while(!(SysTick->CTRL & 0x00010000)); // 等待计数完成 ``` - **毫秒级延时**:基于`HAL_GetTick()`的时间戳比较(引用[1]): ```c while((HAL_GetTick() - start_tick) < delay_ms); ``` 3. **实时操作系统(RTOS)核心** - 为任务调度器提供时间片基准 - 确保上下文切换的精确时序 #### 三、精度影响因素 1. **时钟源稳定性** - 依赖主晶振或内部RC振荡器的精度 - 温度漂移可能导致$$ \pm 0.1\% \sim \pm 1\% $$误差 2. **中断响应延迟** - 高优先级中断会推迟SysTick中断服务例程(ISR)执行 - 典型延迟:$$ 12 \sim 50 \text{周期} $$(Cortex-M3/M4) 3. **软件开销补偿** - HAL库通过`wait += uwTickFreq`补偿中断处理时间(引用[1]) - 直接操作计数器需考虑指令执行时间 #### 四、典型应用场景 1. **基础延时** ```c // 微秒级延时(直接操作寄存器) Delay_us(100); // 精确控制外设时序 // 毫秒级延时(基于HAL) HAL_Delay(500); // LED闪烁等非实时任务 ``` 2. **超时检测** ```c uint32_t timeout = HAL_GetTick() + 100; while(!device_ready()) { if(HAL_GetTick() > timeout) return ERROR_TIMEOUT; } ``` 3. **周期性任务触发** ```c void SysTick_Handler(void) { static uint32_t cnt = 0; if(cnt++ >= 1000) { // 每1000ms执行 process_sensor_data(); cnt = 0; } } ``` > **关键区别**: > - SysTick是**硬件级定时器**,提供底层计时能力 > - `HAL_Delay()`是**应用级延时函数**,基于SysTick实现毫秒级阻塞延时 --- ### 相关问题 1. **如何配置SysTick实现1μs精度的延时?需要满足哪些硬件条件?** 2. **在RTOS中使用SysTick时,如何避免与用户延时函数冲突?** 3. **SysTick的24位计数器溢出会导致什么问题?如何安全处理长时间延时?** 4. **SysTick与其他硬件定时器(如TIM1/TIM2)在精度和资源占用上有何区别?** [^1]: SysTick作为递减计数器为HAL_Delay提供时间基准,通过时间戳比较实现延时退出。 [^2]: 直接操作SysTick寄存器实现微秒级延时的代码示例及限制说明。 [^3]: 通过系统时钟配置实现高精度延时的初始化方法和计算逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星顶照

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

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

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

打赏作者

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

抵扣说明:

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

余额充值