stm32中滴答定时器与普通定时器的区别
时间: 2024-04-29 20:12:05 浏览: 183
滴答定时器和普通定时器在STM32中的区别主要体现在其用途和计数范围上。滴答定时器用于生成精确的短时间延迟,例如1ms、10ms等,计数范围一般为16位,在溢出后会自动重新加载计数器,并且可以通过中断方式进行定时器事件的处理。普通定时器则用于更长时间的定时,它们一般具有更大的计数范围,例如16位或者32位,同时还可以支持PWM等功能。
相关问题
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--;
}
```
在此基础上还可以进一步扩展成更加复杂的功能模块满足不同应用场景下的需求。
stm32f103滴答定时器
STM32F103的滴答定时器是一个16位定时器,它被称为SysTick定时器。它是一个系统定时器,用于提供基本的操作系统定时器功能。
SysTick定时器有如下特点:
1. 定时精度为1us。
2. 可以配置为自动重载模式或者单次模式。
3. 可以配置中断触发或者不触发中断。
4. 可以配置时钟源为内部时钟(HCLK)或者外部时钟。
要在STM32F103上使用SysTick定时器,你需要进行以下步骤:
1. 使能SysTick定时器:通过设置STK_CTRL寄存器的ENABLE位实现。
2. 配置SysTick定时器的时钟源:通过设置STK_CTRL寄存器的CLKSOURCE位实现。
3. 配置SysTick定时器的加载值:通过设置STK_LOAD寄存器的值实现,该值决定定时器的溢出时间。
4. 配置SysTick定时器的中断:通过设置STK_CTRL寄存器的TICKINT位实现。
在使用SysTick定时器后,你可以通过读取STK_VAL寄存器来获取当前计数值,通过读取STK_CTRL寄存器的COUNTFLAG位来判断计数器是否溢出。
希望以上信息能对你有所帮助。如有更多问题,请随时提问!
阅读全文
相关推荐













