【实习中的延时函数】

经理看了我的延时函数,叹气摇头

其实我知道怎么写,只不过偷懒了,以后还是要规范的用延时函数

延时程序的头文件Delay.h

复制代码
1 #ifndef _DELAY_H_
2 #define _DELAY_H_
3 
4 void delay_init(u8 SYSCLK);
5 void delay_ms(u16 nms);
6 void delay_us(u32 Nus);
7 
8 
9 #endif
复制代码

延时程序实现文件Delay.c

复制代码
/**********************************************************
文件:Delay.c
函数:void delay_init(u8 SYSCLK);
      void delay_ms(u16 nms);
      void delay_us(u32 Nus);
说明:三个函数实现的功能是不采用中断方式,并且用stm32系统滴答时钟来实现延时功能。
***********************************************************/


#include <stm32f10x.h>
#include "Delay.h"


static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms

/**************************************************
Name: delay_init
功能:应用程序延时函数初始化,包括为滴答时钟准备相关数值
参数:u8 SYSCLK
返回:None
***************************************************/
void delay_init(u8 SYSCLK)
{
    SysTick->CTRL&=0xfffffffb;//设置滴答时钟的时钟源:bit 2清空,选择外部时钟HCLK/8
    fac_us = SYSCLK / 8;
    fac_ms = (u16)fac_us*1000;    
}
/**************************************************
名字:delay_ms
共能:应用程序ms级别的延时实现
参数:u16 nms
返回:None
***************************************************/
void delay_ms(u16 nms)
{        
 u32 temp;    
 SysTick->LOAD=(u32)nms*fac_ms;//时间加载
 SysTick->VAL =0x00;           //清空计数器
 SysTick->CTRL=0x01 ;          //开始倒数 
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  
 SysTick->CTRL=0x00;       //关闭计数器
 SysTick->VAL =0X00;       //清空计数器       
}  

/***********************************************************
名字:delay_us
功能:应用程序us级别的延时实现
参数:u32 Nus
返回:None
************************************************************/         
void delay_us(u32 Nus)
{  
 u32 temp;      
 SysTick->LOAD=Nus*fac_us; //时间加载     
 SysTick->VAL=0x00;        //清空计数器
 SysTick->CTRL=0x01 ;      //开始倒数  
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  
 SysTick->CTRL=0x00;       //关闭计数器
 SysTick->VAL =0X00;       //清空计数器    
}   
复制代码

猜你喜欢

转载自blog.csdn.net/dummkopfer/article/details/80399508