Systick滴答定时器-延时函数

发布者:sigma28最新更新时间:2018-12-01 来源: eefocus关键字:Systick  滴答定时器  延时函数 手机看文章 扫描二维码
随时随地手机看文章

1、参考资料


      《STM32F1开发指南-库函数版本》-5.1小节 delay文件夹介绍


       《Cortex-M3权威指南-中文》-第8章最后一个小节:Systick定时器


2、Systick定时器

    

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。

        

Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。


        比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

        

        Systick定时器就是系统滴答定时器,一个24?位的倒计数定时器,计到0?时,将从RELOAD?寄存器中自动重装载定时初值。


        只要不把它在SysTick?控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。


        SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。


        Systick中断的优先级也可以设置。


3、Systick相关寄存器


    CTRL  SysTick控制和状态寄存器 LOAD 


    SysTick自动重装载除值寄存器


    VAL   SysTick当前值寄存器 CALIB 


    SysTick校准值寄存器


4、Systick控制和状态寄存器-CTRL


    

对于STM32,外部时钟是HCLK(AHB总线时钟)的1/8内核时钟是HCLK时钟

   

配置函数: SysTick_CLKSourceConfig();

   

5、SysTick重装载数值寄存器-LOAD



6、SysTick当前值寄存器-VAL



7、Systick库函数

     ·固件库中的Systick相关函数

         SysTick_CLKSourceConfig()      //Systick时钟源选择  misc.c文件中

         SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断

                                        //core_cm3.h/core_cm4.h文件中


8、Systick中断服务函数

     void SysTick_Handler(void);


9、SysTick_CLKSourceConfig函数:

      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;

              }

            }


10、SysTick_CLKSourceConfig函数:

      static __INLINE uint32_t SysTick_Config(uint32_t ticks)

            { 

              if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);         /* Reload value impossible */

               

             /* set reload register */                                                            

              SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; 

            /* set Priority for Cortex-M0 System Interrupts */

              NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 

              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 */

            }


10、用中断的方式实现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

                 … 

                 }

            }


11、Cortex-M系统中,Systick代码可以通用。

    

如果使用中发现延时不一致,问题一般都是因为不同内核时钟不一样而已。修改ticks值即可。

关键字:Systick  滴答定时器  延时函数 引用地址:Systick滴答定时器-延时函数

上一篇:STM32F407学习笔记——Systick中断
下一篇:stm32在rt-thread上的SysTick(系统定时器)

推荐阅读最新更新时间:2024-03-16 16:19

stm32系统滴答定时器使用
1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给 操作系统 提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 只要不
[单片机]
stm32系统<font color='red'>滴答</font><font color='red'>定时器</font>使用
C51延时函数delay的编写
例如,要写一个延迟10ms的delay函数:(12M晶振) void delay_10ms() { unsigned char i,j,k; for(i=5;i 0;i--) { for(j=4;j 0;j--) { for(k=248;j 0;j--); } } } 原理:3层for循环,循环次数是 NUM = 4X5X248 = 4960次,由每次循环都有条件判断(如 i 0)和自减语句(如 i--),因此每次循环又耗费两个机器周期 所以,总耗费的机器周期为 SUM = NUM x 2 = 9920个 又因为 12M 晶振频率,
[单片机]
STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
STM32延时函数的三种方法:普通延时、SysTick 定时器延时(1.中断方式;2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 (1)普通延时法1 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。 //粗延时函数,微秒 void delay_us(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ;
[单片机]
STM32<font color='red'>延时</font><font color='red'>函数</font>的四种方法:普通<font color='red'>延时</font>(2种)、<font color='red'>SysTick</font> <font color='red'>定时器</font><font color='red'>延时</font>(2种)
NRF52840学习历程(六)RTC 实时计数器(滴答定时器)
开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器诸如STLINK,DAP不建议用) 版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0 参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图) nRF5_SDK_17.0.2_d674dde(官方例程) nRF5_SDK_17.0.0_offline_doc(官方文档) nRF52840_PS_v1.1.pdf(官方数据手册) RTC 实时计数器 32.768KH
[单片机]
NRF52840学习历程(六)RTC 实时计数器(<font color='red'>滴答</font><font color='red'>定时器</font>)
msp430学习之软件延时函数
#define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) CPU_F 为系统主时钟频率; delay_us();//微秒 delay_ms();//毫秒
[单片机]
STM32F407ZGT6用滴答定时器实现精确延时(寄存器版)
1.滴答定时器介绍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 滴答定时器是ARM公司设计架构是已经集成到内核中,也就是说只要采用ARM公司设计芯片滴答定时器是通用的,写好的滴答定时器在其他的采用ARM公司设计
[单片机]
嵌入式stm32学习:系统定时器
bsp_SysTick.h #ifndef __SYSTICK_H #define __SYSTICK_H #include stm32f4xx.h void SysTick_Init(void); //定义初始化函数 void Delay_us(__IO u32 nTime); //单位10us //#define Delay_ms(x) Delay_us(100*x) //可自由配置中断时间,当前中断时间为1ms #endif /* __SYSTICK_H */ bsp_SysTick.c /** *********************************************
[单片机]
浅谈STM32F10X芯片SysTick系统时钟定时器
如题,正文如下: 1、介绍 实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。 系统时钟及系统定时器时钟(详见手册) 2、寄存器描述 l SysTick控制及状态寄存器STK_CTRL l SysTick重装载数值寄存器STK_LOAD l SysTick当前数值寄存器STK_VAL l SysTick校准数值寄存器STK_CALIB 与SysTick相关的固件库函数有以下几个: l
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved