【STM32】Cortex-M3的Systick定时器(实现Delay延时)

news2024/9/21 2:22:00

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

目录

前言 

Systick介绍

Systick相关寄存器

 控制和状态寄存器- CTRL

重装载数值寄存器- LOAD

当前值寄存器- VAL

SysTick库函数

初始化

时钟源选择 

SysTick中断

Delay代码

Delay.h

Delay.c


 

前言 

 《Cortex-M3权威指南-中文》:

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

Systick介绍

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。注意:当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作

Systick定时器是一个简单的定时器,常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用再浪费一个定时器外设。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。Systick中断的优先级也可以设置。

对于CM3,CM4内核芯片,都有Systick定时器。

Cortex-M系统中,Systick代码可以通用。 如果使用中发现延时不一致,问题一般都是因为不同内核时钟不一样而已。修改ticks值即可。

Systick相关寄存器

4个Systick寄存器  

  • CTRL        SysTick 控制和状态寄存器
  • LOAD        SysTick 自动重装载除值寄存器
  • VAL           SysTick 当前值寄存器  
  • CALIB       SysTick 校准值寄存器(用得不多)

 控制和状态寄存器- CTRL

SysTick时钟源:

外部时钟源是 HCLK(AHB总线时钟)的1/8                            

内核时钟是 HCLK时钟    

AHB总线时钟一般为72MHz.如果选择AHB总线时钟为SysTick计数器时钟,那么计数器自减72个数需要时间一微秒

重装载数值寄存器- LOAD

当前值寄存器- VAL

 

 SysTick校准数值寄存器用的不多,不再列出 ,见《Cortex-M3权威指南-中文》-第8章最后一个小节:Systick定时器

SysTick库函数

有关SysTick的寄存器比较少,一般都是直接操作寄存器 

初始化

SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断
                                                    //core_cm3.h/core_cm4.h文件中

/**
 * @brief  初始化并启动 SysTick 计数器及其中断
 *
 * @param   ticks   相邻两个中断之间的ticks数
 * 
 * @return  1 = failed, 0 = successful
 *
 * 初始化系统勾选定时器及其中断,并在自由运行模式下启动系统勾选计时器/计数器以产生周期性中断。
 * 
 * 
 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 重装载值不合理 */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* 设置重装载寄存器*/
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* 加载SysTick计数器值 */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* 使能SysTick IRQ和SysTick Timer */
  return (0);                                                  /* 函数成功 */
}

时钟源选择 

 配置函数:SysTick_CLKSourceConfig();    //Systick时钟源选择  misc.c文件中

/**
  * @brief  配置 SysTick 时钟源
  * @param  SysTick_CLKSource: 指定SysTick时钟源
  *   此参数可以是下列值之一:
  *     @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)
{
  /* 检查参数 */
  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中断

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。Systick中断的优先级也可以设置。

//Systick中断服务函数
void SysTick_Handler(void);

Delay代码

Delay.h

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

Delay.c

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

参考资料

《Cortex-M3权威指南-中文》-第8章最后一个小节:Systick定时器 

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

青岛实训 8月21号 day33

1.设置主从从mysql57服务器 1&#xff09;配置主数据库 [rootmsater_5 ~]# systemctl stop filewalld [rootmsater_5 ~]# setenforce 0 [rootmsater_5 ~]# systemctl disable filewalld [rootmsater_5 ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.g…

[vue] index.html中获取process.env.NODE_ENV

在index中使用环境变量直接用&#xff1a;process.env 是无法获取到的 需要使用&#xff1a; <% process.env.NODE_ENV %> // 获取环境变量 index.html固定写法 参考&#xff1a; 在vue-cli创建项目中的index.html中根据环境环境变量不同埋点

vue 踩坑记录

本地开发没有cookie 解决方案 设置代理&#xff0c;并把changeOrigin设为true proxy的changeOrigin如果设置为false&#xff1a;请求头中host仍然是浏览器发送过来的host&#xff1b; 如果设置成true&#xff1a;发送请求头中host会设置成target。 允许axios请求携带cookie等凭…

TensorFlow-keras介绍(一)

目录 一.回顾神经网络 1.神经网络 2.感知机 3.神经网络原理 1.softmax回归 2.交叉熵 二.Keras介绍 1.Keras框架的特点 2.使用tf.keras进行模型构建 1.使用Sequential构建模型 2.利用keras提供的API建立较为复杂的模型 3.model的子类进行创建 都看到这里了&#xff…

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

MySQL基础:索引

&#x1f48e;所属专栏&#xff1a;MySQL 1. 索引概述 MySQL中的索引是帮助MySQL高效获取数据的数据结构&#xff0c;可以极大地提高数据库的查询效率&#xff0c;减少数据库的I/O成本&#xff0c;就像书的目录一样&#xff0c;它可以帮助我们快速定位到书中的内容。 优势&…

《深入理解JAVA虚拟机(第2版)》- 第8章 - 学习笔记

第8章 虚拟机字节码执行引擎 8.1 概述 执行引擎是Java虚拟机最为核心的组成部分之一。在不同的虚拟机里面&#xff0c;执行引擎在执行Java代码的时候可能会有解释执行&#xff08;通过解释器执行&#xff09;和编译执行&#xff08;通过即时编译器生成本地代码执行&#xff0…

监控平台之nodejs模拟后端接口

github&#xff1a;可以下载进行实验 https://github.com/Mr-Shi-root/sdk-platform/tree/master 1.配置node环境&#xff0c;安装express cors body-parser babel/cors body-parser - node.js 中间件&#xff0c;用于处理 JSON, Raw, Text 和 URL 编码的数据。cookie-parse…

光伏清洁机器人4G之痛,LoRa通讯取而代之?

光伏清洁机器人是一种专门用于清洁光伏组件&#xff08;太阳能电池板&#xff09;的自动化机器人。通过自主或者远程控制自动清洁光伏板上的尘土、鸟粪、树叶等污染物&#xff0c;在提升清洁效果的同时提高光伏电站的发电效率。然而&#xff0c;面对偏远无人区的孤岛效应及复杂…

交友系统“陌陌”全方位解析

交友系统在现代社会中扮演着越来越重要的角色&#xff0c;尤其是随着互联网技术的发展&#xff0c;各种交友软件层出不穷。陌陌作为其中的佼佼者&#xff0c;其全方位解析对于理解交友系统的商业开发至关重要。 陌陌的核心功能是提供基于地理位置的社交服务&#xff0c;用户可…

MES生产制造执行系统源码,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。

企业需要MES生产制造执行系统来提供实现从订单下达到完成品的生产活动优化所得信息&#xff0c;并运用及时准确的数据&#xff0c;指导、启动、响应并记录车间生产活动&#xff0c;对生产条件的变化做出迅速的响应&#xff0c;减少非增值活动&#xff0c;提高效率&#xff0c;为…

# 利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优--1

利刃出鞘_Tomcat 核心原理解析&#xff08;十&#xff09;-- Tomcat 性能调优–1 一、Tomcat专题 - Tomcat性能调优 - 性能测试 1、tomcat 性能测试&#xff1a; 对于系统性能&#xff0c;用户最直观的感受就是系统的加载和操作时间&#xff0c;即用户执行某项操作的耗时。从…

SketchUp Pro 2024 for Mac/Win:专业3D建模软件的卓越之选

SketchUp Pro 2024作为一款在业界广受好评的三维建模软件&#xff0c;不仅适用于Mac系统&#xff0c;也完美兼容Windows平台&#xff0c;为用户提供了跨平台的强大建模能力。该软件以其直观易用的界面设计著称&#xff0c;无论是初学者还是资深设计师&#xff0c;都能迅速上手并…

介绍冯诺依曼体系结构和操作系统

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1. 冯诺依曼体系结构2. 操作系统&#xff08;O…

【数据结构取经之路】位图全解

目录 前言 C标准库里的位图 位图的设计及实现 位图几个关键接口的实现 set() reset() test() 完整代码 位图的使用场景 位图的优缺点 位图的使用演示 —— 几道面试题的讲解 前言 位图&#xff08;Bitmap&#xff09;是一种非常高效的数据结构&#xff0c;主要用于处…

Claude Enterprise:Anthropic 推出企业级AI助手挑战OpenAI

Anthropic公司推出了Claude Enterprise&#xff0c;这是一项新的企业级AI服务&#xff0c;旨在提供更安全、更可控的AI聊天机器人体验。通过这个服务&#xff0c;企业可以将内部知识库与Claude机器人连接&#xff0c;使其能够访问和分析公司数据&#xff0c;从而回答员工的查询…

【MySQL】MySQL Workbench下载安装、环境变量配置、基本MySQL语句、新建Connection

1.MySQL Workbench 下载安装&#xff1a; 进入网址&#xff1a;MySQL :: MySQL Workbench Manual :: 2 Installation &#xff08;1&#xff09;点击“MySQL Workbench on Windows”&#xff08;下载Windows版本&#xff09;&#xff08;2&#xff09;点击“Installing” &…

前端Vue框架,本地数据库nedb

封装 db.js&#xff08;文章nedb版本^1.8.0&#xff09; // db.js// 导入 NeDB 模块 const Datastore require(nedb)// 创建数据库实例,最大600M或100W行 const db new Datastore({ filename: ./database.db, autoload: true, inMemoryOnly: false, maxFileSize: 600 * 1024…

如何将 Redshift Cryptomatte AOV 与 teamrender 结合使用,成都渲染101云渲染

这篇文章将讨论在 Cinema 4D 中将 cryptomatte AOV 与 teamrender 结合使用时常见的问题和解决方案。在 Cinema 4D 中使用 AOV 时&#xff0c;用户希望它们的工作方式与其他 AOV 完全相同。但事实并非如此&#xff0c;尤其是与 teamrender 结合使用时。 在 Cinema 4D 中&#x…

【JAVA高级】并发同步工具CyclicBarrier 的使用介绍

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;JAVA进阶 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 文章目录 CyclicBarrier 简介CyclicBarrier 的场景示意图&#xff1…