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系列单片机上实现延时函数,通过使用定时器来控制程序执行的时间,使程序按照我们期望的时间进行运行。希望本文对大家有所帮助。