首页 > 学院 > 开发设计 > 正文

STM32F4(用SysTick实现Delay函数)

2019-11-06 07:13:29
字体:
来源:转载
供稿:网友

STM32F4(用SysTick实现Delay函数)

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表