Files
GoRail_Pager/Sys_Utils/delay.c

67 lines
2.6 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*********************************************************************************************
文件名delay.c - 公用延时程序 
编写人:谢英男(E-mail:xieyingnan1994@163.com)    
编写时间2018年08月31日    
修改日志:  
  NO.1-
**********************************************************************************************
说明1.公用微秒级和毫秒级延时程序使用Systick系统定时器实现。
**********************************************************************************************/
#include "stm32f10x.h"
#include "delay.h"
/*---------------本模块私有的宏、类型、函数声明、变量----------------------*/
static u8 fac_us = 0; //us延时倍乘数
static u16 fac_ms = 0; //ms延时倍乘数
/*---------------------------------------------------------------------------
函数名delay_init() - 初始化延迟函数
功能:初始化延迟函数
输入参数:无
返回值:无
---------------------------------------------------------------------------*/
void Delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
}
/*---------------------------------------------------------------------------
函数名delay_us - 微秒延迟函数
功能:微秒级延迟
输入参数u32 nus - 要延迟的微妙数
返回值:无
说明注意延迟最大值在72M时钟条件下为0xffffff*8/72 = 1864135 us
---------------------------------------------------------------------------*/
void Delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
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; //清空计数器
}
/*---------------------------------------------------------------------------
函数名delay_ms - 毫秒延迟函数
功能:微秒级延迟
输入参数u16 nms - 要延迟的毫秒数
返回值:无
说明注意延迟最大值为0xffffff*8*1000/72 = 1864 ms
---------------------------------------------------------------------------*/
void Delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
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; //清空计数器
}