搜索
查看: 832|回复: 1

[分享] 通过SysTick中断实现微秒、毫秒、秒的延时

[复制链接]

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-12
发表于 2019-12-6 09:28:58 | 显示全部楼层 |阅读模式
/*****************************************************************************
* @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;  // 失能滴答定时器
     }
}

回复

使用道具 举报

该用户从未签到

8

主题

712

帖子

38

蝴蝶豆

论坛元老

最后登录
2021-8-25
发表于 2019-12-6 09:58:42 | 显示全部楼层
us级的不准啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-24 04:33 , Processed in 0.147059 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表