经理看了我的延时函数,叹气摇头
其实我知道怎么写,只不过偷懒了,以后还是要规范的用延时函数
延时程序的头文件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; //清空计数器 }