单片机
返回首页

STM32F4(用SysTick实现Delay函数)

2018-04-23 来源:eefocus

1,开发环境


      1,适用芯片:STM32F4全部芯片


      2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0


      3,IDE:MDK517



2,驱动源码


      Delay.h文件


/**************************************************************** 

 * Copyright (C) 2016, XinLi, all right reserved. 

 * File name:    Delay.h 

 * Date:         2016.03.22 

 * Description:  Delay Driver 

*****************************************************************/  

  

#ifndef __DELAY_H  

#define __DELAY_H  

  

/**************************************************************** 

 *                        Header include 

*****************************************************************/  

#include 'stm32f4xx.h'  

  

/**************************************************************** 

 *                       Macro definition 

*****************************************************************/  

  

  

/**************************************************************** 

 *                       Type definition 

*****************************************************************/  

  

  

/**************************************************************** 

 *                     Structure definition 

*****************************************************************/  

  

  

  

#ifdef __cplusplus  

 extern 'C' {  

#endif  /* __cplusplus */  

  

/**************************************************************** 

 *                     Variable declaration 

*****************************************************************/  

  

  

/**************************************************************** 

 *                     Function declaration 

*****************************************************************/  

void Delay_us(uint64_t nus);  

void Delay_ms(uint64_t nms);  

void Delay_s(uint64_t ns);  

  

#ifdef __cplusplus  

}  

#endif  /* __cplusplus */  

  

#endif  /* __DELAY_H */  


      Delay.c文件



/**************************************************************** 

 * Copyright (C) 2016, XinLi, all right reserved. 

 * File name:    Delay.c 

 * Date:         2016.03.22 

 * Description:  Delay Driver 

*****************************************************************/  

  

/**************************************************************** 

 *                        Header include 

*****************************************************************/  

#include 'Delay.h'  

  

/**************************************************************** 

 *                       Global variables 

*****************************************************************/  

  

  

/**************************************************************** 

 *                     Function declaration 

*****************************************************************/  

static void Delay_Init(void);  

  

/**************************************************************** 

 *                     Function definition 

*****************************************************************/  

  

/**************************************************************** 

 * Function:    Delay_Init 

 * Description: Delay Configuration. 

 * Input: 

 * Output: 

 * Return: 

*****************************************************************/  

static void Delay_Init(void)  

{  

  static uint8_t first = 0;  

    

  if(first == 0)  

  {  

    first = 1;  

      

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Disability SysTick counter */  

  }  

}  

  

/**************************************************************** 

 * Function:    Delay_us 

 * Description: Microsecond delay. 

 * Input:       nus 

 * Output: 

 * Return: 

*****************************************************************/  

void Delay_us(uint64_t nus)  

{  

  uint32_t temp = 0;  

  uint64_t nms = 0;  

    

  Delay_Init();  

    

  if(nus == 0)  

  {  

    return;  

  }  

    

  nms = nus / 1000;  

  nus = nus % 1000;  

    

  if(nms > 0)  

  {  

    Delay_ms(nms);  

  }  

  

  if(nus > 0)  

  {  

    SysTick->LOAD = SystemCoreClock / 8000000 * nus;  /* Time load (SysTick-> LOAD is 24bit) */  

    SysTick->VAL = 0x000000;                          /* Empty counter */  

    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;         /* Start the countdown */  

  

    do  

    {  

      temp = SysTick->CTRL;  

    }  

    while(temp&0x01 && !(temp&(1<<16)));        /* Wait time is reached */  

  

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Close Counter */  

    SysTick->VAL = 0x000000;                    /* Empty counter */  

  }  

}  

  

/**************************************************************** 

 * Function:    Delay_ms 

 * Description: Millisecond delay. 

 * Input:       nms 

 * Output: 

 * Return: 

*****************************************************************/  

void Delay_ms(uint64_t nms)  

{  

  uint32_t temp = 0;  

    

  Delay_Init();  

    

  if(nms == 0)  

  {  

    return;  

  }  

    

  while(nms > 500)  

  {  

    SysTick->LOAD = SystemCoreClock / 8000 * 500; /* Time load (SysTick-> LOAD is 24bit) */  

    SysTick->VAL = 0x000000;                      /* Empty counter */  

    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;     /* Start the countdown */  

  

    do  

    {  

      temp = SysTick->CTRL;  

    }  

    while(temp&0x01 && !(temp&(1<<16)));        /* Wait time is reached */  

  

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Close Counter */  

    SysTick->VAL = 0x000000;                    /* Empty counter */  

      

    nms -= 500;  

  }  

    

  SysTick->LOAD = SystemCoreClock / 8000 * nms; /* Time load (SysTick-> LOAD is 24bit) */  

  SysTick->VAL = 0x000000;                      /* Empty counter */  

  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;     /* Start the countdown */  

  

  do  

  {  

    temp = SysTick->CTRL;  

  }  

  while(temp&0x01 && !(temp&(1<<16)));        /* Wait time is reached */  

  

  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Close Counter */  

  SysTick->VAL = 0x000000;                    /* Empty counter */  

}  

  

/**************************************************************** 

 * Function:    Delay_s 

 * Description: Second delay. 

 * Input:       ns 

 * Output: 

 * Return: 

*****************************************************************/  

void Delay_s(uint64_t ns)  

{  

  while(ns > 0)  

  {  

    Delay_ms(1000);  

    ns--;  

  }  

}  


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 用数字电路CD4069制作的万能遥控轻触开关

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章