STM32单片机延时与多任务:在并发环境中实现精确延时
发布时间: 2024-07-05 21:14:24 阅读量: 69 订阅数: 36
![stm32单片机如何延时](https://img-blog.csdnimg.cn/76434475dd8e46be99825ccbd5b0fdec.png)
# 1. STM32单片机简介**
STM32系列单片机是意法半导体(STMicroelectronics)公司推出的高性能32位微控制器,基于ARM Cortex-M内核。STM32单片机以其强大的处理能力、丰富的外设资源和低功耗特性而著称。
**1.1 STM32系列单片机的特点**
* **高性能:**基于ARM Cortex-M内核,主频高达216MHz
* **丰富的外设:**集成丰富的通信接口、定时器、ADC、DAC等外设
* **低功耗:**提供多种低功耗模式,可延长电池续航时间
* **易于开发:**提供完善的开发工具和生态系统,降低开发难度
**1.2 STM32单片机的内部架构**
STM32单片机的内部架构通常包括以下主要模块:
* **Cortex-M内核:**负责处理指令和执行程序
* **存储器:**包括Flash存储器、SRAM和EEPROM
* **外设:**包括通信接口、定时器、ADC、DAC等
* **总线:**连接各个模块,实现数据和指令的传输
* **中断控制器:**管理来自外设和内部事件的中断请求
# 2. STM32单片机延时原理
### 2.1 延时的概念和类型
延时,即让程序执行暂停一段时间,在嵌入式系统中广泛应用于控制外设、任务调度和数据处理等场景。根据实现方式,延时可分为以下类型:
- **软件延时:**通过循环语句或汇编指令实现,通过不断执行空操作来消耗时间。
- **硬件延时:**利用单片机内部或外部的定时器外设,通过配置定时器参数来实现精确的延时。
### 2.2 STM32单片机的延时机制
STM32单片机提供多种延时机制,包括 SysTick 定时器和定时器外设。
#### 2.2.1 SysTick 定时器
SysTick 定时器是一个 24 位递减计数器,每隔一个时钟周期递减一次。通过配置 SysTick 定时器的时钟源和重载值,可以实现毫秒级的延时。
```c
// 配置 SysTick 定时器
SysTick_Config(SystemCoreClock / 1000);
// 延时 1 秒
void delay_ms(uint32_t ms) {
uint32_t start = SysTick->VAL;
while ((SysTick->VAL - start) < (ms * (SystemCoreClock / 1000)));
}
```
**逻辑分析:**
- `SysTick_Config()` 函数配置 SysTick 定时器的时钟源为系统时钟,重载值为系统时钟频率除以 1000,即每毫秒递减一次。
- `delay_ms()` 函数通过比较 SysTick 定时器的当前值和起始值来判断是否达到延时时间。
#### 2.2.2 定时器外设
STM32 单片机还提供多个定时器外设,如 TIM1、TIM2 等。这些定时器外设具有更丰富的功能,可实现更精确、灵活的延时控制。
```c
// 配置 TIM2 定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 延时 1 秒
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 1MHz 时钟
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 开启 TIM2 定时器
TIM_Cmd(TIM2, ENABLE);
// 延时 1 秒
void delay_ms(uint32_t ms) {
TIM2->CNT = 0;
while (TIM2->CNT < ms);
}
```
**逻辑分析:**
- `TIM_TimeBaseInit()` 函数配置 TIM2 定时器的时钟源为系统时钟,重载值为 1000 - 1,预分频值为系统时钟频率除以 1MHz - 1,即每毫秒递减一次。
- `delay_ms()` 函数通过比较 TIM2 定时器的当前值和 0 来判断是否达到延时时间。
**表格:STM32 单片机延时机制对比**
| 特征 | SysTick 定时器 | 定时器外设 |
|---|---|-
0
0