中断方式延时
#include "bsp_SysTick.h"
static __IO uint32_t TimingDelay;
/* 定时器初始化函数 */
void SysTick_Init(void)
{
//1ms中断一次 SystemCoreClock=168MHz
if(SysTick_Config(SystemCoreClock/1000)){
while(1);
}
}
/* 毫秒延时函数 */
void delay_ms(__IO uint32_t count)
{
TimingDelay = count;
while(TimingDelay != 0);
}
/* 中断调用函数 */
void TimingDelay_Decrement(void)
{
if(TimingDelay!=0){
TimingDelay--;
}
}
#ifndef _BSP_SYSTICK_H
#define _BSP_SYSTICK_H
#include "stm32f4xx.h"
void SysTick_Init(void);
void delay_ms(__IO uint32_t count);
void TimingDelay_Decrement(void);
#endif
非中断方式延时
#include "bsp_SysTick.h"
static uint8_t fac_us=0;
static uint16_t fac_ms=0;
void delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SystemCoreClock/8000000;
fac_ms=(uint16_t)fac_us*1000;
}
void delay_ms(uint16_t nms)
{
uint32_t temp;
SysTick->LOAD=nms*fac_ms;//给LOAD重装载寄存器赋值
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 delay_us(uint16_t nus)
{
uint32_t temp;
SysTick->LOAD=nms*fac_us;//给LOAD重装载寄存器赋值
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; //清零
}
#ifndef _BSP_SYSTICK_H
#define _BSP_SYSTICK_H
#include "stm32f4xx.h"
void delay_init(void);
void delay_ms(uint16_t nms);
#endif