STM32知识:什么是SYSTICK 作用是什么

2020-02-12来源: elecfans关键字:STM32  SYSTICK  系统节拍定时器

什么是SYSTICK:

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


作用:

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


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


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


SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。


要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。


时钟的选择:

用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运行。


3.5版本的库函数与以往的有所区别

不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32 reload);SysTick_ITConfig(FunctionalState NewState);等

在3.5版本的库函数中与systick相关的函数只有两个

第一个,SysTick_Config(uint32_t ticks),在core_cm3.h头文件中进行定义的。

第二个,void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),在misc.c文件中定义的。


SysTick_Config(uint32_t ticks),在core_cm3.h

主要的作用:

1、初始化systick

2、打开systick

3、打开systick的中断并设置优先级

4、返回一个0代表成功或1代表失败


注意:

Uint32_t ticks  即为重装值,

这个函数默认使用的时钟源是AHB,即不分频。

要想分频,调用void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),

但是要注意函数调用的次序,先SysTick_Config(uint32_t ticks),

后SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)


函数说明:

/**

* @brief  Initialize and start the SysTick counter and its interrupt.

*

* @param   ticks   number of ticks between two interrupts

* @return  1 = failed, 0 = successful

*

* Initialise the system tick timer and its interrupt and start the

* system tick timer / counter in free running mode to generate

* periodical interrupts.

*/

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

{

if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            

/* Reload value impossible */重装载值必须小于0XFF FFFF,为什么,这是一个24位的递减计数器。

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

/* set reload register */设置重装载值,SysTick_LOAD_RELOAD_Msk定义见后面

NVIC_SetPriority (SysTick_IRQn, (1CTRL  = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk   |

SysTick_CTRL_ENABLE_Msk;                  

/* Enable SysTick IRQ and SysTick Timer */

return (0);

/* Function successful */

}

#endif

与systick相关的寄存器定义

/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick

memory mapped structure for SysTick

@{

*/

typedef struct

{

__IO uint32_t CTRL; /*!< Offset: 0x00  SysTick Control and Status Register */

__IO uint32_t LOAD; /*!< Offset: 0x04  SysTick Reload Value Register       */

__IO uint32_t VAL; /*!< Offset: 0x08  SysTick Current Value Register      */

__I  uint32_t CALIB; /*!< Offset: 0x0C  SysTick Calibration Register        */

} SysTick_Type;

与systick寄存器相关的寄存器及位的宏定义

/* SysTick Control / Status Register Definitions */控制/状态寄存器

#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 */时钟源选择位,0=外部时钟;1=内核时钟

#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 */使能位

/* SysTick Reload Register Definitions */

#define SysTick_LOAD_RELOAD_Pos 0 /*!《 SysTick LOAD: RELOAD Position */

#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul 《《 SysTick_LOAD_RELOAD_Pos)

/*!《 SysTick LOAD: RELOAD Mask */

/* SysTick Current Register Definitions */

#define SysTick_VAL_CURRENT_Pos 0 /*!《 SysTick VAL: CURRENT Position */

#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul 《《 SysTick_VAL_CURRENT_Pos)

/*!《 SysTick VAL: CURRENT Mask */

/* SysTick Calibration Register Definitions */

#define SysTick_CALIB_NOREF_Pos 31 /*!《 SysTick CALIB: NOREF Position */

#define SysTick_CALIB_NOREF_Msk (1ul 《《 SysTick_CALIB_NOREF_Pos)

/*!《 SysTick CALIB: NOREF Mask */

#define SysTick_CALIB_SKEW_Pos 30 /*!《 SysTick CALIB: SKEW Position */

#define SysTick_CALIB_SKEW_Msk (1ul 《《 SysTick_CALIB_SKEW_Pos)

/*!《 SysTick CALIB: SKEW Mask */

#define SysTick_CALIB_TENMS_Pos 0 /*!《 SysTick CALIB: TENMS Position */

#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul 《《 SysTick_VAL_CURRENT_Pos) /*!《 SysTick CALIB: TENMS Mask */

/*@}*/ /* end of group CMSIS_CM3_SysTick */

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)


作用:

选择systick的时钟源,AHB时钟或AHB的8分频

库函数中默认使用的是AHB时钟(在SysTick_Config()函数中设置),即72MHz

函数说明:

/**

* @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;

}

}

Systick时钟源的定义:

/** @defgroup SysTick_clock_source

* @{

*/

#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)//将控制状态寄存器的第二位置0,即用外部时钟源

#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)//将控制状态寄存器的第二位置1,即用内核时钟

#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) ||

((SOURCE) == SysTick_CLKSource_HCLK_Div8))

与systick相关的寄存器的说明

SysTick寄存器说明在《Cortex-M3权威指南》(chap8.SysTick定时器章节)有说明

STM32知识:什么是SYSTICK 作用是什么

Systick使用实践

Systick定时时间的设定:

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

如果时钟频率为:AHB的8分频;AHB=72MHz那么systick的时钟频率为72/8MHz=9MHz

若要定时1秒,则重装载值=9000000X1=9000000,调用函数:SysTick_Config(9000000X1);

若要定时1毫秒,重状态值=9000000X0.001=90000,调用函数:SysTick_Config(9000000/1000);

Systick的中断处理函数

在startup_stm32f10x_hd.s启动文件中有定义。

DCD SysTick_Handler ; SysTick Handler

根据需要直接编写中断处理函数即可:

Void SysTick_Handler (void)

{ ;}

注意:

如果在工程中,加入了stm32f10x_it.c,而又在主函数中编写中断函数,则会报错。

STM32知识:什么是SYSTICK 作用是什么

因为在stm32f10x_it.c文件中,也有这个中断函数的声明,只是内容是空的。

/**

* @brief This function handles SysTick Handler.

* @param None

* @retval None

*/

void SysTick_Handler(void)

{

}

中断优先级的修改

在调用SysTick_Config(uint32_t ticks)之后,调用 void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)。这个函数在core_cm3.h头文件中。

具体内容如下:

/**

* @brief Set the priority for an interrupt

*

* @param IRQn The number of the interrupt for set priority

* @param priority The priority to set

*

* Set the priority for the specified interrupt. The interrupt

* number can be positive to specify an external (device specific)

* interrupt, or negative to specify an internal (core) interrupt.

*

* Note: The priority cannot be set for every core interrupt.

*/

static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

{

if(IRQn 《 0) {

SCB-》SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority 《《 (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */

else {

NVIC-》IP[(u

[1] [2]
关键字:STM32  SYSTICK  系统节拍定时器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487932.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32之.hex 文件
下一篇:STM32之FSMC驱动LCD屏应用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S库文件判断指定IO输入引脚电平GPIO_ReadInputPin有问题
/**  * @brief  Reads the specified GPIO input data pin.  * @param  GPIOx : Select the GPIO peripheral number (x = A to I).  * @param  GPIO_Pin : Specifies the pin number.  * @retval BitStatus : GPIO input pin status.  */BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_Ty
发表于 2020-02-08
STM8 GPIO输入输出模式
悬浮输入悬浮输入,也叫浮空输入,顾名思义,即引脚悬空。这种方式的输入阻抗很高。当悬浮输入的引脚上加上信号时,单片机所得到的信号并不确定是高电平或是低电平,是一个不确定的信号。悬浮输入的典型应用就是模数转换,外部的任何一个小信号都要经过A/D采样转换为数字信号。上拉输入上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!强弱只是上拉电阻的阻值不同。上拉输入最典型的应用就是外部按键,当按键未按下时,我们要保证它是高电平,当按键按下时才被拉低。推挽输出推挽输出(Push-pull output),也称为互补输出,推拉式输出。推挽输出模式导通损耗小,效率高。在此模式下,N-MOS、P-MO
发表于 2020-02-08
STM8 GPIO输入输出模式
STM8L的USART1串口通信详解 含例程
STM8L除了可以进行串口通信,还可支持红外通信,智能卡协议,这些功能后续会开发,发布程序源码。STM8L还可以使用DMA缓存数据,减少CPU负担,为了简单起见,本文没有用到DMA功能。只需要简单的配置发送的字长度,停止位数,波特率,打开发送接收,就可以进行串口数据收发。下图为串口发送数据流程。对于串口发送数据,需要注意的是,打开发送后,数据发送完成,如果不关闭中断,程序会一直进入中断。所以在确保数据发送完成后,需关闭中断,退出发送数据。本文通过周期性(500ms)的向上位机发送一组数据,来演示STM8L的串口通信。串口接收部分程序也已经调试好,只需把while循环中的程序注释掉,设置断点,查看上位机发送来的数据即可
发表于 2020-02-08
使用STM8S105K4T6C 模数转换器的12通道
分享今天遇到的一个stm8s模数转换的小问题~~~这款单片机一共提供了7个模数转换通道,他们分别是AIN0-AIN5和AIN12。stm8s105k4t6c的管脚图其中AIN0-AIN5的配置和使用方法如下,配置为连续转换、扫描模式(代码写的不好,大神请见谅~):[mw_shl_code=c,true]/*---------------------------------包含头文件---------------------------------*/#include "adc.h" #define        ADC     
发表于 2020-02-08
stm8——LED流水灯实现
最近接触并学习了一款STM8系列的芯片。以前学习了的ARM9+Linux后,再来学习单片机就感到上手很快了。 芯片基本信息:Type:STM8L151G68-bit ultralow power MCU, up to 32 KB Flash, 1 KB Data EEPROM RTC, LCD, timers, USART, I2C, SPI, ADC, DAC, comparators具体可以查看datasheet:http://pdf-file.ic37.com/pdf4/STMICROELECTRONICS
发表于 2020-02-08
MCU程序设计之STM8S的optionbytes
今天使用STM8S在程序中修改optionbyte遇到问题一直读取为0,不能进入设置流程,之前的程序今天重新修改东西,使用新的片子,原来程序如下:  AFR_TEMP = (uint16_t)((uint16_t)0x01 << 8);  AFR_TEMP = AFR_TEMP | (uint16_t)0xFE;  AFR_TEMP = (AFR_TEMP >> 8);之所以直接赋值而不调用函数,是因为程序代码空间有限,使用函数调用方法修改没有问题,如下:  AFR_TEMP = FLASH_ReadOptionByte(0X4803);  AFR_TEMP
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

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

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