STM32 HAL库开发学习5. 系统滴答定时器

STM32 HAL库开发学习5. 系统滴答定时器

  • 一、滴答定时器概述
    • 1. 概述
    • 2. 时钟源
    • 3. 寄存器
      • (1)控制与状态寄存器 STK_CTRL
      • (2)重载寄存器 STK_LOAD
      • (3)当前值寄存器 STK_VAL
  • 二、HAL库滴答定时器初始化
  • 三、SysTick实现微秒级延时
    • 1. 使用 STM32CubeMX创建工程
    • 2. 代码实现

一、滴答定时器概述

1. 概述

滴答定时器是Cortext-M内核的一个简单定时器。
滴答定时器是一个24位的递减计数器,主要用于为嵌入式系统提供基本的定时功能,也为实时操作系统RTOS提供系统节拍。

2. 时钟源

滴答定时器有两个可选的时钟源,一个是处理器内核时钟: HCLK,另一个是外部参考时钟。

当定时器启动后,它会从设定的初始值开始递减计数。每经过一个时钟周期,计数器值减1.当计数器减到0,会产生一个中断请求,并且可以根据设置重新加截初始值。

3. 寄存器

(1)控制与状态寄存器 STK_CTRL

该寄存器用于控制滴答定时器的主要功能。其中包含了启动 / 停止定时器的位(ENABLE 位),如果将此位置 1,则启动定时器;若置 0,则停止定时器。
还有用于控制中断使能的位(TICKINT 位),当这个位置 1 时,定时器计数到 0 时会产生中断;置 0 则禁止中断。
另外,有一个位用于指示定时器当前是否正在计数(COUNTFLAG 位),可以通过读取这个位来确定定时器是否已经完成了一次计数循环。

(2)重载寄存器 STK_LOAD

这个寄存器用于设置滴答定时器的初始计数值。因为定时器是 24 位的,所以可以设置的最大值为 。通过设置这个寄存器的值,可以确定定时器每次计数循环的时长。例如,根据所选的时钟源频率和想要实现的定时周期,计算出相应的初始值并写入这个寄存器。

(3)当前值寄存器 STK_VAL

可以读取当前定时器计数器的剩余值。不过需要注意的是,在某些情况下读取这个寄存器的值可能会受到限制或者需要特殊的操作顺序。例如,在一些芯片中,可能需要先暂停定时器(通过清除 ENABLE 位)才能准确读取当前值。

二、HAL库滴答定时器初始化

使用 STM32CubeMX 生成的项目里,main函数会调用 HAL_Init();
进入该函数,可以看到如下调用 :


  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);

// 宏的值
#define  TICK_INT_PRIORITY            15U    /*!< tick interrupt priority (lowest by default)  */

这里即实现了滴答定时器的初始化。

三、SysTick实现微秒级延时

本实验实现微秒及翻转IO端口。

1. 使用 STM32CubeMX创建工程

在这里插入图片描述

GPIO里,配置PA8为输出,
SYS里,配置时间基准源为SysTick,Debug 为Serial Wire。
RCC,时钟源,把 High Speed Clock(HSE) 选择: Crystal/Ceramic Resonator。
然后把时钟配置 HCLK设置为72MHz:
在这里插入图片描述
回车,提示窗口选择OK,系统自动把PLL设置好。

打开生成的项目。

2. 代码实现

/**
 * @brief 微秒级延时
 * @param us
 */
void my_delay_us(uint32_t us) {
    uint32_t ticks_per_us = SystemCoreClock / 1000000;
    uint32_t start_ticks = SysTick->VAL;
    uint32_t delay_ticks = us * ticks_per_us;
    if (delay_ticks > start_ticks) {
        delay_ticks = delay_ticks - start_ticks + SysTick->LOAD;
    } else {
        delay_ticks = delay_ticks + SysTick->LOAD - start_ticks;
    }
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
    while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) {
        if ((SysTick->LOAD - SysTick->VAL) > delay_ticks) {
            break;
        }
    }
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

/**
 * @brief 毫秒级延时
 * @param ms
 */
void my_delay_ms(uint32_t ms) {
    while (ms--) {
        my_delay_us(1000);
    }
}

main函数:

int main(void) {

    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    /* USER CODE BEGIN 2 */

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1) {
        /* USER CODE END WHILE */
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
        my_delay_ms(1);
        /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
}

在PA8观察输出的波形:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的养老院管理系统的设计与实现

一、前言 随着人口老龄化的加剧&#xff0c;养老院作为老年人养老的重要场所&#xff0c;其管理的高效性和科学性显得尤为重要。传统的养老院管理方式多依赖人工操作&#xff0c;存在信息记录不及时、不准确&#xff0c;管理流程繁琐&#xff0c;资源调配困难等问题。利用信息技…

Scala:正则表达式

object test03 {//正则表达式def main(args: Array[String]): Unit {//定义一个正则表达式//1.[ab]:表示匹配一个字符&#xff0c;或者是a&#xff0c;或者是b//2.[a-z]:表示从a到z的26个字母中的任意一个//3.[A-Z]:表示从A到Z的26个字母中的任意一个//4.[0-9]:表示从0到9的10…

Tomcat,javaweb, servlet , springBoot

在server.xml里配置服务器 <scope>provided</scope>打包的时候&#xff0c;这个jar包不会被打进去&#xff0c;因为tomcat已将封装了这个jar包&#xff0c;没必要要这个

AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!

AIGC 012-Video LDM-Stable Video diffusion前身&#xff0c;将LDM扩展到视频生成任务&#xff01; 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者&#xff0c;作者在SD的架构上进行扩展&#xff0c;实现了视频的生成。后续在Vid…

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100&#xff0c;默认Value值也为100&#xff0c;默认声音开到最大 这里目前完全由前端控制音量调节&#xff0c;可以直接使用ValueChanged事件实…

计算机网络实验三:wireshark的使用

一、wireshark介绍 wireshark是非常流行的网络封包分析软件&#xff0c;功能十分强大。可以截取经过电脑的各种数据包&#xff0c;显示网络封包的详细信息。wireshark能获取HTTP&#xff0c;也能获取HTTPS&#xff0c;但是不能解密HTTPS&#xff0c;所以wireshark看不懂HTTPS中…

Android hid 数据传输(device 端 )

最近一直在处理hid 数据需求&#xff0c;简而言之就是两台设备直接可以通过usb 线互相传递数据。 项目架构 为什么Device 端要采用HID&#xff08;人机接口设备&#xff09;的方式发送和接收数据呢&#xff1f; 主要是速度快&#xff0c;举个例子&#xff0c;就是鼠标移动&am…

在玩《黑神话:悟空》时游戏画面卡顿是什么原因?游戏画面卡顿要怎么解决?

《黑神话&#xff1a;悟空》游戏画面卡顿问题解析与解决方案 在探索《黑神话&#xff1a;悟空》这款引人入胜的游戏时&#xff0c;玩家可能会遇到游戏画面卡顿的困扰。本文将深入剖析《黑神话&#xff1a;悟空》游戏画面卡顿的原因&#xff0c;并提供实用的解决方法。 游戏画面…

小迪安全笔记 第四十四天 sql盲注 实战利用sql盲注 进行漏洞的利用

sql盲注的分类 什么是盲注 就是我们什么也不知道的情况下进行的注入 前边的注入 都是简单的注入 我们猜测 数据类型 之后 可以直接 union 去查 这种情况多用于 数据库增删查改中的 查 bool盲注也用于查 这个的情况的就是我们前边都试了 没有用 就需要…

【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

mac port 安装redis 并设置为系统服务 自定义配置方法

mac系统中&#xff0c;port 包管理工具比brew的速度快N倍&#xff0c;今天就给大家分享一下在macos系统中如何使用 port安装 redis数据库并配置为服务自动启动和自定义redis.conf配置的方法。 1. 安装redis sudo port install redis 2. 启动redis服务 sudo port load redis …

在Docker中部署禅道,亲测可用

1、确保centos中已安装docker docker -v 2、启动docker systemctl start docker 3、可设置docker开机启动 systemctl enable docker.service 4、获取最新版禅道开源版镜像 docker pull idoop/zentao 5、运行镜像生成禅道容器【创建 /data/www /data/data 目录】 doc…

聚合支付系统官方个人免签系统三方支付系统稳定安全高并发

系统采用fastadmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一-些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置对接! 注意&#xff1a;系统没有配置文档很使用教程&#xff0c;不清楚…

Flutter项目初始化android版

1、本机系统环境 window11flutter sdk 版本flutter_windows_3.24.5-stable.zip (下载地址&#xff1a;https://docs.flutter.dev/get-started/install/windows/mobile)android studio 版本 Android Studio Giraffe | 2022.3.1vscode 2、VSCODE 配置flutter 安装flutter插件 …

(四)lerobot开源项目的主从臂的远程操作(带相机)(操作记录)

目录 《项目简介》 一、​B站视频参考&#xff08;推荐&#xff09; 二、确定两个usb相机的端口号 三、远程操作&#xff08;带相机&#xff09; 四、遇到问题 《项目简介》 项目地址&#xff1a;GitHub - huggingface/lerobot: &#x1f917; LeRobot: Making AI for Ro…

【HarmonyOS开发】超详细的ArkTS入门

安装DevEco Studio和新建项目就不多说了&#xff0c;可以移步官网 就可以把他们拆成这几个部分了&#xff0c;如果看不懂可以暂时忽略下面冒号后面的内容 装饰器&#xff1a;用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component和St…

ByConity ELT 小测

借着 ByConity 的邀测活动体验一下 bsp 能力&#xff0c;ByConity 也很贴心的提供了标准环境&#xff0c;下面开始体验。 测试环境 版本 配置 ByConity v1.0.1 集群规格 Worker&#xff1a;4 * 16core 64G Server&#xff1a;1 * 16core 64G TSO&#xff1a;1 * 4core 16…

【Android】从事件分发开始:原理解析如何解决滑动冲突

【Android】从事件分发开始&#xff1a;原理解析如何解决滑动冲突 文章目录 【Android】从事件分发开始&#xff1a;原理解析如何解决滑动冲突Activity层级结构浅析Activity的setContentView源码浅析AppCompatActivity的setContentView源码 触控三分显纷争&#xff0c;滑动冲突…

【C#】NET 9中LINQ的新特性-CountBy

前言 在 .NET 中,使用 LINQ 对元素进行分组并计算它们的出现次数时,需要通过两个步步骤。首先,使用 GroupBy方法根据特定键对元素进行分类。然后,再计算每个组元素包含个数。而随着 .NET 9 版本发布,引入了一些新特性。其中 LINQ 引入了一种新的方法 CountBy,本文一起来了…

【C++】深入理解 if-else 语句

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;if-else 语句基础概述1.1 if 语句1.2 else 语句注意事项&#xff1a; 1.3 单条语句和语句块的区别 &#x1f4af;else if 语句与嵌套 if2.1 else if 的本质2.2 else if 的优…