stm32 延时 delay us ms

/**
********************************************************
*
* @file      delay.c
* @author    Gizwtis
* @version   V03010100
* @date      2016-07-05
*
* @brief     机智云.只为智能硬件而生
*            Gizwits Smart Cloud  for Smart Products
*            链接|增值|开放|中立|安全|自有|自由|生态
*            www.gizwits.com
*
*********************************************************/

#include "delay.h"

static uint8_t  facUs = 0;																		//us延时倍乘数
static uint16_t facMs = 0;																		//ms延时倍乘数

void delayInit(uint8_t SYSCLK)
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟,HCLK/8
	facUs = SYSCLK / 8; //硬件分频,fac_us得出的值要给下面的时钟函数使用
	facMs = (u16)facUs * 1000;
}

void delayUs(uint32_t nus)
{
	uint32_t temp;
	SysTick->LOAD = nus*facUs;  //延时10us,10*9 = 90,装到load寄存器中
	SysTick->VAL = 0x00;//计数器清0
	SysTick->CTRL = 0x01;//配置异常生效,也就是计数器倒数到0时发出异常通知
	do
	{
		temp = SysTick->CTRL;//时间到,该位将被硬件置1,但被查询后自动清0
	} while (temp & 0x01 && !(temp &(1 << 16)));//查询
	SysTick->CTRL = 0x00;//关闭定时器
	SysTick->VAL = 0x00;//清空val,清空定时器
}


void delayMs(uint16_t nms)
{
	uint32_t temp;
	SysTick->LOAD = nms*facMs;//延时10ms,10*9 = 90,装到load寄存器中
	SysTick->VAL = 0x00;//计数器清0
	SysTick->CTRL = 0x01;//配置异常生效,也就是计数器倒数到0时发出异常通知
	do
	{
		temp = SysTick->CTRL;//时间到,该位将被硬件置1,但被查询后自动清0
	} while (temp & 0x01 && !(temp &(1 << 16)));//查询

	SysTick->CTRL = 0x00;//关闭定时器
	SysTick->VAL = 0x00;//清空val,清空定时器
}

//例子:
/*
delayInit(72);//72M时钟
delayMs(20);
delayUs(1);
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值