stm32 delay的缺点
时间: 2024-10-23 09:00:53 浏览: 38
STM32单片机中使用的延时函数通常基于硬件定时器或者软件计数循环,各有其优缺点:
1. **硬件定时器延迟**:
- **优点**:
- 高精度:由于硬件资源直接控制,周期稳定,适合对时间精度要求较高的场合。
- 实时性强:不受CPU繁忙程度影响,即使在处理其他任务时也能保持稳定的延时。
- **缺点**:
- 初始化过程复杂:需要配置定时器的预分频器、定时器模式等,代码量较大。
- 功能限制:不是所有STM32型号都内置高级定时器,某些低功耗版本可能无硬件延时功能。
- 可能占用中断资源。
2. **软件计数循环延迟**:
- **优点**:
- 简单易用:无需额外硬件支持,适用于资源有限的小型项目。
- 灵活性高:可以在任意地方通过while循环实现,无需预先设置定时器。
- **缺点**:
- 时间精度相对较低:受CPU主频和循环次数影响,不适合对时间精度要求极高的应用。
- CPU效率较低:如果CPU负载过重,可能导致延时效果不稳定。
- 性能依赖于主频:主频越高,延时的实际等待时间越长。
相关问题
stm32的delay
### STM32 延时函数的实现与使用
对于STM32微控制器而言,延时功能是许多应用中的基本需求之一。通常有两种主要方式来创建延时:基于循环的软件延时和利用硬件定时器。
#### 软件延时函数
一种简单的方法是在程序中嵌入一个忙等待循环以消耗一定的时间周期:
```c
void delay(uint32_t time) {
uint32_t i, j;
for (i = 0; i < time; i++) {
for (j = 0; j < 5000; j++);
}
}
```
这种方法的优点在于其实现非常直观且易于理解[^2]。但是缺点也很明显——它会占用CPU资源,并且其准确性依赖于编译优化级别以及处理器的工作频率等因素的影响。
#### 使用HAL库提供的`HAL_Delay()`
为了提高效率并简化编程工作,ST官方提供了更高层次抽象的标准外设驱动(HAL)库,在其中包含了方便易用的`HAL_Delay()`接口用于产生精确度较高的毫秒级延迟:
```c
// 需要在初始化阶段调用 HAL_InitTick 来启动滴答定时器
HAL_InitTick(TICK_INT_PRIORITY);
...
// 在需要的地方可以直接调用此API来进行指定时间长度(ms)的阻塞式等待
HAL_Delay(1000); // 等待一秒
```
该方法内部实际上是通过SysTick中断机制来计数从而达到预期效果;而且由于它是基于实际经过的真实物理时间而非指令执行次数,所以即使系统核心速度发生变化也不会影响到最终的结果精度。
#### 自定义高精度纳秒/微妙级别的延时子程序
如果项目中有更严格的要求,则可以考虑编写专门针对特定应用场景下的细粒度控制方案,比如下面这个例子展示了如何借助DWT(Data Watchpoint and Trace)模块配合CYCCNT寄存器完成亚毫秒范围内的暂停动作:
```c
#include "stm32f4xx_hal.h"
static inline void DWT_Delay_us(volatile uint32_t us){
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
__IO uint32_t cycles_per_microsecond = SystemCoreClock / 1000000ul;
__IO uint32_t start = DWT->CYCCNT;
while ((DWT->CYCCNT - start) < (us * cycles_per_microsecond));
}
int main(void){
/* ... */
// 测试自定义的微秒级延时函数
GPIO_TogglePin(GPIOA, LED_PIN);
DWT_Delay_us(500); // 半毫秒
/* ... */
}
```
上述代码片段首先启用了数据观察点跟踪单元的功能开关位,接着读取当前核拍数作为起点标记,最后进入while循环直到满足预估所需流逝掉的目标周期为止。
stm32的delay函数
在STM32中,可以使用以下代码实现一个基于循环的延时函数:
```c
void delay(uint32_t ms)
{
volatile uint32_t i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 2000; j++);
}
```
这个函数使用两个嵌套的循环,对于每个输入的毫秒数,外部循环将循环该数量的次数,而内部循环将循环2000次。这些循环的目的是消耗CPU时间,从而实现延迟。
但是,这种方法有一些缺点。首先,它是基于CPU时间的延迟,因此如果CPU在等待期间执行了其他任务,延迟时间将不准确。其次,它是一个非阻塞延迟,因为CPU可以在等待期间执行其他任务,而不必等待延迟完成。
为了解决这些问题,可以使用STM32的定时器模块来实现更准确和可靠的延迟。
阅读全文