用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本)

2023-11-02

概述

​ 在使用 DHT11 的时候,时序通信需要微秒来操作,STM32CubeMX 自带一个系统时钟,但是实现的是毫秒级别的。因此就自己用通用计时器实现一个。

环境:

  • 开发板:STM32F4探索者(正点原子)

1.配置定时器时钟

  • 选择时钟源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KJD8ucuO-1606756942997)(I:\net\STM32CubeMX\文档\定时器相关\image\选择时钟源_us.png)]

    这里选择的是内部时钟,来自 RCC 的TIMxCLK,在通用定时器框图中我们可以看到如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r83Q2abK-1606756943000)(I:\net\STM32CubeMX\文档\定时器相关\image\通用定时器部分系统框图_us.png)]

而我们可以在 STM32F4xx中文参考手册中找到,TIM2 在外设总线1(APB1上),因此其时钟为 84MHz,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9sX1Wbv-1606756943001)(I:\net\STM32CubeMX\文档\定时器相关\image\TIM2时钟来源.png)]

2.计数器时钟频率及计数模式

除了配置定时器的时钟,还需要配置计数器时钟频率,我们要实现微秒延时,因此计数器时钟频率应该是1MHz,

而要实现还需要以下3个参数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJGZUbDt-1606756943004)(I:\net\STM32CubeMX\文档\定时器相关\image\计数器3个参数配置.png)]

  • 预分频系数

根据STM32F4xx中文参考手册中的时钟频率计算,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faIwQNJk-1606756943006)(file:///I:/net/STM32CubeMX/%E6%96%87%E6%A1%A3/%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9B%B8%E5%85%B3/image/%E8%AE%A1%E6%95%B0%E5%99%A8%E6%97%B6%E9%92%9F%E9%A2%91%E7%8E%87%E8%AE%A1%E7%AE%97.png?lastModify=1606749963)]

其中fCK_PSC就是通用定时器框图中的CK_PSC, 即值为84MHz,而我们所要的计数器时钟频率1MHz

因此:

PSC[15:0] = (fCK_PSC/CK_CNT) - 1 
          = (84/1) - 1
          = 83

因此预分频系数为 83

  • 计数器模式

    计数器这里采用向下计数模式,也就是 如设置计数值为 1000,那么每隔一个微秒,就减一,一直减到 0

  • 自动重装载值

    虽然我们并不使用自动重装载功能,但是,我们还是要对自动重装载寄存器进行赋值且不赋值为0即可,但是我测试时发送,如果为1,延时会出现偏差,因此这里赋值为 2,依据如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYCeSQm3-1606756943008)(I:\net\STM32CubeMX\文档\定时器相关\image\自动重装载值.png)]

3.打开定时器中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPmxGfdm-1606756943010)(I:\net\STM32CubeMX\文档\定时器相关\image\打开定时器2的中断.png)]

4.具体实现代码

volatile bool elapsed = false; //用于判断设置的计数值是否耗尽(向下计数模式),耗尽时,在中断中奖会设置为true

void setState(bool state)
{
    elapsed = state;
}

bool getState()
{
    return elapsed;
}

void usDelay(uint32_t time)
{

    __HAL_TIM_SetCounter(&htim2,time); //设置计数值
     setState(false);                  
     HAL_TIM_Base_Start_IT(&htim2);		//开启定时器
     while(!getState());				//判断计数值是否耗尽
     HAL_TIM_Base_Stop_IT(&htim2);		//关闭定时器
 
}

计数值耗尽回掉函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == TIM2) {
		setState(true);
	}
	
}

5.代码测试

主函数的主循环中:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      printf("hello usDelay");
      for(int i = 0; i < 1000; i++)
      {
            usDelay(1000);
      }
      
  }

在串口调试助手中,可以看到如下,一秒打印一条语句[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GQ4FK2gD-1606756943014)(I:\net\STM32CubeMX\文档\定时器相关\image\测试图片.png)]

项目代码已上传,欢迎下载!
后续也将分享如何使用该函数读取 DHT11 温湿度传感器的值,欢迎点赞,关注,赞赏我!

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

用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本) 的相关文章

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

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

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

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 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 风
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一

随机推荐

  • 【蓝桥杯Python】基础练习17:矩阵乘法

    试题 基础练习 矩阵乘法 目录 题目 资源限制 问题描述 输入格式 输出格式 样例输入 样例输出 解答 Python源代码 题目 资源限制 时间限制 1 0s 内存限制 512 0MB 问题描述 给定一个N阶矩阵A 输出A的M次幂 M是非负
  • 多因素方差分析_多因素方差分析(1)

    之前介绍的方差分析 称之为是单因素方差分析 one way ANOVA 主要研究单个因素对因变量的影响 多因素方差分析 是研究多个 2个或2个以上 自变量对因变量的影响 可以直观表现为以下公式 单因素方差分析 Yi a b Xi e 多因素
  • c语言变参宏和利用变参宏的一些简单的打印实现

    一些函数 如printf 接受数量可变的参数 stdvar h头文件提供了工具 让用户自定义带可变参数的函数 通过把宏参数列表中最后的参数写成省略号 即3个点 来实现这一功能 这样 预定义宏 VA ARGS 可用在替换部分中 表明省略号代表
  • Java的运算符及开发环境的安装

    一 运算符 1 赋值运算符 变量名 表达式 符合赋值运算符 2 算术运算符 整除 求余 在后 先用再加 在前 先加再用 3 关系运算符 如 gt lt gt lt char类型是可以比较 因为char类型存储的是对应的ASCII 判断一个字
  • 哪些循环依赖问题Spring解决不了?

    前言 大家都知道 Spring 解决了循环依赖的问题 网上也可以搜到 Spring 是使用三级缓存来解决循环依赖的 但有些时候循环依赖问题还是会导致启动报错 也就说明 在某些情况下 Spring 是没有办法解决循环依赖问题的 我们就来探究一
  • JIRA工作流节点状态变化前弹出窗口填写日志或者备注

    一 定义弹出框的页面 1 进入问题管理页面 并点添加屏幕 2 自定义弹出页面的名称 3 点击添加后会进入配置页面 配置页面所包含的字段 二 在工作流中配置页面 1 进入工作流编辑页面双击需要添加弹出页面的流程 2 在弹出框中页面栏选择刚刚配
  • Python爬虫必备:浏览器开发者工具的使用,非常详细

    最近很多小伙伴说 不会用浏览器开发者工具 今天我们就一起来深入了解一下开发者工具 以谷歌浏览器为例 谷歌浏览器开发者工具中的Network 是我们学习经常用到的 那么你都知道他们每个功能的意义吗 因本人经常有360极速浏览器 谷歌内核 所以
  • vue pdf.js统计pdf的页数

    参考链接作者原文展示了PDF 我只需要一部分功能
  • Adobe进军AI第一步——Firefly试用体验

    在关于人工智能讨论度高居不下的今天 各个行业的领路企业也纷纷不甘落后 Adobe作为媒体界的行业标杆 就在近期推出了自己的人工智能图像应用 萤火虫firefly 虽然这只萤火虫刚刚 起飞 它已经展现的文字生图和能力算是及格 我分别在网页版和
  • spark-submit 碰到 Spark-submit:System memory 466092032 must be at least 471859200

    在利用spark进行分布式计算时 home hadoop spark spark 2 4 0 bin hadoop2 7 bin spark submit master yarn ALS py 以上代码是在centos7 利用spark集群
  • vim 一段代码整体移动

    方法1 可以用ctrl v 然后上下移动光标 再shift i进入编辑模式 然后按删除或者空格或者tab键来移动第一行 然后按ESC 就能整段代码动起来了 方法2 1 点击 esc 键进入命令模式 使用 set nu 显示行号 2 点击 e
  • 又是第一!GBASE南大通用蝉联中国分析型数据库管理系统市场TOP1

    报告指出 大数据时代 用户对数据分析的需求不断提升 希望从大量数据中获得新的数据价值 数据分析需求不断上升 分析型数据库市场保持稳定增长 GBASE南大通用作为分析型数据库市场的代表企业 位居本土厂商第一名 在分析型数据库市场 GBASE自
  • 插件分享

    前言 要问我Goby怎么样 我会坚定回答你 最强实时网络空间测绘 没有之一 初次发现Goby还是来自于同事 hq404的推荐 看完第一反应 真漂亮 我馋了 我要xxxxxx 其Logo和UI做的相当棒 当然不仅拥有华丽的外表 更让我深爱又离
  • python爬取新发地菜价

    import requests from bs4 import BeautifulSoup import csv url http www xinfadi com cn marketanalysis 0 list 1 shtml respo
  • 【机试练习】【C++】【PAT A1053】Path of Equal Weight(玄学一样的“段错误”)

    此题有较大的玄学 如果将cmp函数的默认返回值更改为true 则会出现最后一个测试用例的 段错误 在代码中以 我的天 玄学 标识出 include
  • Java阻塞队列

    目录 一 阻塞队列的特点 二 生产者 消费者 存在问题 三 阻塞队列 Java实现 属性 方法 put方法 生产者 线程专门调用的方法 get方法 消费者 线程专门调用的方法 执行顺序分析 图解 在我们上图的代码当中 如果把while改成i
  • Sharding-JDBC(八)5.3 系列升级解读

    目录 一 背景 二 影响范围 1 Maven 坐标调整 2 自定义算法调整 3 事务调整 4 配置文件调整 三 升级指导 1 新的 ShardingSphereDriver 数据库驱动 2 正在使用 Spring Boot Starter
  • 2023华为OD机试真题【找朋友/单调栈】

    题目描述 在学校中 N个小朋友站成一队 第i个小朋友的身高为height i 第i个小朋友可以看到的第一个比自己身高更高的小朋友j 那么j是i的好朋友 要求j gt i 请重新生成一个列表 对应位置的输出是每个小朋友的好朋友位置 如果没有看
  • python爬虫系列5--xpath

    教程地址 http www runoob com xpath xpath tutorial html XPath在python的爬虫学习中 起着举足轻重的地位 对比正则表达式re两者可以完成同样的工作 实现的功能也差不多 但XPath明显比
  • 用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本)

    概述 在使用 DHT11 的时候 时序通信需要微秒来操作 STM32CubeMX 自带一个系统时钟 但是实现的是毫秒级别的 因此就自己用通用计时器实现一个 文章目录 概述 1 配置定时器时钟 2 计数器时钟频率及计数模式 预分频系数 计数器