Systick定时器几个简单的函数简介

发布者:范隆最新更新时间:2022-03-23 来源: eefocus关键字:Systick  定时器  函数 手机看文章 扫描二维码
随时随地手机看文章

Systick定时器

Systick定时器是什么?

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


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


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


SysTick的四个寄存器

image.png

寄存器对应的位

Systick时钟源选择函数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;  

  }  

}  

 

函数体的查找以及函数参数的确定

时钟中断设置函数SysTick_Config(uint32_t ticks)

补充说明:ul后缀表示什么?

UL表示无符号长整型。


Systick滴答时钟的时钟源简介

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

SysTick_Config(uint32_t ticks)的函数体

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)的工作原理

static __INLINE uint32_t SysTick_Config(uint32_t ticks)  

{   

  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 判断计数值是否超过MAX */  

                                                                 

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* 设置预定的计数值,以便从该数值开始倒数至0 */  

  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* 配置中断优先级 */  

  SysTick->VAL   = 0;                                          /* 初始值设置为零 */  

  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |   

                   SysTick_CTRL_TICKINT_Msk   |   

                   SysTick_CTRL_ENABLE_Msk;                    /* 使能中断请求(IRQ)和定时器timer */  

  return (0);                                                  /* 函数调用成功 */  

 


函数体中的预定义部分


#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */  

#define SysTick_CTRL_COUNTFLAG_Msk         (1ul << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */  

  

#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */  

#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */  

  

#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */  

#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */  

  

#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */  

#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */  

 


掩膜操作是什么?

掩膜操作听起来很高大上,其实就是遮掩其他位只对我们要操作的位进行相应的操作,比如:0x01101&A意味着将A的第2,5位进行置零操作,其他位不变。


延迟函数的使用

Delay_Init()函数的使用

函数体


void delay_init() // 去除了OS的相关内容  

{  

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //选择外部时钟  HCLK/8  

    fac_us=SystemCoreClock/8000000;             //为系统时钟的1/8    

    fac_ms=(u16)fac_us*1000;                    //非OS下,代表每个ms需要的systick时钟数     

            


函数功能


① 配置外部时钟源;


② 按照系统时钟源的大小配置systick滴答定时器时钟源


#ifdef SYSCLK_FREQ_HSE  

  uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */  

#elif defined SYSCLK_FREQ_24MHz  

  uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */  

#elif defined SYSCLK_FREQ_36MHz  

  uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */  

#elif defined SYSCLK_FREQ_48MHz  

  uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */  

#elif defined SYSCLK_FREQ_56MHz  

  uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */  

#elif defined SYSCLK_FREQ_72MHz  

  uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */  

#else /*!< HSI Selected as System Clock source */  

  uint32_t SystemCoreClock         = HSI_VALUE;        /*!< System Clock Frequency (Core Clock) */  

#endif  


 


③ 计算毫秒/微秒的延迟因子。


Delay_ms函数的使用

void delay_us(u32 nus) // 非OS的delay函数的调用  

{         

    u32 temp;              

    SysTick->LOAD=nus*fac_us;                    //时间加载             

    SysTick->VAL=0x00;                           //清空计数器  

    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //使能systcik滴答定时器        

    do  

    {  

        temp=SysTick->CTRL;  

    }while((temp&0x01)&&!(temp&(1<<16)));     //等待直达条件不成立     

    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器  

    SysTick->VAL =0X00;                           //清空计数器       

}  

// systick滴答定时器退出循环的标志:systick滴答定时器被使能+计数器自减至0  

 


Delay_us函数的使用

使用原理如上“Delay_ms函数的使用”。

关键字:Systick  定时器  函数 引用地址:Systick定时器几个简单的函数简介

上一篇:调试端口重映射为IO口
下一篇:STM32时钟系统简介

推荐阅读最新更新时间:2024-11-05 10:56

STM32 V3.5固件库下SysTick的使用
SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的 滴答 中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统 心跳 的节律。 Cortex-M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的
[单片机]
STM32---系统滴答定时器systick)应用
利用stm32的系统滴答滴来获取系统的时间基准,以此应用到接收串口数据的超时退出。具体如下: current_sys_time = SysTick- VAL;(获取当前时间基准)。 while (com_available(&rx_buffer1) 1) { //超时退出接收串口数据 if((SysTick- VAL - current_sys_time) Delay) { return TRUE; // } } 以下转自:http://blog.csdn.net/yx_l128125/article/details/7884423 1.systick介绍
[单片机]
STM32---系统滴答<font color='red'>定时器</font>(<font color='red'>systick</font>)应用
STM32G0实战—定时器PWM应用
源于其宽泛的应用领域,使得STM32G0产品能被普遍选用。此外,它使用单一架构,因此易于使用和管理,并且还提供一些高级特性,例如STM32G0的定时器可以用于电机控制和数字电源,下图是STM32G0中使用的定时器的信息汇总。 如图所示,STM32G0提供多种定时器,其中有一些是高级定时器,例如定时器1,有一些是通用定时器,例如定时器2、3、14、15、16和17,还有一些是基础定时器,例如定时器6和7。 关于定时器,定时器1和15的计时频率最高可达128MHz,这样可以提供更高的分辨率,低于8ns,比如可以用于降压转换器,除了更精细的分辨率,还可以实现更低的频率步进。对于定时器1,由于它有三个互补输出,因此可以用于同步整流
[单片机]
关于51单片机中C语言编写的精确延时函数
有些特殊的应用会用到比较精确的延时(比如DS18B20等),而C不像汇编,延时精准度不好算。本人经过反复调试,对照KEIL编译后的汇编源文件,得出了以下几条精确延时的语句(绝对精确!本人已通过实际测试),今天贴上来,希望对需要的朋友有所帮助 sbit LED = P1^0; // 定义一个管脚(延时测试用) unsigned int i = 3; // 注意i,j的数据类型, unsigned char j = 3; // 不同的数据类型延时有很大不同 //-----------------各种精确延时语句----------------------------------- while( (i--)!=1 ); //
[单片机]
函数信号发生器的设计与实现
1. 前言 在人们认识自然、改造自然的过程中,经常需要对各种各样的电子信号进行测量,因而如何根据被测量电子信号的不同特征和测量要求,灵活、快速地选用不同特征的信号源,就成了现代测量技术值得深入研究的课题。信号源主要给被测电路提供所需要的已知信号(各种波形),然后人们用其它仪表测量感兴趣的参数。信号源在各种实验应用和实验测试处理中,不是测量仪器,而是根据使用者的需求,作为激励源,仿真各种测试信号,提供给被测电路,以满足测量或各种实际需要。 函数信号发生器就是信号源的一种,能够给被测电路提供所需要的波形。传统的波形发生器多采用模拟电子技术,由分立元件或模拟集成电路构成,其电路结构复杂,不能根据实际需要灵活扩展。随着微电子技术的发展
[测试测量]
<font color='red'>函数</font>信号发生器的设计与实现
ARM学习之定时器Timer0实验
/* Project: Timer0实验 Writer: SHOW Time: 2011/10/16 Hareware: 硬件平台:mini2440 , J-link. Function: 通过定时器0实现LED1以1s的时间间隔闪烁。 Direction:这个实验主要设计的知识是定时器与定时器时钟源的设置,整个实验思路如下: 1.设置定时器时钟源PCLK大小。 2.设置定时器定时频率大小。 3.定时时间到进入中断服务函数,让lED1闪烁。 参考代码:国嵌ARM精讲第三天演示程序,JustDo的CLK实验。 参考书籍:韦东山《嵌入式linux应用开发完全手册P166。s3c24
[单片机]
仅用一台虚拟仪器在LabView中创建扫频正弦函数
  当您需要在很宽的频率范围测试某种产品时,扫频正弦波很有用。例如某个大型研究项目需要确定波浪在远洋的传播方式,则该应用需要生成扫频正弦波,以便驱动声波换能器。虽然许多波形发生器都有内置的函数来满足这一要求,但您如果希望用多功能数据采集卡来实现正弦扫频的话,就必须亲自对它编程。仅凭一台 虚拟仪器 (VI),您就能在National Instruments公司的LabView中创建扫频正弦函数。利用该函数,可以控制起始频率和终止频率、采样率,以及扫频的总时长(图1)。 图1 仅用一台LabView虚拟仪器,您就能控制起始频率、终止频率、采样率,以及扫频总时长。   LabView软件对某个数组执行计算,该数组代表了频率增
[测试测量]
仅用一台虚拟仪器在LabView中创建扫频正弦<font color='red'>函数</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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