stm32之SysTick的理解

发布者:shmilyde最新更新时间:2018-07-20 来源: eefocus关键字:stm32  SysTick 手机看文章 扫描二维码
随时随地手机看文章

1、SysTick的介绍(以上资料来自CM3中文参考手册)

 

  SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 
  Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同  CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(  CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。 
  SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。 

2、SysTick寄存器

STM32中的systick,Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:

       STK_CSR,       0xE000E010  --  控制寄存器
       STK_LOAD,     0xE000E014  --  重载寄存器
       STK_VAL,        0xE000E018  --  当前值寄存器
       STK_CALRB,  0xE000E01C  --   校准值寄存器

(1)STK_CSR控制寄存器

       第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
       第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
       第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
       第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零.

(2) STK_LOAD 重载寄存器

Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。

(3)STK_VAL当前值寄存器


也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。


(4)STK_CALRB校准值寄存器


不知到怎么使用,有兴趣的请参考CM3内核参考手册。


3、程序中的理解和使用 

  RT-Thread系统bsp的stm32F10x中关于Systick的初始化:在启动文件中其实已经一定了SystemInit();其中就已经定义了32的AHB时钟、APB1时钟和APB2时钟的大小。

RTT中


  /* Configure the SysTick */

      SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); //RT_TICK_PER_SECOND =100

__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 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->CTRL寄存器的表示使用HCLK作为Systick的时钟也就是72Mhz,Systick中断使能,并启动Systick定时器。

按照这个函数来算的话,写入SysTick->LOAD的值为72000000/100;这样算的话(1/72M)*SysTick->LOAD=10ms;故该RTT系统的最小调度时间就为10ms。


关键字:stm32  SysTick 引用地址:stm32之SysTick的理解

上一篇:STM32 SysTick 精确延时(非中断方式)
下一篇:【stm32f407】SysTick实现延时

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

关于STM32的计数与延时
Ⅰ关于STM32的计数和延时 在STM32中,具有计数(或计时)功能的模块基本都能实现延时功能。如:系统滴答SysTick、定时器TIM、实时时钟RTC、看门狗WDG。 精确延时一般使用定时器TIM即可实现。当然,是否精确,取决于你的主频(也就是晶振)是否准确,如果主频精确,那么实现的延时也一定精确。 一般来说,常温下实现us微秒级的延时,误差还是挺小的(应该说挺精确)。拿F407,主频168M来说,可以实现几十ns纳秒的延时,如果选用高精度的晶振,误差还是很小的。 总结:想要TIM定时器实现高精确的延时,就需要高精度的晶振。主频精确,那么延时就精确。 ⅡSTM32的TIM定时器 STM32的定时器有3类: 高级定
[单片机]
关于<font color='red'>STM32</font>的计数与延时
STM32硬件错误的调试技巧
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。 这说明STM32出现了硬件错误。 硬件错误中断 STM32出现硬件错误可能有以下原因: 数组越界操作; 内存溢出,访问越界; 堆栈溢出,程序跑飞; 中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。 示例 1.2 在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。 如果R
[单片机]
<font color='red'>STM32</font>硬件错误的调试技巧
STM32定时器不准确启动时钟的问题
用STM32 F407IG 开发一硬件控制器,需要精准的定时器。我使用了IIM2,可上电启动。有时候准确,有时候开机 定时器,很慢,比如定时500MS 闪烁一次,可能3秒才闪烁一次。源代码如下。 int main(void) { GPIO_Configuration(); TIM_Config(); NVIC_TIM_Config(); while(1) { } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(LED1_RCC_AHBPeriph|LED2_RC
[单片机]
STM32学习013_SPI串行外设接口通信
SPI(Serial Periphreal Iterface-串行外设接口)总线系统是一种同步串行外设接口,使MCU与各种外围接口以串行方式进行通讯交换信息,SPI有三个寄存器,控制寄存器SPCR,状态寄存器SPSR,数据寄存器SPDR,外围设备包括FlashRam,网络控制器,LCD显示驱动器,AD转换器和MCU etc.接口一共用4条线,串行时钟线(SCLK),主机输入/从机输出数据线MISO,主机输出/从机输入数据线MOSI,和低电平有效的从机选择线NSS. SPI接口主要应用在EEPROM,flash 实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 数据传输的过程:在主器件的移位脉冲下,数据按位传输,低位在
[单片机]
<font color='red'>STM32</font>学习013_SPI串行外设接口通信
stm32—普通串口(接收查询和中断相结合)
串口实验 1. 在做任何实验之前都是将目标文件导入库文件,然后在main函数中导入头文件,在FWLIB中写入路径,当然串口也不例外 2.导入文件之后第二步也都是端口初始化(初始化里面语句的作用已经在后面说明) 在初始化完成之后,记得在main函数中调用 3.用串口发送数据 利用USART_SendData(USART1,'9');来发送一个字节的数据,printf();也可使用来发送字符串,在使用printf的时候记得给main()函数添加 #include stdio.h
[单片机]
STM32 JoystickMouse USB游戏杆鼠标的实现
本次程序的实现是基于上次CustomHID修稿过来的,工程的架构就不在介绍,这里主要介绍下,如何修改。 首先当然是usb_desc.c的一些描述符了。 设备描述符需要修改下bMaxPacketSize(最大包长度)为0x08个字节,因为该工程通讯的长度为4字节,根据USB洗衣规范,最大包长度只能是8、16、64等,所以这里选择0x08,这里要注意,改为0x08时,在usb_prop.c的DEVICE_PROP Device_Property- MaxPacketSize域也要改成0x08(我们在下面会说到),要跟配置描述符定义的最大包长度相同,否则,电脑上会出现:“此设备未识别”类似的提示。最好还要修改下厂商ID和产品ID两项
[单片机]
STM32笔记(十一)---I2C读写EEPROM---硬件I2C
I2C 协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、 CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设; STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。 协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准
[单片机]
<font color='red'>STM32</font>笔记(十一)---I2C读写EEPROM---硬件I2C
使用EmBitz开发STM32项目的环境配置
一、EmBitz软件获取与安装 1、EmBitz软件的获取   EmBitz原名Em::Blocks,是基于Code::Blocks开发的,面向嵌入式的C/C++集成开发环境。支持J-Link和ST-Link调试器。使用J-Link仿真器时需安装J-Link GDB Server。   EmBitz下载地址:http://www.emblocks.org/web/downloads-main   J-Link GDB Server下载地址:https://www.segger.com/downloads/jlink 2、EmBitz软件的安装 【学习技术群769843038】   软件下载后解压,运行安装包开始安装,如下图:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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