介绍一下stm32的系统滴答定时器
时间: 2023-11-18 07:28:15 浏览: 82
STM32的系统滴答定时器(SysTick)是一个基于硬件的计时器,可以用于实现一些系统级的定时操作。它是一个24位计数器,并且可以与系统时钟连接。
SysTick定时器可以在内部时钟周期或外部时钟信号的条件下工作。在内部时钟周期的模式下,SysTick定时器的时钟源是CPU的时钟。在外部时钟信号的模式下,SysTick定时器的时钟源是外部时钟信号。SysTick定时器可以用来实现一些系统级的操作,比如延迟,任务调度等。
SysTick定时器可以通过NVIC_SYSTICK_CTRL寄存器进行配置。该寄存器包含了SysTick定时器的控制位,包括使能位、时钟源选择位、中断使能位等。SysTick定时器的计数值可以通过NVIC_SYSTICK_VAL寄存器进行读取。
在使用SysTick定时器时,需要注意它的计数值会在计数到0时自动重载,并且计数值的范围为0到2^24-1。同时,SysTick定时器的时钟频率可以通过设置SysTick定时器的重装值来进行调整。
相关问题
stm32系统滴答定时器
### STM32 SysTick Timer 工作原理
SysTick 定时器是一个简单的向下计数定时器,集成于 Cortex-M 内核中。当计数值达到零时会触发中断并重新加载设定值继续倒计数。这种机制使得 SysTick 成为了许多应用的理想选择,比如操作系统节拍、程序延时以及时间测量等功能[^1]。
#### 初始化过程
初始化过程中有两个重要函数 `HAL_Init()` 和 `SystemClock_Config()` 起着关键作用:
- **`HAL_Init()`**: 此函数负责初始化 HAL 库全局变量,并设置低级外设(如NVIC, SYSTICK)。它还调用了 `HAL_MspInit()` 来完成更深层次的硬件抽象层初始化操作。
- **`SystemClock_Config()`**: 这个函数配置系统时钟树结构来确保整个芯片运行在一个合适的频率下。对于 SysTick 的情况来说,此函数通过调整 AHB 总线预分频系数使能了稳定的 1 ms 中断间隔[^2]。
```c
// 配置 SystemCoreClock 变量以匹配修改后的实际核心时钟速度
void SystemClock_Config(void){
...
}
```
#### 设置周期为 1ms 的方法
为了让 SysTick 每隔固定的时间产生一次中断,在启动文件里通常会有如下类似的代码片段用于装载重载寄存器 STK_LOAD 的初始值:
```c
/* Configure the system tick to interrupt every millisecond */
if (HAL_SYSTICK_Config(SystemCoreClock / 1000U) != HAL_OK) {
/* Initialization Error */
while (1);
}
/* Configure the priority of the SysTick IRQ */
if (HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0) != HAL_OK) {
/* Setting Priority Failed */
while (1);
}
```
这段代码首先计算出了基于当前 CPU 主频每毫秒应该减去多少次才能得到期望的一秒钟内发生一千次溢出事件;接着设置了该中断优先级别以便更好地与其他外部或内部请求协调工作。
#### 实现简易延时功能
除了作为 RTOS 的心跳之外,SysTick 也能轻松实现基本的非阻塞性延迟效果而无需额外占用资源。下面给出了一种简单的方式利用其特性来进行短暂停顿而不影响其他任务执行:
```c
volatile uint32_t TimingDelay;
void Delay(uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
if (TimingDelay != 0x00UL)
TimingDelay--;
}
```
在此基础上还可以进一步扩展成更加复杂的功能模块满足不同应用场景下的需求。
stm32使用滴答定时器
滴答定时器是STM32中的一个基本定时器,它可以用来产生固定时间间隔的中断。下面是使用滴答定时器的步骤:
1. 配置滴答定时器的时钟源和分频系数,使其产生1ms的中断。例如,如果使用的是72MHz的系统时钟,那么可以将滴答定时器的时钟源设置为系统时钟,分频系数设置为7200-1,这样就可以产生1ms的中断。
```c
void SysTick_Init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 选择时钟源为HCLK/8
SysTick_Config(9000); // 设置重载值为9000,产生1ms的中断
}
```
2. 在滴答定时器的中断处理函数中执行需要定时执行的任务。例如,下面的代码在每1ms时执行一次LED闪烁任务。
```c
void SysTick_Handler(void)
{
static uint32_t cnt = 0;
cnt++;
if(cnt == 500) // 每500ms翻转一次LED
{
GPIO_ToggleBits(GPIOA, GPIO_Pin_5);
cnt = 0;
}
}
```
3. 启动滴答定时器。例如,可以在main函数中调用SysTick_Init函数启动滴答定时器。
```c
int main(void)
{
SysTick_Init(); // 启动滴答定时器
while(1)
{
}
}
```
阅读全文