STM32——SysTick 定时器讲解(代码)

2023-05-16

一、SysTick—系统定时器简介

SysTick—系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

因为SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,使得软件在CM3单片机中可以很容易的移植。 系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

二、SysTick寄存器介绍

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

在这里插入图片描述

在这里插入图片描述SysTick 属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm3.h中。

三、 SysTick定时实验

功能:利用SysTick产生1s的时基,LED以1s的频率闪烁。

编程要点

1、设置重装载寄存器的值

2、清除当前数值寄存器的值

3、配置控制与状态寄存器

SysTick_Config()库函数主要配置了SysTick中的三个寄存器:LOAD、VAL和CTRL。
用固件库编程的时候我们只需要调用库函数SysTick_Config()即可,形参ticks用来设置重装载寄存器的值, 最大不能超过重装载寄存器的值224,当重装载寄存器的值递减到0的时候产生中断,然后重装载寄存器的值又重新装载往下递减计数, 以此循环往复。紧随其后设置好中断优先级,最后配置系统定时器的时钟等于AHBCLK=72M,使能定时器和定时器中断,这样系统定时器就配置好了,一个库函数搞定。

//SysTick配置库函数
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
    // 不可能的重装载值,超出范围
    if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {
        return (1UL);
    }

    // 设置重装载寄存器
    SysTick->LOAD  = (uint32_t)(ticks - 1UL);

    // 设置中断优先级
    NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);

    // 设置当前数值寄存器
    SysTick->VAL   = 0UL;

    // 设置系统定时器的时钟源为AHBCLK=72M
    // 使能系统定时器中断
    // 使能定时器
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                    SysTick_CTRL_TICKINT_Msk   |
                    SysTick_CTRL_ENABLE_Msk;
    return (0UL);
}

SysTick 初始化函数

 /**
* @brief 启动系统滴答定时器 SysTick
* @param 无
* @retval 无
*/
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms 中断一次
* SystemFrequency / 100000 10us 中断一次
* SystemFrequency / 1000000 1us 中断一次
*/
if (SysTick_Config(SystemCoreClock / 100000)) {
/* Capture error */
while (1);
}
}

SysTick 定时时间的计算
当设置好中断时间 T INT 后,我们可以设置一个变量 t,用来记录进入中断的次数,那
么变量 t 乘以中断的时间 TINT 就可以计算出需要定时的时间。

SysTick 定时函数
现在我们定义一个微秒级别的延时函数,形参为 nTime,当用这个形参乘以中断时间
TINT 就得出我们需要的延时时间,其中 TINT 我们已经设置好为 10us。关于这个函数的具体
调用看注释即可。

/*
us 延时程序,10us 为一个单位
Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
*/
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;

while (TimingDelay != 0);
}

函数 Delay_us()中我们等待 TimingDelay 为 0,当 TimingDelay 为 0 的时候表示延时时
间到。变量 TimingDelay 在中断函数中递减,即 SysTick 每进一次中断即 10us 的时间
TimingDelay 递减一次。

//SysTick 中断服务函数
void SysTick_Handler(void)
 {
TimingDelay_Decrement();
}

中断复位函数调用了另外一个函数 TimingDelay_Decrement(),原型如下:

/*
获取节拍程序
在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00) {
TimingDelay--;
}
}

TimingDelay 的值等于延时函数中传进去的 nTime 的值,比如 nTime=100000,则延时
的时间等于 100000*10us=1s。

主函数

int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();

/* 配置 SysTick 为 10us 中断一次,时间到后触发定时中断,
*进入 stm32fxx_it.c 文件的 SysTick_Handler 处理,通过数中断次数计时
*/
SysTick_Init();

while (1) {

LED_ON;
Delay_us(100000); // 10000 * 10us = 1000ms

LED2_ON;
Delay_us(100000); // 10000 * 10us = 1000ms

LED3_ON;
Delay_us(100000); // 10000 * 10us = 1000ms
}
}

主函数中初始化了 LED 和 SysTick,然后在一个 while 循环中以 1s的频率让 LED 闪烁。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32——SysTick 定时器讲解(代码) 的相关文章

  • 努力加油——感想帖

    一直很想写一篇自己的心路历程 xff0c 这篇文章于2022 10 28午编写 2020年7月10日在高考地理考卷上给自己的中学生涯画上了句号 走出考场那一刻 xff0c 心里像是有一块沉甸甸的石头被放了下来 xff0c 但好像自己并不是很
  • 小国王——状压DP

    在 n n 的棋盘上放 k 个国王 xff0c 国王可攻击相邻的 8 个格子 xff0c 求使它们无法互相攻击的方案总数 输入格式 共一行 xff0c 包含两个整数 n 和 k 输出格式 共一行 xff0c 表示方案总数 xff0c 若不能
  • 小国王(目标状态优化版)—— 状态压缩DP

    在 n n 的棋盘上放 k 个国王 xff0c 国王可攻击相邻的 8 个格子 xff0c 求使它们无法互相攻击的方案总数 输入格式 共一行 xff0c 包含两个整数 n 和 k 输出格式 共一行 xff0c 表示方案总数 xff0c 若不能
  • 炮兵阵地——状态压缩DP

    司令部的将军们打算在 N MN M 的网格地图上部署他们的炮兵部队 一个 N MN M 的地图由 NN 行 MM 列组成 xff0c 地图的每一格可能是山地 xff08 用 H 表示 xff09 xff0c 也可能是平原 xff08 用 P
  • hadoop项目实战——奥运会数据分析

    大三学期项目 hadoop MapReduce 奥运会数据分析结果 xff1a 有没需要详细实现方法的小伙伴呀 xff1f 可以在评论区评论一下 如果人多 xff0c 那么后续会详细更新实现方法
  • RT-Thread 内核线程切换原理

    1 背景 本文章主要说明 rtthread 内核线程是如何切换的 xff0c 初学者刚从裸机开发接触 RTOS 时难免会有些不适应 xff0c 明白这部分原理之后就会对 RTOS 有更深的理解 在学习内核线程切换原理之前需要有以下基础知识铺
  • 【多线程】C/C++语言中多线程和简单例子

    目录 前言 一 pthread两种状态joinable和unjoinable 二 thread join 方法存在的必要性 三 为什么要多线程 xff1a 问题 xff1a 简单的多线程编程 线程的数据处理 四 实例代码 C 43 43 C
  • 单片机开发之裸机也能 “多任务”?

    单片机开发之裸机也能 多任务 xff1f 1 背景 对于一些简单的单片机项目 xff0c 没必要非得跑RTOS xff0c 因此 xff0c 很多项目都是在 裸奔 指纯循环加上中断的机制 所以 xff0c 开发出一套好用的裸机框架是非常有必
  • vscode如何运行C++程序

    首先说一下vscode是一个支持跨平台的轻量级编辑器 1 安装c c 43 43 编译器 Linux系统一般都自带gcc和g 43 43 xff0c 但对于Windows系统而言就需要安装Mingw w64来获得编译器 步骤如下 xff1a
  • TX2 安装显卡驱动

    1 官网查询驱动版本 官方 GeForce 驱动程序 NVIDIA 这个版本gcc不合适 xff0c 换了下一个 又换了一个版本 xff0c 依旧有gcc版本问题 但查了一些资料 xff0c 对照一些版本 xff0c 觉得可能gcc冲突并不
  • 04 ROS Client-Service-Server实例

    零 Service机制 Client与Server向ROS MASTER注册MASTER根据Client订阅的信息 xff0c 查阅注册表中是否有提供对应Service的ServerClient收到Server的TCP通信地址Client用
  • ROS2教程 02 功能包

    一 检查别人的功能包依赖 当移植别人的功能包到本机时 xff0c 需要在工作空间目录下检查功能包依赖是否健全 rosdepc span class token function install span i from path src ro
  • 从零开始学习无人机 00 硬件配置

    遥控器 型号 乐迪Radiolink AT9S Pro 固件更新 对遥控器固件作更新 乐迪Radiolink AT9S Pro 固件更新 光流传感器 型号 思动智能ThoneFlow 3901U 开发文档 Pmw3901光流传感器PX4开发
  • 树莓派ubuntu镜像备份详细教程

    1 获取镜像 将配置好环境的树莓派sd卡放入读卡器将读卡器插入电脑在Windows操作系统上使用软件win32diskimager获取镜像将镜像保存到Linux操作系统上某个位置 xff0c 例如ubuntu22 04 2 减小镜像体积 安
  • Java开发必须会的技能!kafka集群3个节点挂掉一个

    Maven权威指南 首先 xff0c 本书适合所有Java程序员阅读 由于自动化构建 依赖管理等问题并不只存在于Java世界 xff0c 因此非Java程序员也能够从该书中获益 无论你是从未接触过Maven 还是已经用了Maven很长时间
  • 大厂首发!阿里面试官跟我死磕MySQL,Java岗

    前言 蓦然回首自己做开发已经十年了 xff0c 这十年中我获得了很多 xff0c 技术能力 培训 出国 大公司的经历 xff0c 还有很多很好的朋友 但再仔细一想 xff0c 这十年中我至少浪费了五年时间 xff0c 这五年可以足够让自己成
  • C语言和数据结构与算法(99)

    1 预处理和关键字 22道 1 1 宏定义是在编译的哪个阶段处理的 xff1f 答案 xff1a 在编译的预处理阶段 xff0c 被处理的 编译预处理包括 xff1a 宏替换 文件包含 条件编译 其他预处理指令 1 2 写一个 标准 宏定义
  • 【MYSQL】同时查询两个表并将结果合并到一起

    目录 从两个表中查不同字段并拼接到一起 xff08 从两个表中查的字段不一样 xff09 将两个表结果合并 xff08 从两个表中查的字段一样 xff09 SQL多表合并UNION ALL和UNION 从两个表中查不同字段并拼接到一起 xf
  • C语言和数据结构与算法(99)

    2 数据类型 xff08 22道 xff09 2 1 用变量a给出下面的定义 xff08 1 xff09 一个整型数 xff1a int a xff08 2 xff09 一个指向整型数的指针 xff08 一重指针 xff09 xff1a i
  • 详解STL---vector

    目录 1 vector的介绍及应用 1 1vector的介绍 1 2vector的使用 1 2 1 vector的定义 1 2 2 vector iterator 的使用 1 2 3 vector 空间增长问题 1 2 4 vector 的

随机推荐

  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    一 委托 Delegate 1 委托 Delegate 简介 最近天气晴雨不定 你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去 于是你委托好友小明在天气发生变化时打电话通知你 这就是一种委托 下面是这种委托的实例代码 定义一个
  • 学习OpenMV(一)详细参数及简单介绍

    目录 一 Open MV 简介 1 OpenMV摄像头的特点 xff1a 2 OpenMV摄像头的应用 xff1a 3 规格 xff1a 二 搭建环境 xff0c Open MV IDE安装 1 Windows系统 2 Linux系统 三
  • IEEE trans on cybernetic被拒后可以和主编argue争取下吗

    IEEE trans on cybernetic xff1a 一审两个人审稿人 xff0c 主编的决定是reject amp resubmit 二审又增加了一个审稿人 xff0c 前两个审稿人都同意发表的情况下 xff0c 新加的审稿人提了
  • 获取IntelRealSense d435i 相机内参

    获取IntelRealSense d435i 相机内参 摘要实现 摘要 本文提供了一种获取IntelRealSense d435i相机内参的方法 实现 span class token macro property span class t
  • 用Clion代替keil对CubeMX生成代码进行编写的基础准备

    网上教程比较多 首先需要安装CubeMX Clion 以及相关的依赖 xff0c 不一一赘述 xff0c 可以参考以下链接 CLion xff1a 安装 搭建 配置 插件 忘尘 丶莫负的博客 CSDN博客 clion安装插件 在确认搭建好环
  • Ubuntu下如何创建工作空间(详细)

    Ubuntu下工作空间的创建方法 xff1a xff08 1 xff09 mkdir p catkin ws src 创建工作空间catkin ws和子目录src xff0c 自定义空间名 cd catkin ws 进入到工作空间catki
  • Turtlebot移动机器人gazebo仿真及自动导航(详细级)

    目的 在仿真环境中控制Turtlebot3 Burger运动 slam和自动导航 环境 xff1a 双系统下ROS为noetic xff08 其他版本的ROS注意在下载软件包时改成自己的ROS xff09 步骤 xff1a xff08 1
  • 【linux】linux中fork()详解(实例讲解)|fork的运行机制

    目录 linux中fork xff08 xff09 函数详解 从一道面试题谈linux下fork的运行机制 linux中fork xff08 xff09 函数详解 原文 xff1a linux中fork xff08 xff09 函数详解 x
  • 当面试官问你Promise的时候,他究竟想听到什么?

    1 什么是Promise xff1f Promise是异步操作的一种解决方案 2 为什么要使用Promise xff1f Promise能很好的解决层层嵌套的回调函数 xff0c 即回调地狱 callback hell 的问题 3 什么是回
  • win10安装Ubuntu16.04

    第一次安装双系统 xff0c 踩了不少坑 xff0c 花了两三天才装好 xff0c 因为电脑的不同 xff08 本人电脑联想小新i5 xff09 xff0c 网上那些安装过程有些不适用 xff0c 所以花了好长时间 xff0c 甚至差点决定
  • 12道C++经典笔试题及答案(2022)

    目录 一 题目 二 题目以及答案 一 题目 1 C和C 43 43 中的struct有什么区别 2 C 43 43 中的struct和class有什么区别 xff1f 3 如何判断一段程序是由C编译程序还是由C 43 43 编译程序的 xf
  • Java开发者出路在哪?牛皮轰轰

    正文 先问小伙伴们一个问题 xff0c 登录难吗 xff1f 登录有什么难得 xff1f 输入用户名和密码 xff0c 后台检索出来 xff0c 校验一下不就行了 凡是这样回答的小伙伴 xff0c 你明显就是产品思维 xff0c 登录看似简
  • 我阿里P7了解到的Android面试的一些小内幕!已拿offer

    前言 这些题目是网友去百度 小米 乐视 美团 58 猎豹 360 新浪 搜狐等一线互联网公司面试被问到的题目 熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率 欢迎一线公司员工以及网友提交面试题库 xff0c 欢迎留言 网上的都是按
  • Autoware激光雷达建图流程

    首先导入录制的包 点击 Play 按钮播放数据 xff0c 然后再点击 Pause 暂停播放 设置从base link到velodyne坐标系的TF 在 Baselink to Localizer 中设置好各个参数之后点击 TF 按钮 xf
  • Xshell连接不上虚拟机的解决办法

    目录 一 xff0c 首先检查对应的会话信息是否正确 二 xff0c 检查网络配置 三 xff0c 防火墙是否关闭 四 xff0c ssh服务是否开启 五 xff1a 更改网关 一 xff0c 首先检查对应的会话信息是否正确 xff08 1
  • 如何介绍简历中的项目呢?请看软件测试老师的分享

    项目经验与工作经验是相辅相成的 xff0c 但较之于工作经验 xff0c 项目经验更侧重于表现求职者在某个专业领域内的技能水平 xff08 技能水平决定了工资水平 xff09 因而 xff0c 技术类岗招聘的时候 xff0c 更注重项目经验
  • 正点原子飞控——代码学习笔记(一)

    手柄代码篇 我们直接看代码部分 xff0c 然后逐步深入了解 xff0c 如有不对的地方 xff0c 欢迎大家指证 xff01 xff01 第一阶段 设备内部的初始化 一 中断配置初始化 span class token macro pro
  • Ros安装

    前提 xff1a 若要安装ros xff0c 首先需要配置Ubuntu系统允许restricted xff08 不完全的自由软件 xff09 universe xff08 Ubuntu官方不提供支持和补丁 xff0c 全靠社区支持 xff0
  • 【mySQL】mysql数据库分页查询讨论专题

    目录 一 limit分页公式 总页数公式 1 limit分页公式 2 总页数公式 二 Mysql的三种分页方法 1 limit m n分页语句 xff08 低效 xff09 2 limit m语句 xff08 有局限 xff09 三 查询优
  • STM32——SysTick 定时器讲解(代码)

    一 SysTick 系统定时器简介 SysTick 系统定时器是属于CM3内核中的一个外设 xff0c 内嵌在NVIC中 系统定时器是一个24bit的向下递减的计数器 xff0c 计数器每计数一次的时间为1 SYSCLK xff0c 一般我