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实现精确延时的更多相关文章

  1. 使用系统定时器SysTick实现精确延时微秒和毫秒函数

    SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...

  2. Keil C51程序设计中几种精确延时方法

    1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz.12 MHz或6 MHz晶振.第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确 ...

  3. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  4. 【转】STM32 不占用定时器(包括SysTick)实现精确延时(巧用DWT)

    /** ****************************************************************** * file core_delay.c * author ...

  5. 一种Cortex-M内核中的精确延时方法

    本文介绍一种Cortex-M内核中的精确延时方法 前言 为什么要学习这种延时的方法? 很多时候我们跑操作系统,就一般会占用一个硬件定时器--SysTick,而我们一般操作系统的时钟节拍一般是设置100 ...

  6. 织女星开发板RISC-V内核实现微秒级精确延时

    前言 收到VEGA织女星开发板也有一段时间了,好久没玩了,想驱动个OLED屏,但是首先要实现IIC协议,而实现IIC协议,最基本的就是需要一个精确的延时函数,所以研究了一下如何来写一个精确的延时函数. ...

  7. STC12C5A60S2 @ 22.0184Mhz 精确延时

    #include "STC12.h" // STC12C5A60S2 @ 22.0184Mhz 精确延时 void delay_10us(unsigned char n) { un ...

  8. 对MSP430单片机__delay_cycles精确延时的说明及改正

    在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的函数)以提供用户精确延时使用, ...

  9. [MSP430] 对MSP430单片机__delay_cycles精确延时的说明及改正

    在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的 函数)以提供用户精确延时使用 ...

  10. 关于51精确延时及keil仿真延时时间

    转自:http://blog.sina.com.cn/s/blog_980e19e00101b5dh.html 有时候需要精确的延时,比如18B20温度传感器对时序要求非常严格,必须精确到微秒级别 一 ...

随机推荐

  1. python中的赋值、浅拷贝、深拷贝的区别

    赋值: 可变类型:赋值前后id不会变,赋值后的数据会随源数据变化: 不可变类型:赋值前后id不会变,赋值后的数据不会随源数据变化: 浅拷贝(copy): 可变类型:copy前后id会变,可变类型中存储 ...

  2. FPGA芯片结构介绍及工作原理解析

    FPGA工作原理与简介    如前所述,FPGA是在PAL.GAL.EPLD.CPLD等可编程器件的基础上进一步发展的产物.它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克 ...

  3. 力扣595(MySQL)-大的国家(简单)

    题目: World 表: 如果一个国家满足下述两个条件之一,则认为该国是 大国 : 面积至少为 300 万平方公里(即,3000000 km2),或者人口至少为 2500 万(即 25000000)编 ...

  4. 力扣128(java&python)-最长连续序列(中等)

    题目: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度. 请你设计并实现时间复杂度为 O(n) 的算法解决此问题. 示例 1: 输入:nums = ...

  5. DataWorks开发ODPS SQL开发生产环境自动补全ProjectName

    简介: DataWorks标准模式下,支持开发环境和生产环境隔离,开发环境和生产环境的数据库表命名有所区别,如果需要在开发环境访问生产环境的数据库表或者跨项目空间访问其他项目空间的表,需要根据proj ...

  6. 万物有灵,萌物Luka机器人如何让故事点缀童年

    ​简介:未来的十年将会是AI影响教育的十年.物灵科技正是基于在AI+教育未来趋势前瞻性的把握,不断将人格化属性和关系式交互体验赋予更多人工智能产品,启发儿童语言培养阶段的学习兴趣.依托阿里云技术,物灵 ...

  7. OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码

    简介: 在数据库OceanBase3.0峰会上,蚂蚁集团自主研发的分布式数据库OceanBase首次从技术.商业和生态三个维度对未来发展战略进行了系统性阐述.同时,OceanBase宣布正式开源,并成 ...

  8. [Go] Viper 加载项目配置,go build 打包配置文件进二进制

    Viper 的传统用法局部,加载到某个 package 下的全局变量后,其它 package 可以继续使用. var Conf *viper.Viper func init() { // File n ...

  9. win10 uwp 选择文本转语音的机器人

    在 UWP 里,可以非常方便将某个文本转换为音频语音,转换时,将会根据输入的内容以及本机所安装的语言库选择一位机器人帮忙将输入的文本转换为语音.本文来告诉大家如何切换文本转语音的机器人,例如从默认的女 ...

  10. Excel根据名称批量导入图片

    一. 效果 二.方法一 在Excel中如果内容 ="<table><img src=""D:\文档\常用文件\图片导入测试\"&A2& ...