stm32f103延时函数
- 格式:docx
- 大小:37.45 KB
- 文档页数:4
stm32f103延时函数
一、前言
在嵌入式系统开发中,延时函数是一种常用的函数。它可以用来控制程序执行的时间,使程序按照我们期望的时间进行运行。本文将介绍如何在STM32F103系列单片机上实现延时函数。
二、STM32F103系列单片机简介
STM32F103系列单片机是意法半导体公司推出的一款高性能、低功耗的微控制器,它采用了ARM Cortex-M3内核,并集成了丰富的外设和接口,如通用定时器、串口通信接口等。
三、延时函数实现原理
在STM32F103系列单片机中,我们可以使用定时器来实现延时函数。具体实现方法为:首先设置定时器的计数值和预分频值,然后启动定时器,在计数器达到预设值之前程序会一直处于等待状态。当计数器达到预设值后,定时器会自动停止,并触发一个中断事件,在中断事件中我们可以编写相应代码来完成需要执行的操作。
四、编写延时函数
下面是一个基于TIM2定时器实现的延时函数:
```
#include "stm32f10x.h"
void delay_us(uint16_t us)
{
uint16_t ticks;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
ticks = RCC_Clocks.HCLK_Frequency / 1000000 * us / 8;
TIM2->ARR = ticks - 1;
TIM2->CNT = 0;
TIM2->CR1 |= TIM_CR1_CEN;
while((TIM2->SR & TIM_SR_UIF) == 0);
TIM2->CR1 &= ~TIM_CR1_CEN;
TIM2->SR &= ~TIM_SR_UIF;
}
void delay_ms(uint16_t ms)
{
uint16_t i;
for(i = 0; i < ms; i++)
delay_us(1000);
}
int main(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Period = 65535; //计数器自动重装值
TIM_TimeBaseInitStruct.TIM_Prescaler = SystemCoreClock /
1000000 - 1; //预分频值
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0; //时钟分割
TIM_TimeBaseInitStruct.TIM_CounterMode =
TIM_CounterMode_Up; //计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
while(1)
delay_ms(500);
}
```
五、代码解析 该代码实现了一个基于TIM2定时器的延时函数,其中delay_us函数用来实现微秒级别的延时,delay_ms函数用来实现毫秒级别的延时。
在delay_us函数中,首先通过RCC_GetClocksFreq函数获取系统时钟频率,并根据需要延时的微秒数计算出定时器的计数值和预分频值。然后设置定时器的ARR寄存器为计数值减1,CNT寄存器为0,使能定时器,并在计数器达到预设值后等待中断事件触发。最后关闭定时器并清除中断标志位。
在delay_ms函数中,我们通过调用delay_us函数实现了毫秒级别的延时。
在main函数中,我们首先使能TIM2定时器的时钟,并通过TIM_TimeBaseInitStruct结构体对TIM2进行初始化。然后进入一个死循环,在循环中每500毫秒调用一次delay_ms函数来实现LED灯闪烁。
六、总结
本文介绍了如何在STM32F103系列单片机上实现延时函数,通过使用定时器来控制程序执行的时间,使程序按照我们期望的时间进行运行。希望本文对大家有所帮助。