delay.h

/* 
 * 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 */

 

 delay.c

/* 
 * 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);
    }