STM32_systick定时器解述

2024-05-05 07:32
文章标签 stm32 定时器 systick 解述

本文主要是介绍STM32_systick定时器解述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看Cotex-M3内核中对systick定时器的描述。

</pre><p><strong><span style="font-size:14px;"><span style="white-space: pre;">SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)</span><span style="white-space: pre;">。</span></span></strong></p><p><span style="white-space:pre">在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,</span></p><p><span style="white-space:pre">确保没有一个任务能霸占系统;</span><span style="white-space:pre">或者把每个定时器周期</span><span style="white-space:pre">的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定</span></p><p><span style="white-space:pre">时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问</span><span style="white-space:pre">它的寄存器,以维持操作系统“心跳”的节律。 </span></p><p><span style="white-space:pre">Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同  CM3器件间的移植工作得以化简。该</span></p><p><span style="white-space:pre">定时器的时钟源可以是内部时钟(FCLK,</span><span style="white-space:pre">CM3上的自由运行时钟),或者是外部时钟(  CM3处理器上的STCLK信号)。不过,STCLK的具体来源则</span></p><p><span style="white-space:pre">由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视</span><span style="white-space:pre">芯片的器件手册来决定选择什么作为时钟源。 </span></p><p><span style="white-space:pre">SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的</span></p><p><span style="white-space:pre">移植变得简单多了,因为在所有CM3</span><span style="white-space:pre">产品间对其处理都是相同的。  </span></p><span style="white-space:pre">有4个寄存器控制SysTick定时器,如表8.9至表8.12所示。 </span><p></p><p><img src="https://img-blog.csdn.net/20160317114228619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p>校准值寄存器提供了这样一个解决方案:它使系统即使在不同的CM3产品上运行,也能产生恒定的SysTick中断频率。最简单的作法就是:</p><p>直接把TENMS的值写入重装载寄存器,这样一来,只要没突破系统极限,就能做到每10ms来一次  SysTick异常。如果需要其它的SysTick异常周期,则可以根据TENMS的值加以比例计算。只不过,在少数情况下,CM3芯片可能无法准确地提供TENMS的值(如,CM3的校准输入</p><p>信号被拉低),所以为保险起见,最好在使用TENMS前检查器件的参考手册。  SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊</p><p>停(halt)时,则SysTick定时器亦将暂停运作。</p><p>下面的例子基于官方库函数,用systick实现简单的时间片用以调度任务(从libopencm3库移植而来)。</p><p>既然是时间片,我们先看时间片管理结构体:</p><p>类型声明是放在sys_time.h中:<pre name="code" class="cpp">typedef uint8_t tid_t; ///< sys_time timer id type
typedef void (*sys_time_cb)(uint8_t id);struct sys_time_timer {                                                      //时间片类型声明bool_t                in_use;sys_time_cb      cb;                                                           //时间片到了要执行的函数volatile bool_t  elapsed;                                            uint32_t            end_time;        ///< in SYS_TIME_TICKSuint32_t            duration;         ///< in SYS_TIME_TICKS
};struct sys_time {<span style="white-space:pre">								</span>     //系统时间片管理器类型声明volatile uint32_t nb_sec;                                                  ///< 系统启动后工作了的秒数volatile uint32_t nb_sec_rem;  <span style="white-space:pre">	</span> <span style="white-space:pre">			</span>  <span style="white-space:pre">	</span>     ///< remainder of seconds since startup in CPU_TICKSvolatile uint32_t nb_tick;      <span style="white-space:pre">					</span>     ///< 系统启动后“心跳”的次数struct sys_time_timer timer[SYS_TIME_NB_TIMER];      ///<时间片数组float resolution;               <span style="white-space:pre">						</span>     ///<系统时间(“心跳”)的周期                    //分辨率=1.0 / ticks_per_secuint32_t ticks_per_sec;         <span style="white-space:pre">					</span>     ///<系统每秒中“心跳”的次数,也即每秒SYSTICK的中断次数uint32_t resolution_cpu_ticks;  <span style="white-space:pre">					</span>     ///< systick定时器的“时基脉冲”的周期uint32_t cpu_ticks_per_sec;     <span style="white-space:pre">					</span>     ///< 每秒systick定时器计数的脉冲数
};
并在sys_time.c文件中声明实体:
struct sys_time sys_time;

下面是对系统时间片管理器的初始化:
<pre name="code" class="cpp">void sys_time_init(void)
{sys_time.nb_sec     = 0;sys_time.nb_sec_rem = 0;sys_time.nb_tick    = 0;sys_time.ticks_per_sec = SYS_TIME_FREQUENCY;            //< #define SYS_TIME_FREQUENCY 2000         //系统“心跳”的频率,也即systick每秒中断的次数sys_time.resolution = 1.0 / sys_time.ticks_per_sec;for (unsigned int i = 0; i < SYS_TIME_NB_TIMER; i++) {sys_time.timer[i].in_use     = FALSE;sys_time.timer[i].cb         = NULL;sys_time.timer[i].elapsed    = FALSE;sys_time.timer[i].end_time   = 0;sys_time.timer[i].duration   = 0;}sys_time_arch_init();
}
这里看sys_time_arch_init函数的定义:
/** Initialize SysTick.
* Generate SysTick interrupt every sys_time.resolution_cpu_ticks
*/
void sys_time_arch_init(void)
{
/* run cortex systick timer with 72MHz (FIXME only 72 or does it work with 168MHz???) */
#if USE_OCM3_SYSTICK_INIT
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
#endif
sys_time.cpu_ticks_per_sec = AHB_CLK;                             //#define AHB_CLK 72000000
/* cpu ticks per desired sys_time timer step */
sys_time.resolution_cpu_ticks = (uint32_t)(sys_time.resolution * sys_time.cpu_ticks_per_sec + 0.5);     //四舍五入
#if USE_OCM3_SYSTICK_INIT
/* The timer interrupt is activated on the transition from 1 to 0,
* therefore it activates every n+1 clock ticks.
*/
systick_set_reload(sys_time.resolution_cpu_ticks - 1);
systick_interrupt_enable();
systick_counter_enable();
#endif
}


 

下面是对systick的初始化:
<pre name="code" class="cpp">/** Initialize SysTick.* Generate SysTick interrupt every sys_time.resolution_cpu_ticks*/
void sys_time_arch_init(void)
{/* run cortex systick timer with 72MHz (FIXME only 72 or does it work with 168MHz???) */
#if USE_OCM3_SYSTICK_INITsystick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
#endifsys_time.cpu_ticks_per_sec = AHB_CLK;                             //#define AHB_CLK 72000000/* cpu ticks per desired sys_time timer step */sys_time.resolution_cpu_ticks = (uint32_t)(sys_time.resolution * sys_time.cpu_ticks_per_sec + 0.5);     //四舍五入#if USE_OCM3_SYSTICK_INIT/* The timer interrupt is activated on the transition from 1 to 0,* therefore it activates every n+1 clock ticks.*/systick_set_reload(sys_time.resolution_cpu_ticks - 1);systick_interrupt_enable();systick_counter_enable();
#endif
}


 


这篇关于STM32_systick定时器解述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961133

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

又看见定时器了,怎么这么想写了~~

1.scheduleUpdate(); 与virtual void update(float dt);   联合使用,就是每隔一段时间就调用一次update,实际上是每一帧都调用一次updata方法,scheduleUpdate();方法相当于开启了定时器。 2.schedule的作用和scheduleUpdate差不多,只是这个其实更好用一些,这个可以只是指定调用的方法,系统默认每一帧都调用一

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了,因为种种原因,也有很久一段时间没接触过stm32了。等我捡起来的时候,发现很多都已经忘记了,重新捡起来吧。 每次谈到stm32如何如何,那么该如何解释什么是stm32呢? 1.什么是STM32 stm32

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的,那么怎么更改系统的主频,这里做一个简单的介绍。首先要明白,单片机的程序是如何运行,这里简单说明一下。 对应的代码在startup_stm32....文件里面,这里是复位程序的汇编代码。 复位子程序是系统上电后第一个执行的程序,调用 SystemInit 函数初始化系统时钟,然后调用 C 库函数 _mian,最终调用 main 函数去到 C

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令 这里我已经连接过了STM32F407VET6了。 再输入connect命令 这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatile uint32_t*) 0x080FFFFF)

基于STM32的智能家居安防系统

目录 引言环境准备智能家居安防系统基础代码实现:实现智能家居安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:智能家居安防管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居安防系统通过使用STM32嵌入式系统,结合多种传感器和控制设备,实现对家庭环境的实时监测和安防管理。本文将详细介绍如何在STM32系统中实现一个智能家居

我在高职教STM32——LCD液晶显示(3)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享出来,主要面向广大师生朋友,单片机老鸟就略过吧。欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!

【STM32】STM32通过I2C实现温湿度采集与显示

目录 一、I2C总线通信协议 1.I2C通信特征 2.I2C总线协议 3.软件I2C和硬件I2C 二、stm32通过I2C实现温湿度(AHT20)采集 1.stm32cube配置 RCC配置: SYS配置: I2C1配置: USART1配置: GPIO配置: 时钟配置: project配置: 2.KEil代码配置 添加AHT20文件: 添加路径: AHT20.