/***************************************************************************** * @file systick.c * @function 通过系统滴答SysTick中断实现us(微秒)、ms(毫秒)、s(秒)的延时 * @brief 用3.5.0版本库建的工程模板 * @attention * @version V1.0 * @company HNSRX科技有限公司 * @website * @Author CZ Li * @date 2019-11-29 ******************************************************************************/ #include "systick.h" uint32_t SysTickDelayTime; static uint32_t SysTick_Counter; // 备用,当前由 定时器 T2 实现 /****************************************************************************** * @brief 初始化系统滴答时钟SysTick * @param 无 * @retval 无 * @note 1)、SystemFrequency / 1000,1ms中断一次 * 2)、SystemFrequency/ 100000 10us中断一次 * 3)、SystemFrequency/ 1000000 1us中断一次 * (SystemFrequency /Value)个系统时钟节拍中断一次 ******************************************************************************/ void systick_init(void) { while(SysTick_Config(SystemCoreClock/10000)) ; // 初始化并使能系统滴答时钟,返回1表示计数设置太大 SysTick->CTRL&= ~ SysTick_CTRL_ENABLE_Msk; // 失能滴答定时器 } /****************************************************************************** * @brief 微秒延时 * @param 需要延时的时间 us * @retval 无 ****************************************************************************/ void delay_us(uint32_t us) { SysTickDelayTime =us/100; SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk; // 使能滴答定时器 while(SysTickDelayTime!= 0); // 等待延时时间到 } /****************************************************************************** * @brief 毫秒延时 * @param 需要延时的时间 ms * @retval 无 ****************************************************************************/ void delay_ms(uint32_t ms) { SysTickDelayTime =ms*10; SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk; // 使能滴答定时器 while(SysTickDelayTime!= 0); // 等待延时时间到 } /***************************************************************************** * @brief 秒延时 * @param 需要延时的时间 s * @retval 无 ******************************************************************************/ void delay_s(uint32_t s) { SysTickDelayTime =s*10000; SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk; // 使能滴答定时器 while(SysTickDelayTime!= 0); // 等待延时时间到 } /**************************************************************************** * @brief 获取节拍函数 * @param 无 * @retval 无 * @note 在SysTick中断程序SysTick_Handler()调用(stm32f10x_it.c) ****************************************************************************/ void SysTickDelayTime_Counter(void) { if(SysTickDelayTime> 0) { SysTickDelayTime--; } else { SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; // 失能滴答定时器 } }
|