datasheet

STM32学习笔记一一SysTick

2019-01-09来源: eefocus 关键字:STM32  SysTick

1.简介

SysTick 定时器被捆绑在 NVIC 中,用于产生 SysTick 异常(异常号:15)。在以前,操作系统和有所有使用了时基的系统,都必须要一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。


Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer。SysTick定时器的时钟源可以是内部时钟(FCLK, CM3 上的自由运行时钟),或者是外部时钟(CM3 处理器上的 STCLK 信号)。不过, STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。因此,需要阅读芯片的使用手册来确定选择什么作为时钟源。在 STM32 中 SysTick 以 HCLK(AHB 时钟)或 HCLK/8 作为运行时钟。 

ysTick 定时器能产生中断, CM3 为它专门开出一个异常类型。SysTick 定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。


2.SysTick timer工作原理

SysTick 是一个 24 位的定时器,即一次最多可以计数 2^24 个时钟脉冲,这个脉冲计数值被保存到 当前计数值寄存器 STK_VAL (SysTick current valueregister) 中,只能向下计数,每接收到一个时钟脉冲 STK_VAL 的值就向下减1,直至 0,当 STK_VAL 的值被减至 0 时,由硬件自动把重载寄存器STK_LOAD(SysTick reload value register) 中保存的数据加载到 STK_VAL,重新向下计数。当 STK_VAL 的值被计数至 0 时,触发异常,就可以在中断服务函数中处理定时事件了。


3.SysTick timer寄存器

SysTick—系统定时有4个寄存器,简要介绍如下。在使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。



要使 SysTick 进行以上工作必须要进行 SysTick 进行配置。它的控制只有三个控制位和一个标志位,都位于寄存器 STK_CTRL(SysTick control and status register ) 中,



寄存器位 作用

Bit0 ENABLE:SysTick timer 的使能位,此位为 1 的时候使能 SysTick timer,此位为 0 的时候关闭 SysTick timer

Bit1 TICKINT:为此位为 1 并且 STK_VAL 计数至 0 时会触发SysTick 异常,此位被配置为 0 的时候不触发异常

Bit2 CLKSOURCE:为 SysTick 的时钟选择位,此位为 1 的时候 SysTick 的时钟为 AHB 时钟,此位为 0 的时候 SysTick 时钟为 AHB/8(AHB 的八分频)

Bit16 COUNTFLAG为计数为 0 标志位,若 STK_VAL 计数至 0,此标志位会被置 1

4.SysTick timer配置

SysTick timer 理论上它的最小计时单位为AHB 的时钟周期,即 1/72000000 秒, 72 分之一的微秒。


4.1 定时时间的计算:

重装载计数器的参数为: SystemCoreClock / 1000000 , SystemCoreClock 为定义了系统时钟(SYSCLK)频率的宏,即等于 AHB (72M) 的时钟频率, 这个 SystemCoreClock 宏展开为数值 7200 0000。输入参数为 SysTick 将要计的脉冲数,经过 ticks 个脉冲(经过 ticks 个时钟周期)后将触发中断,触发中断后又重新开始计数。



ticks:重装载寄存器 LOAD 的赋值;


1/f:SysTick timer 使用的时钟源的时钟周期, f 为该时钟源(72 or 72 / 8)的时钟频率,当时钟源确定后为常数。


定时1us :tibks = 72000000 / 1000000,表示 72 个周期中断一次,所以定时时间 T = 72 * (1/72)= 1us。


SysTick 定时器的定时时间(配置为触发中断,即为中断周期),由 ticks 参数决定,最大定时周期不能超过 2^24个。


5.软件实现

#include "systick.h"


u32 systick;


//系统滴答初始化

void SysTick_Init(void)

{

    SysTick->LOAD = (uint32_t)(SystemCoreClock/1000000-1UL);    //72M时钟,一次1us

    SysTick->VAL = 0UL;

    SysTick-> CTRL = SysTick_CTRL_ENABLE_Msk  " //使能

                     SysTick_CTRL_TICKINT_Msk | //触发异常

                     SysTick_CTRL_CLKSOURCE_Msk;    //时钟源选择

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭滴答定时器

}


void delay_us(u32 time)

{

    (systick) = time;


    SysTick->VAL = 0;

    SysTick-> CTRL |= SysTick_CTRL_ENABLE_Msk;

    while((systick));

    SysTick-> CTRL &= ~SysTick_CTRL_ENABLE_Msk;

}


void delay_ms(u32 time)

{

    (systick) = time * 1000;


    SysTick->VAL = 0;

    SysTick-> CTRL |= SysTick_CTRL_ENABLE_Msk;

    while((systick));

    SysTick-> CTRL &= ~SysTick_CTRL_ENABLE_Msk;


}


//滴答中断

void SysTick_Handler(void)

{

    while(systick)

        (systick)--;

}


调用了 delay_us() 函数, SysTick 定时器就被开启,按照设定好的定时周期递减计数, SysTick 的计数寄存器里面的值减为 0 时,就进入中断函数,当中断函数执行完毕之后由重新计时,如此循环,除非它被关闭。

关键字:STM32  SysTick

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

上一篇:STM32驱动WS2812D全彩LED
下一篇:最后一页

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

推荐阅读

STM32程序移植技巧总结

1. 工程更换不同的STM32芯片eg:stm32f103rct6 ---->stm32f103c8t6:1.1. 修改芯片点击魔术棒,在出来的菜单栏里,Device 选项重新选择芯片1.2. 修改启动文件此处举例是 RCT6 修改为 C8T6,因为 flash 容量大小不一样,所以需要对应修改启动文件,如果是 flash 大小相同,此步骤不需要。此处由:startup_stm32f10x_hd.s修改为startup_stm32f10x_md.s1.3. 修改全局宏定义同样先点击魔术棒,在菜单栏选择 C/C++。进而修改全局宏定义。此处:STM32F10X_HD–>STM32F10X_MD1.4. 重新添加FLASH
发表于 2019-01-09
STM32程序移植技巧总结

STM32学习笔记一一FLASH 模拟 EEPROM

1. 简述STM32 本身没有自带 EEPROM,但是 STM32 具有在应用编程(IAP:In Application Programming)功能,可以把它的 FLASH 当成 EEPROM 来使用。不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。MiniSTM32 开发板选择的 STM32F103RCT6 的 FLASH 容量为 256K 字节,属于大容量产品,闪存模块组织如下图:1.1 主存储器:该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。**注意:**小容量和中容量产品则每页
发表于 2019-01-09
STM32学习笔记一一FLASH 模拟 EEPROM

STM32学习笔记一一HEX文件和BIN文件格式

1. 引言今天看串口的 IAP ,平时我们通过 JTAG 等工具下载的都是 HEX 文件,都没有思考一下 HEX 的文件组成。而串口 IAP 下载的是 BIN 文件,刚好在这里区分学习一下。我们平时烧写 HEX 文件是不需要设置地址信息的,因为已经包含在文件里面,而使用 BIN 烧写,需要在程序中指定地址。2. 简述Intel hex 文件是记录文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一个 HEX 记录,由十六进制数组成的机器码或者数据常量。Intel HEX 文件经常被用于将程序或数据传输存储到 ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。2.1 HEX文件HEX 文件是包括
发表于 2019-01-09
STM32学习笔记一一HEX文件和BIN文件格式

STM32学习笔记一一串口 IAP

(Bootloader 程序)必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码(APP 程序)可以使用第一部分代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新时再通过第一部分 IAP代码更新。他们存放在 STM32 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序。2 .STM32程序流程2.1 STM32 正常的程序运行流程下图为 STM32 正常的程序运行流程:STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张
发表于 2019-01-09
STM32学习笔记一一串口 IAP

STM32学习笔记一一待机唤醒

1. 简述1.1 低功耗模式:在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如:等待某个外部事件时,常见的按键唤醒。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。1.2 STM32F10X系列的低功耗模式STM32F10xxx有三种低功耗模式:–模式– –特点—睡眠模式 Cortex-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行停止模式 所有的时钟都已停止待机模式 1.8V电源关闭在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需 2uA 左右的电流。停机模式
发表于 2019-01-09
STM32学习笔记一一待机唤醒

STM32学习笔记一一红外遥控

}2.2 中断捕获u8 RmtSta=0;u16 Dval;u32 RmtRec=0;u8 RmtCnt=0;void TIM5_IRQHandler(void){ if(TIM_GetITStatus(TIM5,TIM_IT_Update)!= RESET) { if(RmtSta&0x80)//数据接收到标志位 { RmtSta &= ~0x10;//取消上升沿捕获标记 if((RmtSta&0x0F)==0x00) RmtSta |= 1<<6; if((RmtSta&0x0F)<14) RmtSta++; else { RmtSt
发表于 2019-01-09
STM32学习笔记一一红外遥控

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">