STM32F10x 使用SysTick的延时函数

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

 

 

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

你可能感兴趣的:(嵌入式)