stm32延时函数delay

发布时间 2023-11-22 16:51:41作者: 败人两字非傲即惰
delay.h

#ifndef __DELAY_H
#define __DELAY_H

 

#include "stm32f4xx.h"


void Delay_Init(void);
void delay_us(int nus);
void delay_ms(int nms);
void delay_s(int ns);

#endif

delay.c
#include  "delay.h"


int my_us = 21;           //在21MHZ下,计21个数,用1us
int my_ms = 21000;       //在21MHZ下,计21000个数,用1ms

void Delay_Init(void)
{
    //配置Systick定时器时钟 HCLK/8 = 168MHZ/8 = 21MHZ
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    
}

//nus取值范围:1~798915

void delay_us(int nus)
{
    u32 temp = 0x00;
    
    //设置重装载值寄存器
    SysTick->LOAD = my_us*nus - 1;

    //设置当前值寄存器值为0
    SysTick->VAL = 0x00;
    
    //开启定时器,让定时器开始计数,定时器一旦使能,重装载值寄存器的值则直接放置到当前值寄存器
    SysTick->CTRL |= (0x01<<0);
    
    //系统自动计数
    do
    {
        temp = SysTick->CTRL;
        
    //  判断定时器是否使能          判断第16位是否为1(计数器计数到0)    
    }while( (temp & (0x01<<0))  &&   (!(temp&(0x01<<16))) );
    

    //关闭定时器
    SysTick->CTRL &= ~(0x01<<0);
    

}

//nms取值范围:1~798
void delay_ms(int nms)
{
    u32 temp = 0x00;
    
    //设置重装载值寄存器
    SysTick->LOAD = my_ms*nms - 1;

    //设置当前值寄存器值为0
    SysTick->VAL = 0x00;
    
    //开启定时器,让定时器开始计数,定时器一旦使能,重装载值寄存器的值则直接放置到当前值寄存器
    SysTick->CTRL |= (0x01<<0);
    
    //系统自动计数
    do
    {
        temp = SysTick->CTRL;
        
    //  判断定时器是否使能          判断第16位是否为1(计数器计数到0)    
    }while( (temp & (0x01<<0))  &&   (!(temp&(0x01<<16))) );
    

    //关闭定时器
    SysTick->CTRL &= ~(0x01<<0);
    

}

void delay_s(int ns)
{
    int i;
    
    for(i=0; i<ns; i++)
    {
        delay_ms(500);
        delay_ms(500);
    }

}