野火STM32学习(12)

中断方式延时

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值