STM32使用滴答定时器延时
时间: 2025-05-22 15:17:26 AIGC 浏览: 53
### STM32 滴答定时器延时实现方法
STM32 的系统滴答定时器(SysTick Timer)是一个集成在 ARM Cortex-M 内核中的硬件模块,用于提供精确的时间基准。通过合理配置 SysTick 定时器及其中断机制,可以在不依赖外部外设的情况下实现高精度的延迟功能。
#### 配置 SysTick 定时器
SysTick 定时器的核心在于其寄存器配置以及时间基准的选择。对于基于 ARM Cortex-M3 内核的 STM32F103 系列微控制器,默认情况下,SysTick 使用的是核心时钟频率的一半作为计数源[^1]。这意味着如果系统的主频为 72 MHz,则 SysTick 计数器将以 72 MHz / 8 = 9 MHz 的速率递减。
以下是具体实现步骤:
1. **初始化 SysTick 定时器**
设置 `SYSTICK->LOAD` 寄存器值以定义每次溢出所需的时间间隔。该值决定了定时器触发一次中断所需的周期长度。
2. **启用 SysTick 中断**
如果需要使用中断方式处理事件,需开启相应的中断使能位并设置合适的优先级[^2]。
3. **编写非阻塞型延时逻辑**
利用全局变量记录当前状态,并结合 HAL 提供的功能函数如 `HAL_GetTick()` 来完成特定时间段内的操作控制[^3]。
下面给出一段完整的 C 语言代码示例展示如何利用 STMicroelectronics 推荐的标准库或者 HAL 库来达成上述目标:
```c
#include "stm32f1xx_hal.h"
// 全局变量声明
uint32_t hcsr04_count_delay;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void){
uint32_t tickstart;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
// 初始化超声波传感器发送信号倒计时
hcsr04_count_delay = 65;
while (1){
if(hcsr04_count_delay == 0){
hcsr04_send(); // 调用实际发送命令
hcsr04_count_delay = 65;// 重置计数值
// 添加额外等待确保完全达到期望时间
tickstart = HAL_GetTick();
while((HAL_GetTick()-tickstart)<1); // 补偿剩余不足部分
}
// 减少计数直到零为止
if(--hcsr04_count_delay ==0 ){
continue ;
}else{
__WFI(); // 进入低功耗模式节省电能消耗
}
}
}
/**
* @brief 发送HCSR04脉冲信号模拟过程简化版
*/
void hcsr04_send(){
GPIO_PinState state=GPIO_PIN_SET;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,state );
HAL_Delay(10); // 维持至少10us以上的高电平激活测量请求
state ^=state ; // 取反切换回原来的低电平结束触发动作
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,state );
}
/// ...其余省略部分内容...
```
此段代码展示了如何运用 HAL 库里的 `HAL_GetTick()` 方法配合简单的循环结构构建起一个基本但有效的非阻塞性质的软件延时框架。它允许 CPU 在两次连续调用之间进入睡眠状态从而降低整体能耗水平。
---
阅读全文
相关推荐




















