systick 为什么选择SysTick_CLKSource_HCLK和SysTick_CLKSource_HCLK_Div8, 延时都是1秒
时间: 2023-07-31 12:10:12 浏览: 193
SysTick是STM32的一个定时器模块,可以用于延时。在STM32中,SysTick使用的时钟源可以是HCLK或HCLK/8。选择不同的时钟源,会影响SysTick的计数速度和延时时间。
当选择SysTick的时钟源为HCLK时,SysTick计数器的时钟频率等于HCLK的频率,即SysTick计数器每秒钟递增的次数等于HCLK的频率。因此,如果要延时1秒,就需要将SysTick的计数值设置为HCLK的频率减1。
当选择SysTick的时钟源为HCLK/8时,SysTick计数器的时钟频率等于HCLK/8的频率,即SysTick计数器每秒钟递增的次数等于HCLK/8的频率。因此,如果要延时1秒,就需要将SysTick的计数值设置为HCLK/8的频率减1。
从上面可以看出,选择不同的时钟源,需要设置不同的计数值才能延时相同的时间。如果选择HCLK/8作为时钟源,可以把SysTick计数器的计数范围缩小8倍,从而减少了计数器的位数,这样可以减少对内存的占用,因此在一些情况下选择HCLK/8作为SysTick的时钟源可以更加灵活和高效。
相关问题
void delay_init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择48M时钟 HCLK/8 // SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择8M时钟 HCLK fac_us=SYSCLK/8; //为系统时钟的1/8 fac_ms=(int16_t)fac_us*1000;//每个ms需要的systick时钟数 }
这段代码是用来初始化延时函数的。其中,`SYSCLK` 是系统时钟频率,通过该参数计算出每个微秒需要的 SysTick 时钟数 `fac_us`,以及每个毫秒需要的 SysTick 时钟数 `fac_ms`。在该函数中,通过设置 SysTick 时钟源为 HCLK/8,选择了 48MHz 的时钟源。这个函数的作用是为后面的延时函数提供时钟源。
``` SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);``` 如何在程序中利用 SysTick 实现延时?
`SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8)` 这行代码是在配置 System Tick (SysTick) 的时钟源。System Tick 是一种嵌入式系统中常用的计时器,用于提供非常短时间尺度的定时任务,通常在 Cortex-M系列微控制器中使用。
在 ARM Cortex-M 微控制器中,`HCLK_Div8` 表示将系统时钟(Hartree Clock,也称为 Main Clock 或 System Clock)分频为 8 次,作为 SysTick 的时钟频率。这样设置后,每 tick(一次 SysTick 计数周期)的时间就会比 HCLK 长很多,方便用于更长延迟量级的计算。
为了利用 SysTick 实现延时,你需要按照以下步骤:
1. **初始化 SysTick**:
- 首先需要启用 SysTick,并设置它的工作模式,例如开启并配置好定时器周期(tick period)。
```c
// Enable SysTick
SysTick_Config(SystemCoreClock / (SysTick_LOAD_RELOAD + 1));
```
这里 `SystemCoreClock` 是系统的主时钟频率,`SysTick_LOAD_RELOAD` 是 SysTick的最大计数值,一般等于 `(SysTick_MAX_TICKS - 1)`。
2. **设置中断服务函数(ISR)**:
- 为 SysTick 中断分配一个处理函数,当计数到最大值时,这个函数会被自动调用。
```c
void SysTick_Handler(void)
{
// Your delay code will go here once per tick
}
```
3. **设置延时期限**:
- 使用 SysTick 计数器设置一个预期的延时期限,然后开始计数。
```c
// Set a timeout for the desired delay in ticks
uint32_t timeout_ticks = YOUR_DESIRED_DELAY * (SysTick_CLKSOURCE_HZ / SystemCoreClock);
// Start the SysTick timer
SysTick_SetCount(timeout_ticks);
```
4. **等待定时结束**:
- 主程序进入其他循环或等待状态,直到 SysTick 中断发生。
5. **中断回调处理**:
- 当 SysTick 中断触发时,执行之前设置的 `SysTick_Handler()` 函数,完成延时任务。
注意,由于硬件限制,直接使用 SysTick 计数可能无法得到精确的延迟,特别是在高负载下可能会有偏差。如果你对延时精度要求很高,可以考虑使用其他更为精准的定时机制,如硬件定时器或者软件定时器。
阅读全文