STM32HAL库微秒延时(μs)

2023-11-15

STM32HAL库微秒延时(μs)

单片机:STM32F407ZET6
软件版本:STM32CubeMX 4.20.1
单片机固件包:STM32Cube FW_F4 V1.15.0

本代码是我于2019年8月参加全国大学生电子设计竞赛前做赛前准备时参考网络上博客的程序代码编写,仅用于学习和交流。希望能给各位读者些许帮助。

本博客对于STM32单片机实现微秒(μs)延时采用的是定时器计数的方法。以STM32F407ZET6型号单片机的TIM4为例来进行代码展示。

先设置TIM4的时钟源:
在这里插入图片描述
STM32F407ZET6的TIM4的时钟为APB1的两倍即84MHz。
在这里插入图片描述
设置TIM4参数:
在这里插入图片描述
因为是微秒延时,所以计数频率应为f=1/1μs=1MHz。所以预分频Prescaler应为(84/f)-1=83,理论上来说计数周期Counter Period的设置将影响中断时长,而微秒延时只是计数并不需要开启定时器的中断。但是在实际开发过程中我将Counter Period设置为0结果延时时间变成随机时长,因此建议Counter Period不要设置为0。

微秒延时函数:

void Delay_us(uint16_t myus)//基于TIM4定时器的μs延时函数
{
 uint16_t differ = 0xffff-myus-5;
 HAL_TIM_Base_Start(&htim4);
 __HAL_TIM_SetCounter(&htim4,differ);
 while(differ < 0xffff-5)
 {
  differ = __HAL_TIM_GetCounter(&htim4);
 }
 HAL_TIM_Base_Stop(&htim4);
}

因为我是使用STMCubeMX搭建的工程,因此需要将这段延时函数加进tim.c中的 /* USER CODE BEGIN 1 / 和 / USER CODE END 1 / 中,并在tim.h中的 / USER CODE BEGIN Prototypes / 和 / USER CODE END Prototypes */ 中加上 void Delay_us(uint16_t ); 做函数声明。
接下来,我对这个微秒延时函数做一些解释说明:

  1. 函数功能解释:
    HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) 启动定时器;
    HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) 关闭定时器;
    __HAL_TIM_SetCounter和__HAL_TIM_GetCounter可在头文件stm32_hal_legacy.h中找到定义:
    在这里插入图片描述
    __HAL_TIM_SET_COUNTER 设定计数初值,默认是0;
    __HAL_TIM_GET_COUNTER 获取当前计数值。
  2. STM32单片机的定时器基本都是16位计数器每次记到0xffff就会重载arr值。因此给定时器应至少赋予初值为0xffff-myus。
  3. 为什么我在定时器基本初值的基础上还要再“-5”呢?
    这是为了防止因中断打断延时,造成计数错误。
    以延时1μs为例:延时1us因而应从0xfffe开始计数,但假设在这过程产生中断。由于被中断打断(此时计数器仍在计数),本因计数至0xffff便停止计数,但由于错过计数值,并重载arr值,将会导致实际延时(0xffff+1)us。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32HAL库微秒延时(μs) 的相关文章

  • 大数据挖掘、分析与应用

    第一讲 基础知识 大数据指无法在可承受的时间范围内用常规软件工具进行捕捉 管理和处理的数据集合 是需要新处理模式才能具有更强的决策力 洞察力和流程优化能力的海量高增长率和多样化的信息资产 数据挖掘 DataMining 是有组织有目的地收集
  • 安装SQLServer2008出现[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1

    问题 当我们卸载SQLServer2008后再重新安装后会出现以下问题 原因是卸载有时不能完全清理文件 解决方法 找到文件C Users user name AppData Local Microsoft Corporation删除Land
  • 深度学习Pytorch(十)——基于torchvision的目标检测模型

    深度学习Pytorch 十 基于torchvision的目标检测模型 文章目录 深度学习Pytorch 十 基于torchvision的目标检测模型 一 定义数据集 二 为PennFudan编写自定义数据集 1 下载数据集 2 为数据集编写
  • C++ 中基础的几种变量作用域,类作用域(C++复习向p5)

    文章目录 三种变量 变量作用域 初始化变量 类作用域 三种变量 局部变量 函数 代码块中的变量 形式参数 函数参数中定义的变量 在函数体中有效 全局变量 所有函数外部声明的变量 变量作用域 局部作用域 局部变量在函数执行完后销毁 全局作用域
  • 最全面的Socket使用解析

    前言 Socket的使用在Android的网络编程中非常重要 今天我将带大家全面了解Socket及其使用方法 目录 1 网络基础 1 1 计算机网络分层 计算机网络分为五层 物理层 数据链路层 网络层 运输层 应用层 其中 网络层 负责根据
  • 一次内网 Harbor 镜像仓库导出迁移过程记录

    1 整体思路 Harbor 提供有丰富的 API 接口 可以获取所有项目信息 镜像和标签等信息 通过编写 shell 脚本循环处理即可实现批量导出镜像包的需求 登陆 Harbor 后 左下角有 API 控制中心按钮 进入可以查看和调试 2
  • centos 安装配置l2tp实现***

    centos 安装配置l2tp实现 1 前言 L2TP是一种工业标准的Internet隧道协议 功能大致和PPTP协议类似 比如同样可以对网络数据流进行加密 不过也有不同之处 比如PPTP要求网络为IP网络 L2TP要求面向数据包的点对点连

随机推荐

  • OSI七层模型---数据链路层(以太网帧、MAC地址、MTU、MSS、ARP协议)

    我们首先来了解一下物理层的作用 物理层的主要目的是实现比特流的透明传输 为数据链路层提供服务 物理层接口解决了用几根线 多大电压 每根线什么功能 以及几根线之间是怎么协调的问题 物理层介质解决了数据载体材质以及价格优缺点的问题 通信技术解决
  • 01_I.MX6U芯片简介

    目录 I MX6芯片简介 Corterx A7架构简介 Cortex A处理器运行模型 Cortex A 寄存器组 IMX6U IO表示形式 I MX6芯片简介 ARM Cortex A7内核可达900 MHz 128 KB L2缓存 并行
  • 李宏毅 机器学习 2016 秋:6、Classification: Logistic Regression

    文章目录 六 Classification Logistic Regression 六 Classification Logistic Regression 我们来讲 Logistic Regression 我们在上一份投影片里面 我们都已
  • 点云Las格式分析及python实现

    目录 一 Las格式分析 1 公共头 2 变长记录 3 参考文献 二 安装laspy 2 0 2 三 代码实现 一 Las格式分析 1 公共头 公共头用来记录数据集的基本信息 如Li DAR点总数 数据范围 Li DAR点格式 变长记录总数
  • 在switch语句中使用字符串以及实现原理

    对于Java语言来说 在Java 7之前 switch语句中的条件表达式的类型只能是与整数类型兼容的类型 包括基本类型char byte short和int 与这些基本类型对应的封装类Character Byte Short和Integer
  • Go单体服务开发最佳实践

    单体最佳实践的由来 对于很多初创公司来说 业务的早期我们更应该关注于业务价值的交付 并且此时用户体量也很小 QPS 也非常低 我们应该使用更简单的技术架构来加速业务价值的交付 此时单体的优势就体现出来了 正如我直播分享时经常提到 我们在使用
  • 什么是等保合规

    近年来 随着国家对网络安全的重视 我国对网络安全的监管要求也越来越高 各互联网企业都在积极落实网络安全等级保护 关键信息基础设施安全保护制度 为了保护网络安全 企业也在按照 网络安全法 及 等保2 0 系列标准要求 积极寻求等级保护测评 整
  • C语言进阶:C陷阱与缺陷(读书笔记总)

    大家不要只收藏不关注呀 哪怕只是点个赞也可以呀 粉丝私信发邮箱 免费发你PDF 最近读了一本C语言书 C陷阱与缺陷 还不错 挺适合刚刚工作后的人 特此分享读书笔记 写代码时应注意这些问题 笔记已做精简 读完大概需要30min 如果读起来感觉
  • 广义线性模型(GLM)

    在线性回归中 y丨x N 2 在逻辑回归中 y丨x Bernoulli 这两个都是GLM中的特殊的cases 我们首先引入一个指数族 the exponential family 的概念 如果一个分布能写成下列形式 那么我们说这个分布属于指
  • Bert机器问答模型QA(阅读理解)

    Github参考代码 https github com edmondchensj ChineseQA with BERT https zhuanlan zhihu com p 333682032 数据集来源于DuReader Dataset
  • Unity基础3——Resources资源动态加载

    一 特殊文件夹 一 工程路径获取 注意 该方式 获取到的路径 一般情况下 只在 编辑模式下使用 我们不会在实际发布游戏后 还使用该路径 游戏发布过后 该路径就不存在了 print Application dataPath 二 Resourc
  • C++ vector find()使用? ( if!=vec.end())

    std vector find是C STL中的一个函数 它可以用来在std vector中查找给定的元素 如果找到了这个元素 它将返回一个迭代器指向该元素 否则将返回一个名为end 的迭代器 下面是一个使用find的示例代码 include
  • C++11 条件变量(condition_variable) 使用详解

    官网 一 总述 在C 11中 我们可以使用条件变量 condition variable 实现多个线程间的同步操作 当条件不满足时 相关线程被一直阻塞 直到某种条件出现 这些线程才会被唤醒 主要成员函数如下 二 具体函数 1 wait函数
  • 泰勒阵列天线综合与matlab,阵列天线综合之切比雪夫低副瓣阵列设计Matlab

    在 自适应天线与相控阵 这门课中 我了解到了关于理想低副瓣阵列设计的一些方法 其中切比雪夫等副瓣阵列设计方法是一种基础的方法 故将其设计流程写成maltab程序供以后学习使用 在此分享一下 此方法全称为道尔夫 切比雪夫综合法 简称为切比雪夫
  • 量化交易框架开发实践(二)

    我们通过分析代码可以看出 PyAlgoTrade分为六个组件 Strategies Feeds Brokers DataSeries Technicals Optimizer 从业务流上看也是比较容易理解的 Feed 数据源 gt Data
  • 【C++】常用math函数

    C语言提供了很多实用的数学函数 如果要使用先添加头文件
  • Python手撸机器学习系列(一):感知机 (附原始形式和对偶形式Python实现代码)

    感知机 1 感知机的定义 感知机是二分类的线性模型 是神经网络和SVM的基础 输入特征 x X x X x X 输出 y
  • Integer.valueOf()方法 java

    Integer valueOf 方法实现如下 public static Integer valueOf int i final int offset 128 if i gt 128 i lt 127 must cache return I
  • C++ 数据结构:DS单链表--合并

    题目描述 假定两个单链表是递增有序 定义并实现以下函数 完成两个单链表的合并 继续保持递增有序 int LL merge ListNode La ListNode Lb 输入 第1行先输入n表示有n个数据 接着输入n个数据 第2行先输入m表
  • STM32HAL库微秒延时(μs)

    STM32HAL库微秒延时 s 单片机 STM32F407ZET6 软件版本 STM32CubeMX 4 20 1 单片机固件包 STM32Cube FW F4 V1 15 0 本代码是我于2019年8月参加全国大学生电子设计竞赛前做赛前准