概述

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

文章目录

环境:

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

1.配置定时器时钟

  • 选择时钟源

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

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

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

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

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

  • 预分频系数

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

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

因此:

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

因此预分频系数为 83

  • 计数器模式

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

  • 自动重装载值

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

3.打开定时器中断

4.具体实现代码

volatile bool elapsed = false; //用于判断设置的计数值是否耗尽(向下计数模式),耗尽时,在中断中奖会设置为truevoid 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);}}

在串口调试助手中,可以看到如下,一秒打印一条语句

测试代码已上传我的博客,欢迎来下载。

后续也将分享如何使用该函数,读取 DHT11 温湿度传感器的值

后续我还会继续分享STM32CubeMX的相关操作,相信你会学到更多知识,我会在[ STM32CubeMX专栏 ]持续更新,来关注本专栏吧!

文章有帮助到你,点赞,收藏,关注我吧!

stm32cubemx中文_用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本)相关推荐

  1. stm32通用定时器用做外部脉冲计数器的例程

    最近几天要用到stm32对外部输入脉冲进行计数,很自然想到定时器,可是手上资料没有讲解stm32定时器如何用作外部计数器的,在网上找例程,也没找到几个正确的,自己硬着头皮仔细研究参考手册,终于知道如何 ...

  2. STM32基本定时器做万能遥控器

    STM32基本定时器做万能遥控器 使用资源介绍 基本思路 捕获NEC输入波形 输出存储的NEC波形 部分代码 总结 使用资源介绍 1:基本定时器:定时计数的功能 2:外部中断:下降沿上升沿触发方式,进 ...

  3. STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

    参考:stm32定时器与定时器中断 作者:打酱油的 发布时间: 2021-04-11 01:04:09 网址:https://blog.csdn.net/weixin_46098612/article ...

  4. stm32通用定时器1s延时实现LED闪烁

    stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下: 步骤总结: 使能定时器时钟->配置定时器结构体->清空定时器标志位 ...

  5. STM32 通用定时器原理介绍

    一.STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成.STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ...

  6. STM32——通用定时器

    一.三种定时器区别 定时器分为:高级定时器.通用定时器和基本定时器 二.通用定时器功能特点描述 STM32F4的通用TIMx(TIM2.TIM3.TIM4和TIM5)定时器功能特点包括: ·16/32 ...

  7. stm32延时us寄存器_自己写一个STM32 HAL库的US微秒延时函数

    当本菜鸟开始接触STM32的时候还是看了原子哥的寄存器教程才跳坑的. 现在ST已经把HAL库推向了主流,但是令我不解的是,HAL那么强大,居然没有一个微秒级别的延时函数?! 黑人问号脸. 好了,废话不 ...

  8. stm32关定时器_手把手之STM32通用定时器(一)

    ●通用定时器(TM2~TM5) 通用定时器由芯片来管理,可以实现向上计数.向下计数.或者上下同时计数.而且这些定时器还有其他功能:输入捕捉.输出比较.PWM.单脉冲. ●从手册到流程 定时器的主要模块 ...

  9. STM32通用定时器实现us微秒延时

    为了获取精确延时,STM32芯片中往往会使用内核中的嘀嗒时钟Systick作为参考时钟.当嘀嗒时钟被占用做其他用途时,比如RTOS中的节拍器:就需要采用其他方法进行延时. 这里提出一种采用通用定时器作 ...

最新文章

  1. 微生物组数据揭示中国稻谷产毒真菌分布及仓储动态变化
  2. 深度学习核心技术精讲100篇(五十五)- 基于OpenCV实现棋盘图像识别
  3. Eclipse RCP使用SWT.EMBEDDED方式显示batik的svgCanvas后窗口最大化变白问题
  4. 『实践』Matlab实现Flyod求最短距离及存储最优路径
  5. sqlserver2008链接服务器的使用和oracle11g客户端修改字符集
  6. 推荐系统系列教程之十六:深度和宽度兼具的融合模型
  7. ECSHOP 如何删除商品列表页 购买弹出 商品属性框后面的价格
  8. pkill -kill -t pts/1
  9. Linux RT(1)-硬实时Linux(RT-Preempt Patch)在PC上的编译、使用和测试
  10. webstorm js没有代码提示
  11. CANTest及CANPro软件滤波设置说明
  12. python最优投资组合_CVXOPT投资组合优化
  13. spring-AOP 增强接口Introductions
  14. 针对唯一化实例对话框程序,及其命令行操作方法
  15. C#:定义一抽象类Pet(宠物)类,作为基类
  16. 【参透浏览器原理】1—— 为什么明明浏览器只打开了一个页面,却出现了多个进程
  17. 有功功率,无功功率,视在功率定义
  18. java iplimage 头文件_JavaCV – 为什么IplImage.createFrom(image)不再存在?
  19. 复分析阿尔福斯下载中文_《复分析(原书第3版)》([美]阿尔福斯(Ahlfors,L.V.))【摘要 书评 试读】- 京东图书...
  20. lombok构造模式

热门文章

  1. 向日葵在mac不能以服务器运行吗,mac远程桌面连接在哪?向日葵可以实现mac远程连接吗?...
  2. java中事物的注解_编程式事务、XML配置事务、注解实现事务
  3. eclipse中文乱码解决_解决git status显示中文文件名乱码问题
  4. dpdk18.11 收发包流程分析
  5. 怎么求平均数_EXCEL怎么求企业连续几年业绩的平均增长率
  6. 前端工具:推荐几款UI设计师好用的设计软件
  7. 手机技巧:是否应该一次性给手机充电到100%?看完你就明白了!
  8. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍
  9. 华为鸿蒙系统技术细节盘点
  10. 收集Linux常用命令