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