0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于STM32的计数与延时

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-12 11:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Ⅰ关于STM32的计数和延时

在STM32中,具有计数(或计时)功能的模块基本都能实现延时功能。如:系统滴答SysTick、定时器TIM、实时时钟RTC、看门狗WDG。

精确延时一般使用定时器TIM即可实现。当然,是否精确,取决于你的主频(也就是晶振)是否准确,如果主频精确,那么实现的延时也一定精确。

一般来说,常温下实现us微秒级的延时,误差还是挺小的(应该说挺精确)。拿F407,主频168M来说,可以实现几十ns纳秒的延时,如果选用高精度的晶振,误差还是很小的。

总结:想要TIM定时器实现高精确的延时,就需要高精度的晶振。主频精确,那么延时就精确。

ⅡSTM32的TIM定时器

STM32的定时器有3类:

高级定时器Advanced control Timer

通用定时器General purpose Timer

基本定时器BasicTimer

STM32的这三种定时器都能实现最基本的定时计数功能。差异在于它们的功能多少不一样,从结构图一目了然,下面以STM32F4为例,给大家展示一下F4三类定时器的结构图:

高级定时器

通用定时器

基本定时器

相信大家看了上面3种结构图,心里大概应该明白它们的差异存在哪些地方。具体差异可以参看手册中的“主要特性”,里面详细讲述了其中的功能和特性。

重要提示:

1.定时器的位数有16位和32位之分,详见数据手册。

2.定时器有多少个,以及是TIM几,同样见数据手册。如下图STM32F411就只有8个定时器,没有基本定时器。

ⅢSTM32定时器计数延时原理

上面3种定时器(高级、通用和基本)都能实现计数延时的功能,我们以最简单的基本定时器为例,还是参看着结构图来说明:

1.来自RCC的时钟,参看RCC时钟树,一般是SystemCoreClock或者SystemCoreClock/2, 如STM32F429的就是(180M/2)。

2.分频CK_PSC之后就是计数器CK_CNT的计数频率。

如分频值位9,则计数频率为1M. (180M / 2 /9= 10M).

3.实现1us计数:

上面1秒计数10M个数,那么我计10个数,就是1us的时间。只需要在自动重载寄存器ARR中填充10 - 1即可。

代码分析:

红定义

//计数时钟(相当于1秒钟计数10M次个脉冲) #define TIM6_COUNTER_CLOCK 10000000 //预分频值 #define TIM6_PRESCALER_VALUE (SystemCoreClock/2/TIM6_COUNTER_CLOCK - 1) //定时周期(计数满10个算一个周期,也就是1us) #define TIM6_PERIOD_TIMING (10 - 1)

配置

void TIM6_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM6时基单元配置 */ TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PRESCALER_VALUE; //预分频值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period = TIM6_PERIOD_TIMING; //定时周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能"更新"中断 }

如果需要中断,则开启1us中断。

定时器阻塞延时

void TIM6_Nus(uint16_t Times){ TIM_Cmd(TIM6, ENABLE); //启动定时器 while(Times--) { while(TIM_GetFlagStatus(TIM6, TIM_FLAG_Update) == RESET); //等待计数完成 TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除标志 } TIM_Cmd(TIM6, DISABLE); //关闭定时器 }

以上代码,之前有分享过类似的,在下载区 STM32F417_第一阶段里面。

提示:

1.这类阻塞延时,仅供学习其原理使用,请结合实际项目修改代码。

2.可以通过定时中断 + 读取计数器的值来获取精确的时间。

比如:1ms中断一次,同时,计数累加。获取计数值 +累计值也能得出精确延时。 (当然,中断不能太频繁), 此原理,适用于其他SysTick,RTC等具有计数功能的模块。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 延时
    +关注

    关注

    0

    文章

    110

    浏览量

    26226
  • STM32
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371180
  • Tim
    Tim
    +关注

    关注

    0

    文章

    84

    浏览量

    18892
  • 计数
    +关注

    关注

    1

    文章

    58

    浏览量

    20560
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Cortex-M内核中的精确延时的方法

    )。 要实现延时的功能,总共涉及到三个寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。 DEMCR使能DWT_CYCCNT
    发表于 11-21 07:51

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

    到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,由于和MCU外设无关,所以代码的移植,在不同厂家的Cortex-M
    发表于 11-20 07:12

    如何利用蜂鸟HbirdV2-SoC自带外设PWM进行毫秒级的延时和计时

    ,显然,计数16次实现1us延迟是极不精准的。为了达到一定了精度要求,本例中仅实现50us的延时。 其次,TIM0的计数寄存器仅为16位,用在16MHz主时钟对其进行计数时,最大de
    发表于 10-30 07:47

    探头的延时介绍

    探头的延时是指信号从被测点传输到示波器输入端的时间间隔,即信号经过探头的探针、传输电缆、内部电路等路径后,到达示波器采样系统的总时间延迟,(以下讨论低速信号情景,忽略示波器通道间ps级的延时误差)。不同型号的探头延时存在差异,尤
    的头像 发表于 09-17 17:32 648次阅读
    探头的<b class='flag-5'>延时</b>介绍

    认识探头的延时

    探头的延时是指信号从被测点传输到示波器输入端的时间间隔,即信号经过探头的探针、传输电缆、内部电路等路径后,到达示波器采样系统的总时间延迟,(以下讨论低速信号情景,忽略示波器通道间ps级的延时误差
    的头像 发表于 08-26 17:04 644次阅读
    认识探头的<b class='flag-5'>延时</b>

    STM32F030内部晶振怎么设置,内部晶振是延时函数怎么设置?

    STM32F030内部晶振怎么设置,内部晶振是延时函数怎么设置 使用STM32F030时没使用内部晶振怎么设置,使用内部晶振时延时函数怎么写?谢谢大侠
    发表于 04-23 07:45

    STM32U083进行外部计数只能计数8000多一点,为什么?

    背景: 使用LPTIME1进行计数。 LPTIMER配置如下: 时钟配置如下: 使用过LSE;PCLK配置,计数还是一样的 实际计数只能计数到8000多;使用信号发生器产生9KHz
    发表于 03-12 06:21

    使用STM32F030时没使用内部晶振怎么设置,使用内部晶振时延时函数怎么写?

    STM32F030内部晶振怎么设置,内部晶振是延时函数怎么设置 使用STM32F030时没使用内部晶振怎么设置,使用内部晶振时延时函数怎么写?谢谢大侠
    发表于 03-07 08:13

    STM32G070 UART串口,低波特率传送数据时,TIMER出现严重延时现象如何解决?

    STM32G070, UART串口,低波特率传送数据时,TIMER出现严重延时现象,传送数据长的话,导致系统重启。如何解决?
    发表于 03-07 07:07

    STM32C031C6在按键中断处理程序中使用HAL_Delay()延时函数,程序则无法运行怎么解决?

    测试STM32C031C6开发板的长短按键,在按键中断处理程序中使用HAL_Delay()延时函数,程序则无法运行,类似进入了死循环,于是则添加了延时函数如下: /[i
    发表于 03-07 06:50

    延时继电器的工作原理和接线方法

    延时继电器作为一种在电气系统中广泛应用的控制元件,具有在电路中实现定时闭合或断开控制的重要功能。通过引入延时功能,对电路系统的精确控制和管理,适应不同的应用场景和需求,提高生产效率、降低
    的头像 发表于 02-07 16:09 2844次阅读

    断电延时继电器的应用

    延时继电器作为一种重要的电气控制元件,在现代电气系统中发挥着不可或缺的作用。其基于一个或多个可调的计时器电路,通过与继电器相连的控制电路,实现了在电路中定时闭合或断开控制的功能。 一、工作原理 延时
    的头像 发表于 02-07 16:07 1898次阅读

    延时继电器功能汇总与应用

    延时继电器是一种在电气系统中广泛应用的控制元件,在电路中实现定时闭合或断开控制,为各种应用场景提供灵活的时间管理功能。 通常,聚英延时继电器由一个控制电压引发,该控制电压可以是任何符合电器设备功能
    的头像 发表于 01-17 16:03 1184次阅读

    延时继电器应用场景

    延时继电器是一种在电气系统中广泛应用的控制元件,通过引入延时功能,实现了在电路中定时闭合或断开控制的重要任务。 延时继电器的工作原理,基于一个或多个可调的计时器电路,2路/4路/8路电路与继电器相连
    的头像 发表于 01-16 16:27 1106次阅读

    使用ADC08D500对模拟信号采样时,遇到的延时疑问求解

    使用ADC08D500对模拟信号采样时,设置的工作模式为DES模式,采样速率为1G,利用FPGA接收采集的数据。但是,当输入的模拟信号延时100ns时,利用计数器测量延时时(计数器利
    发表于 12-20 16:36