基本定时器TIM6实现精确延时
1、基本定时器的特点
(1)、16位自动重装载累加计数器
(2)、16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值

!!!注意基本定时器只有向上计数模式,不要被框图和数据手册上的一些描述误导,基本定时器寄存器中根本没有计数模式的配置相关位。
2、基本定时器的配置
①TIMx_CR1寄存器bit0: CEN 用于关闭或开启定时器

②TIMx_CNT寄存器:bit15-0:计数器数值
③TIMx_PSC寄存器:bit15-0:预分频器数值
④TIMx_ARR寄存器:bit15-0: 自动重装载数值
3、基本定时器实现精确延时的原理

实现时要注意以下两点:
①不要使用库函数,全部使用寄存器实现。原因——效率。
②可对ts进行适当的校正(毕竟程序的执行是要耗费时间的),实现更加精准的延时。
通过示波器测试,ts校正之后固有误差为0.68us,基本满足1us内误差的需求
4、最后附上代码
timer6_delay.h
点击查看代码
/*******************************************
*文件名 : timer6_delay.h
*作 者: WF
*修改时间: 2021.12.21
*版 本: v2.0
*说 明: 定时器6延时函数头文件
*******************************************/
#ifndef _TIMER6_DELAY_H
#define _TIMER6_DELAY_H
#include "stm32f10x.h"
void Timer6_Delay_Init(void);
void Timer6_Delay_Us(u16 us);
void Timer6_Delay_Ms(u16 ms);
void Timer6_Delay_Sec(u16 sec);
#endif
timer6_delay.c
点击查看代码
/*******************************************
*文件名 : timer6_delay.c
*作 者: WF
*修改时间: 2021.12.21
*版 本: v2.0
*说 明: 定时器6延时函数配置源文件
*******************************************/
#include "timer6_delay.h"
/* 预分频系数 */
#define PSC (2)
/* us倍乘因子 */
#define FAC_US (72 / PSC)
/*
*函数名: Timer6_Delay_Init()
*功 能: 定时器6延时初始化函数
*参 数: 无
*返回值: 无
*作 者: WF
*日 期: 2021.08.13
*/
void Timer6_Delay_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能定时器2时钟
/* 配置定时器2 */
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置为向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseInitStructure.TIM_Period = 0xffff; //自动装载初值
TIM_TimeBaseInitStructure.TIM_Prescaler = PSC - 1; //预分频系数
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //高级定时器必须配置
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStructure); //初始化定时器
}
/*
*函数名: Timer6_Delay_Us()
*功 能: 定时器6微秒级延时函数
*参 数: us:微秒数
*返回值: 无
*作 者: WF
*日 期: 2021.08.13
*/
void Timer6_Delay_Us(u16 us)
{
u16 temp = 0;
u16 ts = us * FAC_US; /* 时钟数 = us数 * us倍乘因子 */
ts -= 25; /* 时钟数校正 */
TIM6->ARR = 0xffff; /* 设置ARR为0xffff防止溢出 */
TIM6->CNT = 0; /* 清零计数器 */
/* 开启定时器6 */
TIM6->CR1 |= TIM_CR1_CEN;
/* 延时等待 */
while (ts > temp)
{
temp = TIM6->CNT;
}
/* 关闭定时器6 */
TIM6->CR1 &= ~TIM_CR1_CEN;
}
/*
*函数名: Timer6_Delay_Ms()
*功 能: 定时器6毫秒级延时函数
*参 数: ms:毫秒数
*返回值: 无
*作 者: WF
*日 期: 2021.08.13
*/
void Timer6_Delay_Ms(u16 ms)
{
while(ms--)
{
Timer6_Delay_Us(1000);
}
}
/*
*函数名: Timer6_Delay_Sec()
*功 能: 定时器6秒级延时函数
*参 数: sec:秒数
*返回值: 无
*作 者: WF
*日 期: 2021.08.13
*/
void Timer6_Delay_Sec(u16 sec)
{
while(sec--)
{
Timer6_Delay_Ms(1000);
}
}
基本定时器TIM6实现精确延时的更多相关文章
- 使用系统定时器SysTick实现精确延时微秒和毫秒函数
SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...
- Keil C51程序设计中几种精确延时方法
1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz.12 MHz或6 MHz晶振.第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确 ...
- 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)
/** ****************************************************************************** * @file main.c * ...
- 【转】STM32 不占用定时器(包括SysTick)实现精确延时(巧用DWT)
/** ****************************************************************** * file core_delay.c * author ...
- 一种Cortex-M内核中的精确延时方法
本文介绍一种Cortex-M内核中的精确延时方法 前言 为什么要学习这种延时的方法? 很多时候我们跑操作系统,就一般会占用一个硬件定时器--SysTick,而我们一般操作系统的时钟节拍一般是设置100 ...
- 织女星开发板RISC-V内核实现微秒级精确延时
前言 收到VEGA织女星开发板也有一段时间了,好久没玩了,想驱动个OLED屏,但是首先要实现IIC协议,而实现IIC协议,最基本的就是需要一个精确的延时函数,所以研究了一下如何来写一个精确的延时函数. ...
- STC12C5A60S2 @ 22.0184Mhz 精确延时
#include "STC12.h" // STC12C5A60S2 @ 22.0184Mhz 精确延时 void delay_10us(unsigned char n) { un ...
- 对MSP430单片机__delay_cycles精确延时的说明及改正
在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的函数)以提供用户精确延时使用, ...
- [MSP430] 对MSP430单片机__delay_cycles精确延时的说明及改正
在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的 函数)以提供用户精确延时使用 ...
- 关于51精确延时及keil仿真延时时间
转自:http://blog.sina.com.cn/s/blog_980e19e00101b5dh.html 有时候需要精确的延时,比如18B20温度传感器对时序要求非常严格,必须精确到微秒级别 一 ...
随机推荐
- 面试官:来说说vue3是怎么处理内置的v-for、v-model等指令?
前言 最近有粉丝找到我,说被面试官给问懵了. 粉丝:面试官上来就问"一个vue文件是如何渲染成浏览器上面的真实DOM?",当时还挺窃喜这题真简单.就简单说了一下先是编译成rende ...
- EMAS移动测试-远程真机篇
简介: 导读:本文将介绍申请远程真机以及在远程真机上执行测试任务的详细操作,包括申请远程真机.安装应用.扫码.定位.性能测试等. 一.移动测试概览 移动测试服务(Mobile Testing)是为企业 ...
- MaxCompute 公共云多租户设计的技术要点详解及产品实现特色
简介:公共云大数据平台在多租户的设计和实现方式上有所差异.本文主要介绍在公共云大数据平台的多租实现方案中需要考虑的问题和挑战,重点介绍了MaxCompute在计算和存储多租实现上的特点.期望通过这些 ...
- 基于 KubeVela 的机器学习实践
简介:本文主要介绍如何使用 KubeVela 的 AI 插件,来帮助工程师更便捷地完成模型训练及模型服务. 作者:KubeVela 社区 在机器学习浪潮迸发的当下,AI 工程师除了需要训练.调试自己 ...
- [FAQ] web3js, Error: Please pass numbers as strings or BN objects to avoid precision errors.
我们在调用合约方法时,都可以传一些参数的,比如转账金额 value. value 的单位是 wei,这是一个很小的单位,所以一般数值很大. 注意,把 ether 转 wei 需要先把 ether 的值 ...
- WPF 动画实战 点击时显示圆圈淡出效果
本文告诉大家一个有趣的动画,在鼠标点击的时候,在点击所在的点显示一个圆圈,然后这个圆圈做动画变大,但是颜色变淡的效果.本文的控件可以让大家将对应的容器放在自己应用里面就能实现这个效果 这个效果特别简单 ...
- 实践探讨Python如何进行异常处理与日志记录
本文分享自华为云社区<Python异常处理与日志记录构建稳健可靠的应用>,作者:柠檬味拥抱. 异常处理和日志记录是编写可靠且易于维护的软件应用程序中至关重要的组成部分.Python提供了强 ...
- Java设计模式-策略模式-基于Spring实现
1.策略模式 1.1.概述 策略模式是一种行为设计模式,它允许在运行时选择算法的行为.它将算法封装在独立的策略类中,使得它们可以相互替换,而不影响客户端代码.这种模式通过将算法的选择从客户端代码中分离 ...
- C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)
前言 本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考. 用 ...
- vue子组件给父组件传值
子组件: <template> <div class="app"> <input @click="sendMsg" type=&q ...