foggia2004

STM32之延时秒,毫秒,微秒

#include "delay.h"
#include "stdint.h"
#include "stm32f10x.h"

static uint8_t fac_us=0;  //us延时倍乘数
static uint16_t fac_ms=0; //ms延时倍乘数


void DelayInit()
{
    //选择外部时钟
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    fac_us=SystemCoreClock/8000000;  //设置为系统时钟的1/8
    fac_ms=(u16)fac_us*1000;         
}

void DelayUs(unsigned int us)
{
    u32 temp;
    SysTick->LOAD=us*fac_us;             //加载时间
    SysTick->VAL=0x00;                   //清空计时器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
    do
    {
        temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));         //等待时间到达
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;   //关闭计时器
    SysTick->VAL=0x00;                         //清空计时器
}


void DelayMs(unsigned int ms)
{
    u32 temp;
    SysTick->LOAD=ms*fac_ms;             
    SysTick->VAL=0x00;                   
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
    do
    {
        temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;   
    SysTick->VAL=0x00;                   
}


void DelayS(unsigned int s)
{
    unsigned char i;
    for(i=0;i<s;i++)
    {
        DelayMs(1000);
    }
}

 

posted on 2016-01-29 11:39  foggia2004  阅读(10619)  评论(0编辑  收藏  举报

导航