一文详解STM32的嘀嗒时钟(SysTick)

发布者:温馨阳光最新更新时间:2024-03-12 来源: elecfans关键字:STM32  SysTick 手机看文章 扫描二维码
随时随地手机看文章

简要说明

1概述

嘀嗒时钟(SysTick)是一个简单的系统时钟节拍计数器,它属于Cortex-M4内核嵌套向量中断控制器(NVIC)里的一个功能单元。他是一个24位的倒计时定时器(在NVIC中),当systick计数值到0的时候,SysTick重装载寄存器就会自动重新装载初值。只要SysTick控制和状态寄存器(CTRL)中的使能位没有ENABLE清除掉,那么就会永远的执行下去。


SysTick定时器被捆绑在NVIC中,可产生SysTick异常(异常号:15),属于Cortex-M4内核里的一个功能单元。

SysTick常作为系统节拍定时器用于操作系统(如mCOS-Ⅱ、FreeRTOS等)的系统节拍定时,从而推动任务和时间的管理。

SysTick的最大使命,就是作为系统的时基定期地产生异常请求。

在不采用操作系统的情况下,完全可以作为通用定时器、计数器使用的。

下图是SysTick控制控制和状态寄存器描述,(地址:0xe000e010)

SysTick 控制及状态寄存器:

截图20230109091048.png

SysTick 寄存器:

截图20230109091048.png

SysTick 重装载数值寄存器:地址 0XE000E014

截图20230109091048.png

特别注意:计数最大值是)0XFFFFFF,在设置重装在值得时候不能大于这个。

SYSTick当前数值寄存器(VAL),地址:0XE000E018

截图20230109091048.png

毕业寄语:

毕业,是一首离别的歌,更是青年成长的里程碑。四年的时光一千多日夜就这样瞬息即过,但它却是你们的瑰丽人生中最浓丽的一抹色彩!如一条条的小溪汇成了一条多彩的河流。你们成了校园里最靓丽的一道风景。

SYSTick校准数值寄存器(VAL),地址:0XE000E018

截图20230109091048.png

配置SysTick作为时钟基准,主要通过对SysTick控制与状态寄存器、SysTick重装载数值寄存器和SysTick当前数值寄存器三个寄存器进行初始化。需要配置的内容如下:

① SysTick时钟源选择。

② 异常请求设置。

③ SysTick时钟使能。

④ 初始化SysTick重装数值。

⑤ 清零SysTick当前数值寄存器。


库函数

SysTick的库函数


1、SysTick寄存器结构体类型


/** \brief Structure type to access the System Timer (SysTick).


*/


typedef struct

{

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

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

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

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

} SysTick_Type;

2、SysTick时钟源初始化函数


/**


@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_CLKSourceConfig函数被定义在misc.c文件中,配置的是SysTick控制与状态寄存器中的位2。


设置为0:选择使用HCLK/8作为时钟源。


设置为1:选择使用HCLK作为时钟源。


在实际使用的过程中参数宏在misc.h文件里面。


#define SysTick_CLKSource_HCLK_Div8((uint32_t)0xFFFFFFFB)

#define SysTick_CLKSource_HCLK  ((uint32_t)0x00000004)

3、SysTick配置函数


__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

{

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





  SysTick->LOAD  = ticks - 1;                                  /* set reload register */

  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */

  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函数被定义在core_cm3.h文件中,它的功能是初始化并开启SysTick计数器及其中断,输入参数ticks是两次中断间的ticks数值。通过次函数可以初始化系统嘀嗒定时器及其中断并开启系统嘀嗒定时器在自由运行模式下以产生周期中断。


SysTick异常服务函数


void SysTick_Handler(void)


SysTick_Handler的服务函数已在启动文件中定义过,并定义了[WEAK]属性,函数内执行的是空循环。


这就要求用户在使用SysTick异常服务时,需要在启动文件之外的其他文件重新定义服务程序,并且其函数名要和启动文件中的函数名保持一致,只有这样才能在编译阶段,将重定义的服务程序函数入口地址替换到SysTick在异常/中断向量表的位置。


应用小栗子

01应用实例


使用SysTick产生1s的定时,控制LED灯以2s为周期进行闪烁。


假设HCLK=180MHz。


在system_stm32f4xx.c文件中定义了全局变量uint32_t SystemCoreClock=180000000,并在头文件system_stm32f4xx.c->stm32f4xx.h中声明。


1-配置SysTick


按照1ms进行分片,配置程序如下:


SysTick_Config(SystemCoreClock/1000);

这样,SysTick会每1ms产生一次异常请求。全局变量定义:


volatile   uint32_tTimingDelay;

volatile防止变量TimingDelay在使用过程中被优化


2-写延时函数


编写以1ms为计时基准的函数:


void delay_ms(uint32_t nTime)

TimingDelay=nTime;

while(TimingDelay!=0);

}

其中,nTime是需要计时的ms数。


3-写中断服务函数


每1ms SysTick都会产生一次异常请求,执行其异常服务程序SysTick_Handler。对SysTick异常服务程序进行编写,每1ms对变量TimingDelay减1次。


void SysTick_Handler(void)

{

  if (TimingDelay!=0)

TimingDelay--;

}

}

4-应用


int main(void)

{

/*配置SysTick为每1ms异常一次*/

if (SysTick_Config(SystemCoreClock/1000))

/*SystemCoreClock/1000超出计数最大值时报错,程序陷入空循环*/ 

while (1);

}

/*初始化LED灯的GPIO*/

LED_Config ();

while (1)

{

/*反转LED灯状态*/

LED_TOGGLE;

/*延时1s*/

delay_ms (1000);

}


关键字:STM32  SysTick 引用地址:一文详解STM32的嘀嗒时钟(SysTick)

上一篇:STM32常见的串行通信接口
下一篇:学习单片机和STM32的一道坎

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

STM32八种IO口模式区别
STM32八种IO口模式区别 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 以下是详细讲解 (1)GPIO_Mode_AIN 模拟输入 即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻) (2)GPIO_Mode_IN_FLOATING 浮空输入 浮空输入状态下,IO
[单片机]
STM32系列第14篇--TFTLCD驱动原理
ALINETEK2.8寸 TFTLCD模块特点 240*320分辨率 16位真彩显示(65536色) 自带电阻触摸屏 自带背光电路 注意:模块是3.3V供电的,不支持5V电压的MCU,如果是5VMCU,必须在信号线串接120R电阻使用。 ALINETEK2.8寸 TFTLCD接口说明(16位80并口) LCD_CS:LCD片选信号 LCD_WR:LCD写信号 LCD_RD:LCD读信号 DB :16位双向数据线。 LCD_RST:硬复位LCD信号 LCD_RS:命令/数据标志(0:命令,1:数据) BL_CTR:背光控制信号 T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸
[单片机]
<font color='red'>STM32</font>系列第14篇--TFTLCD驱动原理
STM32+MS5611测气压温度例程详解,测试无误
硬件平台:STM32F10X + MS5611 + JLink 软件平台:Keil 4 一、基础知识 首先,MS5611是什么? MS5611气压传感器是集合SPI和I²C(高达20 MHz)总线接口的高分辨率气压传感器,分辨率可达到10cm。内部有一个高线性度的 压力传感器 和一个超低功耗的24位AD。 MS5611主要用于智能手机、海拔高度测量和导航辅助,做四轴的朋友一般都了解。 其次,对于飞行器的姿态控制,我们使用GY-86 10DOF 的模块,里面带有MS5611 + MPU6050 + HMC5883,通过IIC协议读取数据进行操作。MS5611挂在MPU5060的从I2C接口上。MS5611的I2C地址为0b111
[单片机]
STM32小白入门(第十天)-------看门狗watchdog
记得刚开始面试的时候,被面试官问了一个问题:stm32这个项目如果系统跑飞了,死机了,你是怎么处理的? 那时候没听懂他的意思,傻乎乎的回了一句,没遇到过这种情况。事后,才后悔莫及啊,他的意思不就是问我看门狗的作用吗? 然后就没有然后了,一个嵌入式工程师,如果看门狗都不知道人家是不敢用你的。 一、什么是看门狗? 看门狗是一个定时器,我们可以设置一个计数值,当看门狗启动后,计数值在一定的频率下不停的减1,当计数值减到0,看门狗会发出一个复位信号给CPU,这样会造成嵌入式系统复位。 软件系统在正常工作的过程中,需要在看门狗计数值减到0之前,给计数值重新赋值,这个看门狗就不会复位了,这个过程- “喂狗”。 当嵌入式
[单片机]
<font color='red'>STM32</font>小白入门(第十天)-------看门狗watchdog
STM32 PWM学习
首先,确定可以使用PWM输出的定时器,在STM32中,定时器共有8个,分别为TIM1~TIM8。 定时器 属性 是否可用PWM 输出路数 TM1,TIM8 高级定时器 可用 7路 TIM2~TIM6 通用定时器 可用 4路 TIM6,TIM7 基本时器 不可用 无 开发步骤1: 使能定时器3和相关IO口时钟。 使能定时器3时钟:RCC_APB1PeriphClockCmd(); 使能GPIOB时钟:RCC_APB2PeriphClockCmd(); 初始化IO口为复用功能输出。函数: GPIO_Init(); PIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 这里我
[单片机]
<font color='red'>STM32</font> PWM学习
STM32 之 UART1(1)
串口还算是比较的顺利,注意线序就可以了。 本例使用的是中断方式,查询方式想必很简单了,在中断服务程序里也有体现,需用的可以自己去查找。 另外注意的是: 1,添加uart的c库文件,并且在stm32f10x_conf.h文件里声明; 2,rcc初始化的时候不要忘记uart1的时钟初始化; 3,nvrc初始化; 4,uart1本身初始化; 5,中断函数里服务函数。 包含文件: (1)Main C语言: Codee#14662 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台 :
[单片机]
<font color='red'>STM32</font> 之 UART1(1)
STM32——高级定时器、通用定时器、基本定时器的区别
TIM1和TIM8定时器的功能包括【增强型】: ● 16位向上、向下、向上/下自动装载 计数器 ● 16位可编程(可以实时修改) 预分频器 ,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─
[单片机]
STM32时钟系统概述
STM32时钟框图如下: 重要的时钟: 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。   ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。   ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。   ③、LSI是低速内部时钟,RC振荡
[单片机]
<font color='red'>STM32</font><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