00. 目录

文章目录

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

01. SysTick定时器概述

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

02. SysTick定时器寄存器描述

SysTick控制及状态寄存器(地址:0xE000_E010)

SysTick重装载数值寄存器(地址:0xE000_E014)

SysTick当前数值寄存器(地址:0xE000_E018)

SysTick校准数值寄存器(地址:0xE000_E01C)

03. 相关函数实现

core_cm4.h文件

/** \brief  System Tick ConfigurationThe function initializes the System Timer and its interrupt, and starts the System Tick Timer.Counter is in free running mode to generate periodic interrupts.\param [in]  ticks  Number of ticks between two interrupts.\return          0  Function succeeded.\return          1  Function failed.\note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then thefunction <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>must contain a vendor-specific implementation of this function.*/
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); }    /* Reload value impossible */SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */SysTick->VAL   = 0UL;                                             /* 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 (0UL);                                                     /* Function successful */
}

misc.c文件

/*** @brief  Configures the SysTick clock source.* @param  SysTick_CLKSource: specifies the SysTick clock source.*   This parameter can be one of the following values:*     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.*     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.* @retval None*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{/* Check the parameters */assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));if (SysTick_CLKSource == SysTick_CLKSource_HCLK){SysTick->CTRL |= SysTick_CLKSource_HCLK;}else{SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;}
}

04. 延时函数实现

delay.h文件

#ifndef __DELAY_H
#define __DELAY_H
#include <sys.h>    void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);#endif

delay.c文件

static u8  fac_us=0;                            //us延时倍乘数
static u16 fac_ms=0;                           //ms延时倍乘数,在os下,代表每个节拍的ms数//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(u8 SYSCLK)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8;                        //不论是否使用OS,fac_us都需要使用fac_ms=(u16)fac_us*1000;             //非OS下,代表每个ms需要的systick时钟数
}       //延时nus
//nus为要延时的us数.
//注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
void delay_us(u32 nus)
{       u32 temp;            SysTick->LOAD=nus*fac_us;              //时间加载           SysTick->VAL=0x00;                     //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数   do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));  //等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00;                      //清空计数器
}//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对168M条件下,nms<=798ms
void delay_xms(u16 nms)
{                 u32 temp;        SysTick->LOAD=(u32)nms*fac_ms;           //时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00;                       //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));   //等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器SysTick->VAL =0X00;                    //清空计数器
} //延时nms
//nms:0~65535
void delay_ms(u16 nms)
{        u8 repeat=nms/540;                        //这里用540,是考虑到某些客户可能超频使用,//比如超频到248M的时候,delay_xms最大只能延时541ms左右了u16 remain=nms%540;while(repeat){delay_xms(540);repeat--;}if(remain)delay_xms(remain);
}

05. 应用示例

用中断的方式实现delay延时

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{ TimingDelay = nTime;while(TimingDelay != 0);
}
void SysTick_Handler(void)
{if (TimingDelay != 0x00) { TimingDelay--;}
}int main(void){  …if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms{while (1);}while(1){ Delay(200);//2ms… }
}

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 声明

该教程参考了正点原子的《STM32 F4 开发指南》

【STM32】SysTick定时器相关推荐

  1. stm32 systick定时器

    systick定时器是系统滴答定时器,一个24位的倒计时定时器,计到0时,将从RELOAD寄存器中自动装载定时初值,只要不把它在Systick控制及状态寄存器中的使能位清楚,就永不停息,即使在睡眠状态 ...

  2. STM32——SysTick 定时器讲解(代码)

    一.SysTick-系统定时器简介 SysTick-系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中.系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK, ...

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

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

  4. STM32开发 -- Systick定时器

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81630311 一.Systick定时器介绍 参看:STM32菜鸟成长记录-系 ...

  5. STM32系统定时器SysTick(只能向下递减)延时闪烁灯

    参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...

  6. STM32学习及应用笔记一:SysTick定时器学习及应用

     这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick ...

  7. STM32系统定时器SysTick

    1. SysTick系统定时器概述 学习完STM32的中断,下来就要学习STM32的定时器.就像电话最基本的功能是与人通话一样,定时器最基本的功能就是定时(STM32有些定时器的功能强大得超乎想象,当 ...

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

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

  9. STM32 SysTick 滴答定时器原理及应用

    SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟. 无论用作延时还是用 ...

最新文章

  1. 正则表达式实现最小匹配
  2. 《大规模web服务开发技术》阅读笔记
  3. WWW 2021最佳论文亚军:基于属性补全的异质图神经网络新架构
  4. JEPaas代码_((列表,表单)刷新列表||刷新表单数据
  5. mysql binlog oplog_mongodb 学习之oplog
  6. VS IIS Express 支持局域网访问
  7. lua qt 编译_Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境
  8. 《玩转D语言系列》一、通过四个版本的 Hello Word 初识D语言
  9. SAP License:电子行业ERP实施
  10. Bootstrap简洁、直观、强悍的前端开发框架
  11. 力扣-222. 完全二叉树的节点个数
  12. 17. Django进阶:缓存
  13. Intel BIGDL 探索
  14. DenseNet训练CIFAR10数据集的pytorch实现
  15. 基本概念学习(8006)--南桥芯片
  16. Mybatis-plus 之sql注入器
  17. Prioritizing Web Usability
  18. js html url编码,js URLdecode()与urlencode方法支持中文解码
  19. linux服务器被挖矿的解决办法
  20. Unity 仿 了不起修仙模拟器画符

热门文章

  1. python copy函数用法_Python深浅拷贝
  2. python列表索引超出范围 等于啥_python中的“列表索引超出范围”
  3. matlab and操作,系统建模 | Control Tutorials for Matlab and Simulink
  4. java list加入listview_Android ListView自动生成列表条目的实例
  5. php 当前路径函数,PHP解析目录路径的3个函数总结
  6. linux下ifconfig命令看不到IP centos7——ens33
  7. 关于可迭代对象、迭代器和生成器
  8. BZOJ3473: 字符串【后缀数组+思维】
  9. Python 动态载入模块
  10. solaris 源代码