可以直接看定时器二代
systick定时器是属于cortex M内核的外设,专门为RTOS的系统时钟节拍设计的。systick是cortex M内核自带的,因此和debug调试接口一样,与单片机型号和厂商无关,只要是cortex M内核的单片机,都拥有这个24位的systick定时器。

systick定时器是一个24位递减计时器,用户至于要掌握CMSIS包中的SysTick_Config 函数进行初始化即可。

    /** \brief  System Tick ConfigurationThis function initialises the system tick timer and its interrupt and start the system tick timer.Counter is in free running mode to generate periodical interrupts.\param [in]  ticks  Number of ticks between two interrupts\return          0  Function succeeded\return          1  Function failed*/static __INLINE uint32_t SysTick_Config(uint32_t ticks){if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */return (0);                                                  /* Function successful */}

SysTick_Config(uint32_t ticks)函数通过参数ticks设置中断间隔,如果要设置1ms的中断间隔,则ticks = 系统时钟/1000. 设置Systick中断服务函数默认优先级最低,可以通过如下函数修改中断优先级。

//    //优先级配置 抢占优先级1  子优先级2   越小优先级越高  抢占优先级可打断别的中断NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1,2));

初始化完成后,systick在设置的中断间隔到来时触发中断,进入中断服务函数

/*** @brief    systick中断服务函数** @param    ** @return   ** @note     ** @example  ** @date     2019/6/10 星期一*/
void SysTick_Handler(void)
{}

完整代码 bsp_systick.h

#ifndef __BSP_SYSTICK_H
#define __BSP_SYSTICK_H
#include "stdint.h"/** * @brief 一个系统时间结构体*/
typedef struct
{   void (* init) (void);  uint32_t (* get_time_us) (void);uint32_t (* get_time_ms) (void);void (* delay_us)(uint32_t);void (* delay_ms)(uint32_t);
}systime_t;/** 声明 systime */
extern systime_t  systime;#endif //__BSP_SYSTICK_H

bsp_systick.c

/*!* @file     bsp_systick.c** @brief    systick驱动文件** @author   不咸不要钱** @note     无** @version  无** @date     2019/10/18 星期五*/
#include "bsp_systick.h"#define EACH_PER_MS    25   /*!<每隔 25 ms 中断一次  systick 定时器是24位向下计数的定时器  最大装载值16777215 */ /** * @brief 一个时间结构体* @note  内部调用*/
struct time{uint32_t fac_us;                  /*!<us分频系数         */uint32_t fac_ms;                  /*!<ms分频系数         */volatile uint32_t millisecond;    /*!<当前ms值           */uint8_t ms_per_tick;              /*!<每隔多少ms中断一次 */}timer;/*!* @brief    systime 初始化** @param    无** @return   无** @note     默认优先级最低 可以修改** @see      systime.init();  //初始化  ** @date     2019/6/10 星期一*/
void systime_init(void)
{timer.fac_us = SystemCoreClock / 1000000;timer.fac_ms = SystemCoreClock / 1000;timer.ms_per_tick = EACH_PER_MS;timer.millisecond = 100;SysTick_Config((SystemCoreClock / 1000) * timer.ms_per_tick );   //开启systick中断//    //优先级配置 抢占优先级1  子优先级2   越小优先级越高  抢占优先级可打断别的中断
//    NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1,0));
}/*!* @brief    systime 中断服务函数** @param    无** @return   无** @note     无** @see      无** @date     2019/6/10 星期一*/
void SysTick_Handler(void)
{timer.millisecond += timer.ms_per_tick;
}/*!* @brief    获取当前时间** @param    无** @return   当前ms值** @note     无** @see      system.get_time_ms();  //获取当前ms值  ** @date     2019/6/10 星期一*/
uint32_t systime_get_current_time_ms(void)
{register uint32_t val, ms;do{ms  = timer.millisecond;val = SysTick->VAL; }while(ms != timer.millisecond);return ms  -  val/timer.fac_ms;
}/*!* @brief    获取当前时间** @param    无** @return   当前us值** @note     无** @see      system.get_time_us();  //获取当前ms值  ** @date     2019/6/10 星期一*/
uint32_t systime_get_current_time_us(void)
{register uint32_t val, ms;do{ms  = timer.millisecond;val = SysTick->VAL;}while(ms != timer.millisecond);return (uint32_t)((uint32_t)(ms * 1000) -  val / timer.fac_us);
}/*!* @brief    systime 延时函数** @param    us    :延时时间** @return   无** @note     最大延时不要超过 4292s** @see      system.delay_us(1000);  //延时1ms** @date     2019/6/10 星期一*/
void systime_delay_us(uint32_t us)
{uint32_t now = systime.get_time_us();uint32_t end_time = now + us - 3;while( systime.get_time_us() <= end_time){;}
}/*!* @brief    延时函数** @param    ms :  延时时间** @return   无** @note     无 ** @see      system.delay_ms(1000);  //延时1s  ** @date     2019/6/10 星期一*/
void systime_delay_ms(uint32_t ms)
{while(ms--){systime.delay_us(1000);}}/** 创建一个systck实例 */
systime_t  systime =
{systime_init,systime_get_current_time_us,systime_get_current_time_ms,systime_delay_us,systime_delay_ms
};

systick定时器 延时计时相关推荐

  1. STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)

    STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...

  2. STM32的系统嘀嗒定时器(SysTick)实现简单计时功能

    SysTick是属于内核里的外设,只要是Cortex M内核的单片机,都拥有这个24位的SysTick定时器. SysTick的counter是一个递减计数器,首先要填入reload自动重装载计数器的 ...

  3. SysTick定时器的一个简单应用

    SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中.SysTick是一个24bit的向下递减的计数器,每计数一次的时间为1/SYSCLK(SYSCLK一 ...

  4. 4、SysTick定时器的理解

    参考文档<Cortex-M3权威指南(中文).pdf> 什么是systick? 手册解释: RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟. ...

  5. STM32的SysTick定时器记录一篇

    CSDN博客主页 ID : Eterlove 一笔一画,记录我的学习生活!站在巨人的肩上Standing on Shoulders of Giants! 该文章为原创,转载请注明出处和作者! 前言 我 ...

  6. 系统滴答及Systick定时器

    1. 概述 操作系统需要有一个系统的滴答来提供任务管理的时间依据,bcos中的任务延时及tasklet的定时都是依据系统滴答.系统滴答需要一个定时器来提供时间基准,几乎所有的CPU都会提供一个滴答定时 ...

  7. 【STM32】SysTick定时器

    00. 目录 文章目录 00. 目录 01. SysTick定时器概述 02. SysTick定时器寄存器描述 03. 相关函数实现 04. 延时函数实现 05. 应用示例 06. 附录 07. 声明 ...

  8. 单片机定时器精准定时_PIC单片机的定时器精准计时的计算

    关于PIC单片机的定时器精准计时的计算 在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断 ...

  9. STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...

最新文章

  1. Slackware中文帮助文档(前言)
  2. MATLAB实现牛顿插值的源程序
  3. 使用绘图API自定义组件
  4. 从 301 跳转,聊聊边缘规则的那些小妙用
  5. Android方法的概括,android中的Filter接口简介
  6. Linux学习 - awk使用
  7. 2017.10.7 弹飞绵羊 思考记录
  8. mysql的%rowtype_Oracle %TYPE 和 %ROWTYPE 使用
  9. 【体系结构】Oracle如何保证提交的数据不丢失
  10. 百度坐标转换GPS坐标
  11. 使用fastcgi_cache加速你的Nginx网站
  12. x1c更改语言系统后开机超慢,大明:电脑重装系统后一个月变慢?简单五步设置,解决卡慢问题...
  13. 2022.4.7网页一直在加载中,无提示
  14. 计算机boot进入u盘启动,深度u盘装系统进入boot设置教程
  15. WPS国际版添加中文包
  16. 公有云迁移,需要考虑的问题
  17. 选择婚庆公司的注意事项
  18. nodejs addon
  19. 杭电一学生还没毕业年薪已过百万,带十几人的研发团队
  20. 姑娘们 你们够漂亮 但是一定还不够美丽

热门文章

  1. 关于ios app发布的中间证书的要求--解决WWDR证书过期方案
  2. GitHub上值得关注的iOS开源项目
  3. WINCE的内存配置-config.bib文件的解析
  4. php安装libpng,php安装
  5. haproxy调度web案例
  6. 一个简单的freemark输入输出的案例(一)
  7. 实战CentOS系统部署Hadoop集群服务
  8. 异地备份同步校验脚本
  9. 操作系统杂谈 mac 和linux windows若干概念
  10. 《C和指针》读书笔记 第5章-操作符和表达式