【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

2023-05-16

SysTick定时器,也叫滴答定时器或者系统定时器。

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

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

  • Systick定时器是一个比较简单的定时器,常用于延时或者计时,也可以用作实时系统的心跳时钟。节省通用定时器的资源。
  • 只要不把Systick定时器关闭,它就会循环往复计时,在睡眠模式下也能工作。
  • Systick中断的优先级也可以设置。


4个Systick寄存器

 

SysTick库函数

SysTick中断服务函数

void SysTick_Handler(void);

库函数中SysTick的定义以及其寄存器对应地址的映射如下: 

//systick寄存器对应的映射地址,包装在一个结构体中

typedef struct
{
  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
} SysTick_Type;

Delay延时函数

相比于51单片机直接生成的延时函数,STM32的延时函数就比较复杂了,但是可以直接cv

#include "stm32f10x.h"
#include "Delay.h"


static uint8_t  us = 0;
static uint16_t ms = 0;

void Delay_Init(uint8_t MHz)	//72MHz
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//8分频,72M/8=9M
	us = MHz/8;					//1us计数9个
	ms = (uint16_t)us*1000;		//1ms计数9000个
}

/*说明
2的24次方 = 3个2的8次方 = 256*256*256 = 16777216	(24位递减计数器计数个数)
16777216/9000 = 1864.135	(能计时1864ms,最多计时1.864s)
注意最大定时时间为1.864s
*/

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,参数最大写1864
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	uint32_t temp;
	SysTick ->LOAD = (uint32_t)ms*xms;	//重载值
	SysTick ->VAL  = 0;
	SysTick ->CTRL |= SysTick_CTRL_ENABLE_Msk;//软件方式开启计数器,使能
	//开启计数器另一种写法	SysTick ->CTRL = 0x01;
	do{
		temp = SysTick ->CTRL;
	}while( (temp & 0x01) && !(temp & (1<<16)) );	//COUNTFLAG = 1,就代表计数完毕
	//(temp & 0x01)	检查计数器是否开启

	SysTick ->VAL  = 0;
	SysTick ->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
	//关闭计数器另一种写法	SysTick ->CTRL = 0x00;
}


/**
  * @brief  微秒级延时
  * @param  ums 延时时长
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	uint32_t temp;
	SysTick ->LOAD = us*xus;
	SysTick ->VAL  = 0;
	SysTick ->CTRL |= SysTick_CTRL_ENABLE_Msk;
	do{
		temp = SysTick ->CTRL;
	}while( (temp & 0x01) && !(temp & (1<<16)) );

	SysTick ->VAL  = 0;
	SysTick ->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

在使用延时函数前,记得初始化延时函数

Delay_Init(72); //初始化延时函数 

另一版本……也可以直接用

/**
* @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);
}
} 

 这个就不需要初始化等,直接用即可

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

【STM32】滴答时钟24位递减计数器系统时钟【SystTick】 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • Stratis和VDO高级存储

    Stratis和VDO高级存储 Stratis和vdo高级存储Stratis高级存储简介配置stratis服务 VDO高级存储简介配置VDO服务 Stratis和vdo高级存储 Stratis高级存储 简介 Stratis原理 xff1a
  • C语言 strstr函数的用法及模拟实现strstr函数

    C语言 strstr函数的用法及模拟实现strstr函数 一 strstr函数的用法二 模拟实现strstr函数的功能 一 strstr函数的用法 1 strstr函数原型 xff1a char strstr const char str1
  • Linux【shell命令以及运行原理】【权限】

    目录 一 shell命令以及运行原理 二 权限 1 用户的权限 2 文件的权限 3 权限的相关操作 第一种方法 第二种方法 改变所有者和所属组 常见的权限问题 1 目录的权限 xff1a 2 umask 粘滞位 如何将用户添加到信任列表赋予
  • 【Oracle】ORA-28000解决方法

    ORA 28000 账号被锁定 错误原因 xff1a 数据库中设置了密码最 错误次数为10次 xff0c 超过10次后导致账号被锁定 解决方案1 xff1a 1 查看 户使 的概要 件名 xff0c 般为DEFAULT SELECT USE
  • dpkg命令的用法

    dpkg命令的用法 dpkg 是Debian package的简写 xff0c 为 Debian 操作系统 专门开发的套件管理系统 xff0c 用于软件的安装 xff0c 更新和移除 所有源自 34 Debian 34 的Linux的发行版
  • 关于正则表达式的学习

    今天在写cpp题目的时候被字符串搜索恶心坏了 于是乎开始自学正则表达式 正则regex其实就是一个规范化的模板字符串 第一条 基础语法和注意事项 另外 在使用转义特殊字符的时候 要用到两个 才能有效果 b才代表一个数字 才能代表一个 34
  • 扩展卡尔曼滤波(EKF)

    本篇文章是看完http blog csdn net adamshan article details 78265754这篇文章后再加上自己的理解写的 xff0c 如果侵权可以联系我删除 xff0c 如果有不对的地方请您不啬赐教 xff01
  • OVS 基本操作命令

    1 ovs vsctl获取或者更改ovs vswitchd的配置信息 xff0c 此工具操作的时候会更新ovsdb server中的数据库 查看网桥 ovs vsctl show 添加网桥 ovs vsctl add br br0 创建po
  • 解决c++string类型变量无法输出中文的问题(环境:mingw+vscode)

    我也是在网上找了好久解决办法 其实很简单在visual code终端中输入chcp 936即可
  • 利用ros进行双目相机标定(发布双目相机话题再用cameracalibrator.py文件进行标定)

    1 创建工作环境 mkdir p opencv test src cd opencv test src catkin create pkg stereo camera std msgs roscpp rospy 2 修改CMakeLists
  • 串级PID 位置环+速度环

    1位置环和速度环的串级pid xff0c 首先要记住 xff0c 位置环的输出是速度环的输入 xff0c 最后控制输出为速度环的输出 速度环的PID控制器 代码如下 float Velocity KP A 61 400 Velocity K
  • 通过蓝点无限的学习,对UWB实现的过程以及对UWB连接WIFI的遇到的问题进行复盘

    超宽带 xff08 Ultra Wide Band xff0c UWB xff09 技术是一种无线载波通信技术 xff0c 它不采用正弦载波 xff0c 而是利用纳秒级的非正弦波窄脉冲传输数据 xff0c 因此其所占的频谱范围很宽 UWB技
  • Java——this关键字

    关于Java语言当中的this关键字 xff1a 1 this是一个关键字 xff0c 翻译为 xff1a 这个 2 this是一个引用 xff0c this是一个变量 xff0c this变量中保存了内存地址指向了自身 xff0c thi
  • 【开源“青女四轴”,DIY小四轴】

    开源 青女四轴 xff0c DIY小四轴 简介说明明确难点如何解决动态调节每个电机的升力 xff1f 硬件原理图如下 程序设计步骤建议最终程序声明 简介 四轴和遥控的主控芯片均为STM32F103C8T6 此开源项目为 从硬件设计到飞控的代
  • 实测 (二)NVIDIA Xavier NX + D435i / 奥比中光Astrapro 相机+ ORB-SLAM 2 + 3 稠密回环建图

    开发环境 xff1a NX 43 Ubuntu18 04 43 ROS melodic 接着上篇 xff0c 开始orb slam2稠密回环建图 二 NX 43 D435i 43 ORB SLAM2 稠密回环建图 先上效果图 这里感谢大神提
  • ubuntu 启用root用户及root用户远程登陆

    介绍 ubuntu安装好的时候你设置的用户并不是拥有最高权限的用户 xff0c 而最高权限的用户root需要你来启用他 xff01 如果用自己设置的用户会比较麻烦 xff0c 经常需要在命令前面加上 sudo xx 做法 1 首先右键开启一
  • 实测 (四)NVIDIA Xavier NX + D435i / 奥比中光Astrapro 相机+ ORB-SLAM 2 + 3 稠密回环建图

    来了 xff01 接着上篇 xff0c 开始orb slam3 的稠密回环建图实测 xff08 奥比中光Astrapro 相机 xff09 老样子 xff0c 先上效果图 xff1a 开发环境 xff1a NX 43 Ubuntu18 04
  • 无人机组装调试教程

    无人机 北郊强哥笔记 多轴飞行器如何称得上无人机 xff1f 关键在飞控 xff1a 飞控包括低端飞控 xff08 如kk xff0c QQ xff0c cc3D xff09 和智能化飞控 xff08 如APNM NAZA PIXHAWK
  • 51和STM32的Keil环境搭建

    前言 笔者由于竞赛需要 xff0c 最近开始学习STM32H7系列芯片 xff0c 由于之前并没有学习过32 xff0c 且51也是较早时期学习 xff0c 对于一些概念一知半解 xff0c 没有得到很好的吸收 xff0c 所以在基础较差的
  • 【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

    SysTick定时器 xff0c 也叫滴答定时器或者系统定时器 SysTick 系统定时器是属于CM3内核中的一个外设 xff0c 内嵌在NVIC中 系统定时器是一个24位的向下递减的计数器 xff0c 计数器每计数一次的时间为1 SYSC