systick是什么,工作原理是什么?怎么用systick配置延时函数?
时间: 2024-09-30 20:05:19 浏览: 58
Systick是STM32微控制器中的一种定时器,全称为System Tick Timer。它是一个基于硬件的周期中断发生器,主要用于提供一个精确的、可调整的定时机制,通常用于实现系统时间管理、定时任务调度等。
Systick的工作原理是基于预设的时间常数,通过计数器递增的方式来触发中断。当计数值达到预设值时,会自动更新并引发一个软件中断(通常称为SysTick中断)。用户可以通过设置Systick寄存器的值和周期,来设定自定义的延时时间。
在STM32中配置Systick实现延时函数的基本步骤如下:
1. **开启Systick**:首先需要在系统的初始化阶段打开Systick功能,并配置好基本的定时器参数,如时钟源选择、分频系数等。
```c
// 开启SysTick
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SYSCFG | RCC_APB1Periph_TICKER, ENABLE);
```
2. **配置Systick Prescaler**:设置Systick计数器的分频因子,影响它的频率响应速度。
```c
SysTick_Config(SystemCoreClock / SYSTICK_PRESCALER);
```
3. **启用SysTick Interrupt**:开启中断并在系统服务表中注册处理函数。
```c
NVIC_InitStructure.NVIC_IRQChannel = SYSTICK_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
```
4. **编写延时函数**:在SysTick中断服务程序中,检查计数是否到达预期值,如果到了则跳转到下一个延时点,如果没有则继续等待下一次中断。
```c
void SysTick_Handler(void) {
if (sysTickCounter >= desiredDelay) {
sysTickCounter = 0; // 清零计数器
doYourTaskAfterDelay();
} else {
sysTickCounter++; // 继续计数
}
}
```
5. **开始定时**:在需要延迟的地方启动计数,例如在main()函数里:
```c
uint32_t sysTickCounter = 0;
sysTickCounter = SystemCoreClock / SYSTICK_DELAY_FREQUENCY;
while(sysTickCounter > 0) {
// 这里可以做其他事情
__WFI(); // 如果不需要CPU运行,则进入低功耗模式
}
```
阅读全文