STM32—SysTick使用方法

发布者:bluepion最新更新时间:2018-12-24 来源: eefocus关键字:STM32  SysTick  使用方法 手机看文章 扫描二维码
随时随地手机看文章

一、STM32的SysTick简介

 

  SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。


systick的作用:

  

在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS).


  因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。


  微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。


    SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。


systick的时钟选择:



二、SYSTICK的寄存器


三、SYSTICK的配置和函数解析


SysTick定时器的使用主要有HAL_SYSTICK_Config()函数和HAL_SYSTICK_CLKSourceConfig()函数。如下,


    /**Configure the Systick interrupt time 

    */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);// 设置定时时间

 

    /**Configure the Systick 

    */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//选择SYSTICK时钟源,

  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);//设定优先级


 

Systick定时时间的设定:


重装载值=systick 时钟频率(Hz)X想要的定时时间(S)


如:时钟频率为:AHB的8分频;AHB=72MHz那么systick的时钟频率为72/8MHz=9MHz;要定时1秒,则


重装载值=9000000X1=9000000;


定时10毫秒


重状态值=9000000X0.01=90000


//两个时钟源的定义

#define SYSTICK_CLKSOURCE_HCLK_DIV8    (0x00000000U)

#define SYSTICK_CLKSOURCE_HCLK         (0x00000004U)

uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)

{

   return SysTick_Config(TicksNumb);

}

  \brief   System Tick Configuration

  \details 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.//返回0,配置成功

  \return          1  Function failed.//返回1,失败

  \note    When the variable __Vendor_SysTickConfig is set to 1, then the

           function SysTick_Config is not included. In this case, the file device.h

           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)//超过最大定时值,返回1,SysTick_LOAD_RELOAD_Msk值为2的24方-1;即0xFFFFFF

 

  {

    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;    //SysTick Current Value Register,设为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 (0UL);                                                     /* Function successful */

}

SYSTICK内部寄存器的结构体定义,和上面图中的寄存器一一对应。


typedef struct

{

  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */

  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */

  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */

  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */

} SysTick_Type;

SysTick定时器的时钟源选择函数如下:


void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)

{

  /* Check the parameters */

  assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource));

  if (CLKSource == SYSTICK_CLKSOURCE_HCLK)

  {

    SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;//见上面的宏定义,(0x00000004U),即把CLKSOURCE控制寄存器位置1;

  }

  else

  {

    SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK;//把CLKSOURCE控制寄存器位置0;

 

  }

}

systick定时器的处理函数为空,并未执行任何动作,如下:


void SysTick_Handler(void)

{

  /* USER CODE BEGIN SysTick_IRQn 0 */

 

  /* USER CODE END SysTick_IRQn 0 */

  HAL_IncTick();

  HAL_SYSTICK_IRQHandler();

  /* USER CODE BEGIN SysTick_IRQn 1 */


  /* USER CODE END SysTick_IRQn 1 */

}

void HAL_SYSTICK_IRQHandler(void)

{

  HAL_SYSTICK_Callback();

}

 


__weak void HAL_SYSTICK_Callback(void)

{

  /* NOTE : This function Should not be modified, when the callback is needed,

            the HAL_SYSTICK_Callback could be implemented in the user file

   */

}


注意:当主芯片需使用SLEEP模式时,SYSTICK的异常请求会唤醒SLEEP模式,进入SLEEP模式前需要把TICKINT控制器置为0。



HAL_SuspendTick();//把TICKINT控制寄存器置0;

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);

HAL_ResumeTick();//把TICKINT控制寄存器置1;

__weak void HAL_SuspendTick(void)

{

  /* Disable SysTick Interrupt */

  CLEAR_BIT(SysTick->CTRL,SysTick_CTRL_TICKINT_Msk);//置0

}

__weak void HAL_ResumeTick(void)

{

  /* Enable SysTick Interrupt */

  SET_BIT(SysTick->CTRL,SysTick_CTRL_TICKINT_Msk);//置1

}


关键字:STM32  SysTick  使用方法 引用地址:STM32—SysTick使用方法

上一篇:STM32的系统滴答定时器(Systick)
下一篇:SysTick功能总结

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

STM32工具安装和工程模板的建立
简介:在安装软件和新建工程这个过程中可能会出现各种问题,最好的办法就是百度,说实话,刚开始没有接触STM32,从软件下载到安装再到工程模板的建立我也弄了一天!要有耐心慢慢来!就会发现其实就那么回事! 一、工具安装 1.J-Link驱动的安装下载地址 2. KEIL MDK的安装这个版本更新很快,我用的是4.7版本的,现在5.0版本的都出来,所以可以自己百度去下载,很多地方都能下载到 3.成功安装好J-Link,同时插上J-link下载线后能在我的电脑设备管理器中看到J-Link Driver 4.由于安装大同小异,这里不再赘述。 二、工程模板的建立 准备工作 1.下载ST官方库,我这里是用的3.5版
[单片机]
<font color='red'>STM32</font>工具安装和工程模板的建立
STM32滴答时钟源的问题
#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)24000000U) /*! Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ HSE_VALUE 值的大小决定了,时钟滴答的周期。 这个值的设置不会影响主频的时钟周期以及相关timer的变化。 __weak uint32_t HAL_RCC_GetSysClockFreq(void) { uint32_t pllm = 0U, pllvco = 0U, pllp = 0U; uint32_t sysclockfreq = 0U
[单片机]
STM32的几个注意事项
1、每组 VDD、VSS 管脚间并一个 100nF 电容,距离管脚越近越好;VDD3 需要加并一个 4.7 F 电容。 2、VDDA、VSSA 之间并一个 10nF 电容 加 1 F 电容;VREF 间使用同样方式。 3、在上电和正常操作期间,VDD和VDDA之间最多允许有300mV的差别(3.3V出两路,一路供 VDD,另外一路过基准供 VDDA,只要电压差小于 300mV 就可以);VREF+ 最小值 2.4V,最大值 VDDA 4、关于复位:当VDD/VDDA低于指定的限位电压VPOR/VPDR时,系统保持为复位状态,无需外部复位电路。NRST 脚内部弱上拉(30~50k ),和 VDD(不是VDDA) 相连。建议的引脚保
[单片机]
stm32-led-串口-PWM
因为项目需要,学习了一下stm32的GPIO,串口,PWM,中断部分,在这里做个小结, 共同学习,所有程序均经过实际测试,输出正确。 将GPIO,串口,PWM(定时器)的配置程序粘贴如下 1、使能外设的时钟:APB1ENR,APB2ENR 2、配置寄存器或者说是控制寄存器。在配置stm32外设时,任何时候都要先使能该外设的时钟!而每个控制寄存器,很有可能包括了,1模式寄存器,2使能寄存器,3才可能是我们认为的数据寄存器或者内容寄存器。 3、使能外设。即使配置好了,没有使能外设,则外设永远不会工作,这一点比较容易遗忘。 寄存器配置,请查看 http://wenku.baidu.com/link?url=NE4
[单片机]
STM32 | 分享自定义协议的一些典型例子
上次分享的《分享一个很酷的上位机软件》中,有如下协议: 有位读者朋友问数据为什么要按这样的格式来发。其实这是个自定义协议,这是上位机开发者定义的一个数据交互协议。 我们下位机往伏特加上位机发送数据需要遵循这样的协议数据,才能保证上位机能正确识别这些数据。 关于自定义协议,对于会的人很简单,对于不会的人就摸不着头脑。下面分享一些关于自定义协议的笔记,希望能对初学者有帮助,也希望大神们能多多指出不足。 什么是协议? 协议这个概念我觉得挺杂的。就像嵌入式的概念一样,说法不一,比如大家常常争论FPGA是不是嵌入式、单片机是不是属于嵌入式等等。下面简单看一下嵌入式中协议这个概念。 在互联网领域,协议常常指的是网络协议。
[单片机]
<font color='red'>STM32</font> | 分享自定义协议的一些典型例子
STM32启动代码分析
启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析。启动代码作用一般是:1)堆和栈的初始化;2)向量表定义;3)地址重映射及中断向量表的转移;4)设置系统时钟频率;5)中断寄存器的初始化;6)进入C应用程序。 (1)按启动代码的次序,先看堆和栈的初始化: Stack_Size EQU 0x00000200 ;定义Stack_Size为0x00000200 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;定义栈,可初始为0,8字节对齐 Stack_Mem
[单片机]
南京天宇t-92数字万用表使用方法图解
这表定位入门级别,价格上很不错,随便用不心疼,而且还带了个所谓的“防烧表”功能,确实很适合新手,因为不怎么常用的朋友,想必手上也难找到多的熔断保险吧(好吧,当年菜鸟的我,都不会用万用表测电流)
[测试测量]
南京天宇t-92数字万用表<font color='red'>使用方法</font>图解
基于STM32实现串口的两个分案解析
首先总结一下串口232,422,485 串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V~-3V逻辑“1”,+3V~+15V逻辑“0”。 串口422:可双向传输,4线全双工,2线单工。 串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端:+2V~+6V逻辑“1”,-2V~-6V逻辑“0”,接收端:+200mV逻辑“1”,-200mV逻辑“0”。 对于串口的实现有以两个方案: 方案一,和原子的《例说STM32》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进
[单片机]
基于<font color='red'>STM32</font>实现串口的两个分案解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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