STM32F10x 使用SysTick的延时函数

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/*
* STM32F10x 使用SysTick的延时函数
* 版本.........: 1.0
* 作者.........: 陈利栋
* 文件名.......: delay.h
* 创建时间.....: 2010.06.26
* 最后修改.....: 2010.06.26
*
* 共4个延时函数,其中delay可以直接使用,其余3个需要先调用初始化函数delay_init
*
* 参数最大值:
* delay : 0xffffffff
* delay_us : 0xffffff / (HCLK / 8000000)
* delay_ms : 0xffffff / (HCLK / 8000) 特别注意主频72M时为1864
* delay_s : 0xffff
*/
#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x_type.h"
#include "stm32f10x_systick.h"
#include "stm32f10x_rcc.h"

extern void delay(u32 i);
extern void delay_init(void);
extern void delay_us(u32 i);
extern void delay_ms(u16 i);
extern void delay_s(u16 n);

#endif /* __DELAY_H */

 

 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/*
* STM32F10x 使用SysTick的延时函数
* 版本.........: 1.0
* 作者.........: 陈利栋
* 文件名.......: delay.c
* 创建时间.....: 2010.06.26
* 最后修改.....: 2010.06.26
*/
#include "delay.h"

static u8 delay_fac_us = 0; // us延时倍乘数
static u16 delay_fac_ms = 0; // ms延时倍乘数
static FlagStatus Status;

void delay(u32 i)
{
while (--i);
}

void delay_init(void)
{
RCC_ClocksTypeDef RCC_ClocksStatus;

RCC_GetClocksFreq(&RCC_ClocksStatus);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_ITConfig(DISABLE);
delay_fac_us = RCC_ClocksStatus.HCLK_Frequency / 8000000;
delay_fac_ms = RCC_ClocksStatus.HCLK_Frequency / 8000;
}

void delay_us(u32 n)
{
SysTick_SetReload(delay_fac_us * n);
SysTick_CounterCmd(SysTick_Counter_Clear);
SysTick_CounterCmd(SysTick_Counter_Enable);
do
{
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
}while (Status != SET);
SysTick_CounterCmd(SysTick_Counter_Disable);
}

// 最大值 0xffffff / (HCLK / 8000)
// 主频72M时,n最大值只能是1864
void delay_ms(u16 n)
{
u32 temp = delay_fac_ms * n;

if (temp > 0x00ffffff)
{
temp = 0x00ffffff;
}
SysTick_SetReload(temp);
SysTick_CounterCmd(SysTick_Counter_Clear);
SysTick_CounterCmd(SysTick_Counter_Enable);
do
{
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
}while (Status != SET);
SysTick_CounterCmd(SysTick_Counter_Disable);
}

void delay_s(u16 n)
{
while (n--)
{
delay_ms(1000);
}
}

 

转载自:https://www.cnblogs.com/chenlidong/archive/2010/06/28/1766637.html

posted @ 2018-06-29 14:16  水泡泡洗澡澡  阅读(379)  评论(0编辑  收藏  举报