Cortex-M3-STM32F1 开发:(十二)HAL 库开发 ➤ SysTick 系统滴答定时器
| 上一篇 | 下一篇 |
|---|---|
| MPU 和 FPU |
SysTick 系统滴答定时器
这是个定时器,和 SYSCLK 不是一个东西,SYSCLK 是系统时钟。F1 系列 MCU 中 SysTick 的时钟源依赖 SYSCLK ,通过分频(1或8)获得计数时钟。SysTick 包含在 M3/4/7 芯片内核里面,核心是一个 24 位的 递减 计数器(224−1∼02^{24}-1\sim0224−1∼0)。
CubeMX(F103)的系统滴答定时器时钟配置如下:

相关寄存器有:控制及状态寄存器CTRL、重装载寄存器LOAD、当前数值寄存器VAL。
分频系数(1或 8)对其影响:
如果时钟源是 SYSCLK 的 1 分频,则时钟频率是 72MHz( 1s 振荡 72000000 次,1us 振荡 72 次),那么计时 1us 的话,SysTick 系统滴答定时器就需要递减 72(最多一次性计时 233,016us 左右)。
如果时钟源是 SYSCLK 的 8 分频,则时钟频率是 9MHz( 1s 振荡 9000000 次,1us 振荡 9 次),那么计时 1us 的话,SysTick 系统滴答定时器就需要递减 9(最多一次性计时 1,864,135us 左右)。
delay 函数就是基于这个定时器编写的。
系统 delay 函数(非OS)
1. delay_init() 函数
1 分频:
static u32 fac_us=0; // us延时倍乘数void delay_init(u8 SYSCLK)
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); // SysTick频率为HCLKfac_us = SYSCLK; // 不论是否使用OS, fac_us都需要使用
}
// 调用:delay_init(72), 调用之后 fac_us=72, 1us减72
8 分频:
static u32 fac_us=0; // us延时倍乘数void delay_init(u8 SYSCLK)
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); // SysTick频率为 HCLK/8fac_us = SYSCLK/8; // 不论是否使用OS, fac_us都需要使用
}
// 调用:delay_init(72), 调用之后 fac_us=9, 1us减9
2. delay_us() 函数
定义:
//延时nus
//nus 为要延时的us数
void delay_us(u32 nus)
{...ticks = nus*fac_us; //需要的节拍数 ...
}
这个函数的函数体就不过多写出来了,内容就是根据输入参数 nus 来配置重装载的值, nus 微秒需要递减 nus*fac_us 递减到 0 之后就会关闭滴答定时器。
3. delay_ms() 函数
定义:
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{u32 i;for(i=0;i<nms;i++) delay_us(1000);
}
函数内部调用了 delay_us() 函数。
