STM32学习笔记3——Systick

发布者:陈晨5566最新更新时间:2018-07-17 来源: eefocus关键字:STM32  Systick 手机看文章 扫描二维码
随时随地手机看文章

对于STM32中,有一个经常用到,却在数据手册上很少资料的工具,那就是Systick,这个工具是所有cortex-M0内核的单片机所共有的,他是一个系统定时器,其存在的主要目的是为嵌入式操作系统提供100Hz(即10ms)的定时节拍。当然,也可以做为其它的普通定时等其他用途。下面,我们就开始理解这个定时器。

寄存器

系统定时器包括四个寄存器,SYST_CSR、SYST_RVR、SYST_CVR、SYST_CALIB。定义如下所示: 
这里写图片描述
对于这几个寄存器我们可以翻译一下:

  • SYST_CSR寄存器,系统定时器控制和状态寄存器

  • SYST_RVR寄存器,系统定时器重载值寄存器

  • SYST_CVR寄存器,系统定时器当前值寄存器

  • SYST_CALIB寄存器,系统定时器校准寄存器 
    这样就很明了了,对于这几个寄存器我们一个个的看。 
    首先是SYST_CSR寄存器: 
    这里写图片描述
    CSR寄存器用到的位有4个,bit0用于是否开启定时器,bit1用于是否产生中断,bit2用于选择定时器的时钟源是等于主时钟还是等于主时钟的一半,bit16是定时器的状态。

SYST_RVR寄存器 
这里写图片描述
RELOAD 值可以是 0x00000001-0x00FFFFFF 范围内的任何值。您可以将 RELOAD 的值设为 0,这不会产生任何影响,因为计数值从 1变为 0时 SysTick 异常请求和 COUNTFLAG都被激活了。如果要产生一个周期为 N个处理器时钟周期的多次触发定时器,就可以将 RELOAD 值设为 N-1。例如,如果要求每隔 100个时钟脉冲就触发一次 SysTick 中断,RELOAD 就被设为 99。

SYST_CVR寄存器 
这里写图片描述
CVR寄存器用到bit0~23,即24位数,这是一个状态寄存器,当定时器开始运作,这个值在不断地变化,从RVR寄存器获取初值以后,倒计时到0. 
SYST_CALIB寄存器 
校准寄存器SYST_CALIB不用我们考虑,出厂前就配置好了。

函数

系统自带的Systick函数,由CMSIS(关于什么是CMSIS,去百度搜吧)提供,位于core_cm0.h文件,在其中第656行有如下函数

__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->LOAD = ticks – 1;”知道,ticks就是LOAD值,即重载值,表示两次中断的计数。 

例如,要产生10ms的中断,可以在程序中如下调用函数:Systick_Config(SystemCoreClock/100);函数参数中的SystemCoreClock是当前主频的值,假如现在的主频是48MHz,SystemCoreClock就是48 000 000 ,48 000 000 /100=480 000。我们把参数带进去以后,LOAD=479 999,也就是说,定时器开始运行后,定时器的值会从479 999递减到0,进入中断函数,然后再次从479 999 递减到0,如此循环。至于为什么从479 999递减到0就是10ms?知道每递减一个值需要多长时间,那么递减480 000下,需要多长时间,就知道了。要知道每递减一个值需要多长时间,就需要知道当前定时器运行的时钟是多少。由寄存器CSR知道,定时器的时钟有两种,一种是等于主频,一种是等于主频的二分之一,由CSR寄存器中的bit2决定。 

函数中,对控制寄存器的bit0 bit1 bit2都置1,对照前面的寄存器定义可知,时钟设置为等于主频,打开系统定时器中断,允许定时器运行。 

我们知道了时钟,就知道定时器每递减一个值需要的时间了,即:1/SystemCoreClock 秒,换算成毫秒即:(1/SystemCoreClock)*1000=1000/SystemCoreClock毫秒,即每递减一个值,耗时1000/SystemCoreClock毫秒。所以如果要使得10ms定时,即10/(1000/SystemCoreClock)=SystemCoreClock/100,所以,我们的设置是正确的。以此类推,需要定时多长时间,你可以自己算一个参数带进去了,需要注意的是,LOAD值是个24位数,带进去的数不要超过24位数的最大值。还有一个需要注意的地方,就是LOAD值最小255,当你给LOAD值带进去小于255值,LOAD会自动变成255。由于定时器SYST_RVR寄存器为24位的,所以最大值为十六进制FFFFFF,化为十进制为16777215,所以最多能储存数据为16777215+1=16777216;


定时器延时


利用CMSIS中的函数我们可以写如下的函数:


__IO uint32_t msTick;

void SysTick_Handler(void)               // 中断函数  

{

    msTick++;

}


void delay_ms(IO uint32_t ms)

{

  uint32_t endTime=msTicks+ms;

  SysTick_Config((SystemCoreClock/1000)*ms);  

  while(msTicks

}


进行1ms的精确延时。此外还可以修改SystemCoreClock/1000进行不同时间的延时。


关键字:STM32  Systick 引用地址:STM32学习笔记3——Systick

上一篇:STM32之SysTick(系统定时器)
下一篇:STM32滴答定时器(Systick)详细详细解析

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

STM32高级开发(16)-CMSIS DAP调试工程
最近公司的项目在等供应商的设备有点空闲的时间了,就折腾了下ARM官方开源的CMSIS DAP调试器的方案,用的是X893大神的方案,下面附上他的个人主页和在GitHub上的项目链接(我是用的是其中stlinkv2.1的软硬件方案): (http://akb77.com/g/stm32/cmsis-dap-adapter/) (https://github.com/x893/CMSIS-DAP) 这个调试器方案可以说极具性价比,SWD接口速度可以达到10M的全速,还附带一个最高支持到115200bps的串口,而且连接一根线就可以识别为两个设备,既可以单独的作为一个调试器使用,也可以集成到其他项目的PCB板上作为板载调试器和
[单片机]
<font color='red'>STM32</font>高级开发(16)-CMSIS DAP调试工程
STM32基础实验3(串口通信)
一、实验原理 简单串口通信实例 1、串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO时钟使能 2) 串口复位 3) GPIO端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 2、具体函数实现 1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); //①串口时钟使能,GPIO时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能 RCC_APB2PeriphC
[单片机]
<font color='red'>STM32</font>基础实验3(串口通信)
STM32--HAL库IIC
hal库已封装函数 输入输出函数: 阻塞模式: HAL_I2C_Master_Transmit(); HAL_I2C_Master_Receive(); HAL_I2C_Slave_Transmit(); HAL_I2C_Slave_Receive() HAL_I2C_Mem_Write(); HAL_I2C_Mem_Read(); HAL_I2C_IsDeviceReady() 带中断非阻塞模式: HAL_I2C_Master_Transmit_IT(); HAL_I2C_Master_Receive_IT(); HAL_I2C_Slave_Transmit_IT() HAL_I2C_Sl
[单片机]
经典STM32 ADC多通道转换
STM32 ADC多通道转换 描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。 程序如下: #i nclude stm32f10x.h //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义 #i nclude eval.h //头文件(包括串口、按键、LED的函数声明) #i nclude SysTickDelay.h #i nclude UART_INTERFACE.h #i ncl
[单片机]
STM32_IAP详解
  Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片机复位离线的情况下编程,需要人工的干预,而iap则是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。在工程应用中经常会出现我们的产品被安装在某个特定的机械结构中,更新程序的时候拆机很不方便,使用iap技术能很好地降低工作量.   实现iap有两个很重要的前提,首先,单片机程序能对自身的内部flash进行擦写,第二,单片机要有能够和
[单片机]
STM32_IAP详解
stm32 .icf文件.map文件,汇编文件对照
(1) 从汇编语句中可以看出中断向量表的位置处于0x08004000。对应.ICF文件中的 define symbol __ICFEDIT_intvec_start__ = 0x08004000; 补充一点:中断向量表就是2条语句做为一个单元,里面存储的就是中断函数的入口地址。我们平时写的中断函数,就可以在某个中断的入口地址下面看到。 (2) define symbol __ICFEDIT_SYS_FUNC_start__ = 0x08004200; //functab 此部分是在0x08004200后插入一段代码,从矢量表中我们可以看出矢量表的最后的地址是0x0800412e。所以从0x08004200开始插入一
[单片机]
<font color='red'>stm32</font> .icf文件.map文件,汇编文件对照
STM32 Cubemax(三)——时序读写完成称重传感器+HX711的使用
前言 因为在一个项目中使用到了称重传感器,在此记录一下其使用方法还有一些需要注意的地方。 首先介绍一下使用的传感器 HX711——一款专用于电子秤的A/D转换芯片 称重传感器(使用的这一款量程200KG) 一、接线 买到传感器后,可以看到后面尾巴引出了5条线 **其中黄线在单片机处理里面是不需要的,不需要接。 ** 如果大家买的是我上图的那一款HX711,那么可以直接按照上面的英文指示接线。 照着颜色接就完事了,RED接红线,BLK接黑线。 但还有几款HX711上面没有这个颜色提示,那也没有关系。 一般如下 接完了HX711和称重传感器,下一步就是接HX711和单片机 这里 DAT和CLK为自己
[单片机]
<font color='red'>STM32</font> Cubemax(三)——时序读写完成称重传感器+HX711的使用
STM32复位来源 以及系统和内核复位区别
1STM32的复位和时钟控制 RCC:Reset and Clock Control 每一块STM32中都有这么一个RCC复位和时钟控制模块。 STM32的复位为三类:系统复位、电源复位和后备域复位。 系统复位: 1. NRST引脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWDG复位) 3. 独立看门狗计数终止(IWDG复位) 4. 软件复位(SW复位) 5. 低功耗管理复位 电源复位: 1. 上电/掉电复位(POR/PDR复位) 2. 从待机模式中返回 备份区域复位: 1. 软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。 2. 在VDD和VBAT两者掉电的前提下, VDD或VB
[单片机]
<font color='red'>STM32</font>复位来源 以及系统和内核复位区别
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

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

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