STM32单片机延时与嵌入式系统:延时在嵌入式系统中的关键作用
发布时间: 2024-07-05 21:28:36 阅读量: 81 订阅数: 40
![STM32单片机延时与嵌入式系统:延时在嵌入式系统中的关键作用](https://img-blog.csdnimg.cn/fb176bb7a0434606ad464f7553e7ed71.png)
# 1. 延时的概念和重要性
延时在嵌入式系统中扮演着至关重要的角色,它用于在系统中引入时间间隔,以协调不同任务和事件的执行。延时可以实现以下关键功能:
- **系统初始化:**在系统启动时,需要为各种外设和组件提供足够的延时,以确保它们正确初始化并稳定运行。
- **数据传输:**在数据传输过程中,需要在发送和接收数据之间引入延时,以确保数据完整性和可靠性。
# 2. STM32单片机延时的实现方式
### 2.1 软件延时
#### 2.1.1 循环延时
循环延时是最简单、最直接的延时方式,通过执行一个空循环来消耗时间。其实现代码如下:
```c
void delay_us(uint32_t us)
{
uint32_t i;
for (i = 0; i < us * 12; i++)
{
__NOP();
}
}
```
**参数说明:**
* `us`: 延时时间,单位微秒
**代码逻辑分析:**
* `__NOP()`为无操作指令,执行该指令不会对寄存器或内存产生任何影响,仅消耗一个时钟周期。
* 循环执行`us * 12`次`__NOP()`指令,每个指令消耗一个时钟周期,因此总延时时间为`us * 12`个时钟周期。
* STM32单片机的时钟频率为72MHz,因此一个时钟周期的时长为1/72MHz = 13.89ns。
* 所以,延时`us`微秒的实际延时时间为`us * 12 * 13.89ns`。
#### 2.1.2 SysTick延时
SysTick延时利用SysTick定时器来实现延时。SysTick定时器是一个32位递减计数器,每隔一个时钟周期递减一次。其实现代码如下:
```c
void delay_ms(uint32_t ms)
{
SysTick->LOAD = ms * 72000 - 1;
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0)
{
;
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
```
**参数说明:**
* `ms`: 延时时间,单位毫秒
**代码逻辑分析:**
* 设置SysTick定时器的加载值`LOAD`为`ms * 72000 - 1`,即`ms`毫秒对应的时钟周期数。
* 清除SysTick定时器的当前值`VAL`。
* 启用SysTick定时器。
* 进入循环,等待SysTick定时器的计数标志位`COUNTFLAG`置位,表示延时结束。
* 禁用SysTick定时器。
### 2.2 硬件延时
#### 2.2.1 定时器延时
定时器延时利用定时器来实现延时。定时器是一个可编程的计数器,可以产生周期性中断。其实现代码如下:
```c
void delay_ms_timer(uint32_t ms)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = ms * 72 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
while (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET)
{
;
}
TIM_Cmd(TIM2, DISABLE);
}
```
**参数说明:**
* `ms`: 延时时间,单位毫秒
**代码逻辑分析:**
* 初始化TIM2定时器,设置定时器周期为`ms * 7
0
0