//--------------------------------------------------------<br />// 项目:通用<br />// 模块:ms级延时模块(基于SysTick)<br />// 说明:<br />// 设计:程序匠人(版权所有,引用者请保留原作者姓名)<br />//--------------------------------------------------------<br />/*<br />版本说明:<br />Delay_ms.c 2009-3-11 21:12:30<br /><br /><br />*/<br />//--------------------------------------------------------<br />//本模块使用步骤:<br />//--------------------------------------------------------<br />/*<br />步骤1.把本文件"Delay_ms.c"插入项目中<br />步骤2.把"stm32f10x_systick.c"库文件插入项目中<br />步骤3.修改系统文件"stm32f10x_conf.h",使能下面这句:<br /> #define _SysTick<br />步骤4.在"common.h"文件尾,插入"Delay_ms.h"头文件,如下:<br /> #include "Delay_ms.h" //ms级延时模块(基于SysTick) 头文件<br />步骤5.在"stm32f10x_it.c"文件及所有需要调用延时函数的c文件起始处,添加下面这句: <br /> #include "common.h"<br />步骤6.在"main()"函数初始化段中,调用"SysTick_Configuration()",执行SysTick初始化设置.<br />步骤7.打开"stm32f10x_it.c"文件,在"SysTickHandler()"中断函数中,调用"TimingDelay_Decrement()"函数.如下:<br /> void SysTickHandler(void)<br /> {<br /> TimingDelay_Decrement(); //TimingDelay递减函数<br /> }<br />步骤8.应用代码示例:<br /> SysTick_Delay(300); // 延时 300ms<br /><br />*/<br />//--------------------------------------------------------<br />//插入文件包<br />//--------------------------------------------------------<br />#include "common.h"<br />//--------------------------------------------------------<br /><br /><br />//--------------------------------------------------------<br />//SysTick初始化设置<br />//说明: 本函数由"main()"函数初始化段调用<br />//--------------------------------------------------------<br />void SysTick_Configuration(void)<br />{<br /> SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //配置SysTick的时钟源=为AHB(系统时钟)的1/8<br /> SysTick_SetReload(9000); //设置SysTick的重载值=9000.当系统时钟=72MHz,中断频率=1000Hz(周期1ms)<br /> SysTick_ITConfig(ENABLE); //使能SysTick中断<br />}<br /><br />//--------------------------------------------------------<br />//TimingDelay递减函数<br />//说明: 本函数由"SysTickHandler()"中断调用<br />//--------------------------------------------------------<br />void TimingDelay_Decrement(void)<br />{<br /> if (TimingDelay != 0x00) TimingDelay--; //TimingDelay不为0,则递减<br />} <br /><br />//--------------------------------------------------------<br />//延时函数<br />//入口: nTime=延时时间(单位=ms)<br />//--------------------------------------------------------<br />void SysTick_Delay(u32 nTime)<br />{<br /> SysTick_CounterCmd(SysTick_Counter_Enable); //使能SysTick计数器<br /> TimingDelay = nTime; //读取延时时间<br /> while(TimingDelay != 0); //判断延时是否结束<br /> SysTick_CounterCmd(SysTick_Counter_Disable); //关闭SysTick计数器<br /> SysTick_CounterCmd(SysTick_Counter_Clear); //清除SysTick计数器<br />}<br /><br />//--------------------------------------------------------<br />//延时启动函数<br />//说明: 本函数与SysTick_Delay_Check()配对使用<br />//入口: nTime=延时时间(单位=ms)<br />//--------------------------------------------------------<br />void SysTick_Delay_Start(u32 nTime)<br />{<br /> SysTick_CounterCmd(SysTick_Counter_Enable); //使能SysTick计数器<br /> TimingDelay = nTime; //读取延时时间<br />}<br /><br />//--------------------------------------------------------<br />//延时结束判断函数<br />//说明: 本函数与SysTick_Delay_Start()配对使用<br />//出口: 如果延时结束,关闭SysTick,并返回1;否则不关闭SysTick,并返回0<br />//--------------------------------------------------------<br />u8 SysTick_Delay_Check(void)<br />{<br /> u8 i = 0;<br /><br /> if (TimingDelay == 0) //判断,如果延时是否结束<br /> {<br /> SysTick_CounterCmd(SysTick_Counter_Disable); //关闭SysTick计数器<br /> SysTick_CounterCmd(SysTick_Counter_Clear); //清除SysTick计数器<br /> i = 1;<br /> }<br /> else //如果延时未结束<br /> {<br /> i = 0;<br /> }<br /> return i;<br />}<br /><br />//--------------------------------------------------------<br />//<br />// THE END<br />//<br />// 版权所有:程序匠人(引用者请保留原作者姓名)<br />//<br />//--------------------------------------------------------<br /><br />
|