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