stm32使用滴答定时器标准库
时间: 2024-12-26 17:13:28 浏览: 79
### STM32 滴答定时器标准库使用方法
#### 初始化滴答定时器
为了使能并配置STM32的滴答定时器,在项目启动文件中通常会调用`SystemInit()`函数来设置系统时钟频率。对于特定型号如STM32F4系列,当定义了宏`STM32F40_41xxx`时,默认的核心时钟速度被设定为168MHz[^1]。
```c
#if defined(STM32F40_41xxx)
uint32_t SystemCoreClock = 168000000;
#endif /* STM32F40_41xxx */
```
接着,通过调用一个专门用于初始化滴答定时器的函数可以轻松完成进一步配置。此函数不仅设置了滴答间隔时间还调整了相应的中断优先级分组,从而确保即使在高负载情况下也能正常工作而不至于因为较低级别的中断请求得不到及时响应而导致程序卡死的情况发生[^2]。
#### 编写延时函数
基于上述准备好的环境,下面展示如何实现简单的毫秒级别延迟功能:
```c
void delay_ms(uint32_t ms){
HAL_Delay(ms);
}
```
这里利用了HAL库中的`HAL_Delay()`接口来进行指定毫秒数目的等待操作。需要注意的是,实际应用过程中应当保证滴答定时器已经正确安装并且处于激活状态;否则可能会遇到不可预期的行为或错误提示。
相关问题
STM32使用滴答定时器延时
### 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 在两次连续调用之间进入睡眠状态从而降低整体能耗水平。
---
stm32标准库滴答定时器
### STM32标准库中滴答定时器(SysTick)的实现方法与用法
#### 1. SysTick 定义与功能概述
SysTick 是 Cortex-M3/M4 内核的一部分,用于提供系统级的定时服务。它是一个 24 位向下的计数器,在每次递减时会消耗一个系统时钟周期 (SYSCLK)[^3]。通过配置其控制寄存器 (`STK_CTRL`) 和重载寄存器 (`STK_LOAD`),可以实现精确的时间间隔触发事件。
#### 2. 配置步骤
以下是使用 STM32 标准库实现 SysTick 的基本流程:
- **使能 SysTick 中断**: 设置 `STK_CTRL` 寄存器中的 `TICKINT` 位为 1。
- **设定重装载值**: 将目标时间转换为对应的重装载值写入 `STK_LOAD` 寄存器。例如,如果希望每 1 毫秒触发一次中断,则需计算 `(SystemCoreClock / 1000)` 并将其赋给该寄存器。
- **启动计数器**: 置位 `ENABLE` 来激活计数过程。
具体初始化代码如下所示:
```c
void SysTick_Init(void){
// 假设 SystemCoreClock 已经被正确设置为实际频率
uint32_t ticks_per_ms = SystemCoreClock / 1000;
if(ticks_per_ms > 0xFFFFFF){ /* 如果超过最大可表示范围 */
Error_Handler();
}
SysTick->LOAD = ticks_per_ms - 1; // 加载重装载值, 减一因为它是从零开始倒计数
NVIC_SetPriority(SysTick_IRQn, (1 << __NVIC_PRIO_BITS)-1); // 设定最低优先级
SysTick->VAL = 0; // 清除当前值寄存器
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
}
```
上述代码片段实现了基于标准库的 SysTick 初始化操作[^2]。其中需要注意的是错误处理逻辑以及如何合理分配中断优先级以避免冲突。
#### 3. 使用场景举例
利用已配置好的 SysTick 可轻松创建全局变量来跟踪流逝时间或者执行固定周期的任务调度。下面展示了一个简单的延时函数例子:
```c
volatile uint32_t msTicks = 0;
// 处理 SysTick 中断的服务程序
void SysTick_Handler(void){
msTicks++;
}
/* 提供毫秒级别的延迟 */
void Delay(uint32_t delayMs){
uint32_t start_time = msTicks;
while((msTicks - start_time) < delayMs);
}
```
这里定义了两个外部可见的对象:一个是用来累积经过了多少个完整的毫秒(`msTicks`);另一个则是具体的阻塞型等待接口(Delay())[^4]。
#### 结论
综上所述,借助于 CMSIS 提供的标准 API 接口及其背后硬件资源的支持,开发者能够方便快捷地完成对于基础时间管理需求的功能构建工作。同时也要注意不同型号 MCU 下可能存在的细微差异之处。
阅读全文
相关推荐
















