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

  这里提出一种采用通用定时器作为延时的参考时钟的方法。

  首先选择基础定时器即可,配置定时器参数,主要关注预分频器寄存器TIMx_PSC,它的大小决定了延时的最小单位,由于TIM2的时钟为84MHz,所有TIM2_PSC设置为84,即每一次计数对应1us。另外,这里计数器采用向下计数,便于程序判断。

 1 void Delay_Timer_Init(void)
 2 {
 3     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
 4
 5     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 6
 7     TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
 8     TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
 9     TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
10     TIM_TimeBaseInitStruct.TIM_Period = 100-1;
11     TIM_TimeBaseInitStruct.TIM_Prescaler = (84-1);
12     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
13
14     while((TIM3->SR & TIM_FLAG_Update)!=SET);
15     TIM3->SR = (uint16_t)~TIM_FLAG_Update;
16 }

  延时函数如下,对CNT寄存器赋延时值,然后通过判断Update标志位进行阻塞延时。

1 void Delay_us(uint32_t us_cnt)
2 {
3     TIM3->CNT = us_cnt-1;
4     TIM3->CR1 |= TIM_CR1_CEN;
5     while((TIM3->SR & TIM_FLAG_Update)!=SET);
6     TIM3->SR = (uint16_t)~TIM_FLAG_Update;
7     TIM3->CR1 &= ~TIM_CR1_CEN;
8 }

  在没有外部中断的情况下,对延时精度进行测试。测试方法是周期性控制GPIO管脚的输出电平:

1 while(1)
2 {
3     PEOUT_REG(1) = 1;
4     Delay_us(1);
5     PEOUT_REG(1) = 0;
6     Delay_us(1);
7  }

  以下结果来自示波器测量,与实际1us稍有偏差,大概在1.2us左右:

转载于:https://www.cnblogs.com/xincz/p/7836597.html

STM32通用定时器实现us微秒延时相关推荐

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

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

  2. STM32——通用定时器

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

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

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

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

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

  5. stm32cubemx中文_用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本)

    概述 ​ 在使用 DHT11 的时候,时序通信需要微秒来操作,STM32CubeMX 自带一个系统时钟,但是实现的是毫秒级别的.因此就自己用通用计时器实现一个. 文章目录 环境: 开发板:STM32F ...

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

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

  7. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  8. STM32 通用定时器基本原理

    STM32F10x系列总共最多有8个定时器: 三种STM32定时器区别: 通用定时器功能特点描述: ①. STM32 的通用 TIMx (TIM2.TIM3.TIM4 和 TIM5)定时器功能特点包括 ...

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

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

最新文章

  1. spring mvc xml格式输入输出
  2. 集群批量管理工具parallel ssh的安装及使用
  3. matlab基础试题,MATLAB基础试题题目及答案,课程2020最新期末考试题库,章节测验答案...
  4. [jQuery基础] jQuery事件相关
  5. html5中的FileReader对象
  6. thymeleaf模板的应用
  7. three.js 05-06 之 CylinderGeometry 几何体
  8. SMCJ系列TVS瞬态抑制二极管型号参数表
  9. VirtualBox虚拟机几种网络连接方式介绍
  10. 在Netbeans中搭建Android开发环境
  11. 计算机毕业设计Java医院管理系统(系统+源码+mysql数据库+Lw文档)
  12. Hadoop新手篇:hadoop入门基础教程 1
  13. 厉害了,可以不重启JVM就替换掉已经加载的类?
  14. 设置 VMware 虚拟网络编辑器
  15. 【狂神Java笔记】Java网络编程实战详细笔记整理(附代码)
  16. C++中const int*, const int * const, 和 int const *区别
  17. 基于Python模仿流量攻击的方法对字节编码攻击
  18. Android FaceBook登录接入--散列密钥获取
  19. Oracle 10g在线整理碎片索引是否失效
  20. 微信支付0.2%费率商户号开通

热门文章

  1. cosx等价无穷小_等价无穷小替换注意事项
  2. 使用python爬取虎牙主播直播封面图片(scrapy)
  3. replace和replaceAll的区别
  4. vue怎么设置封面_微信朋友圈封面视频如何制作?微信朋友圈封面视频制作软件VUE功能介绍...
  5. hive 留存率 计算
  6. 【收藏夹2020-2021】
  7. 鸿蒙 风雨始开,玄幻:鸿蒙天道
  8. 基于基础c语言的水仙花数编程方法
  9. 支持数位板的远程软件,实现远程使用 Wacom 数位板
  10. python绘制动态Julia集,超炫酷