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

    文章

    106

    浏览量

    25218
  • STM32
    +关注

    关注

    2239

    文章

    10673

    浏览量

    348770
  • Tim
    Tim
    +关注

    关注

    0

    文章

    76

    浏览量

    17710
  • 计数
    +关注

    关注

    1

    文章

    57

    浏览量

    19983
收藏 人收藏

    评论

    相关推荐

    AvR单片机1us延时函数数怎么写

    是单片机中的一个特殊寄存器,它可以以特定的频率进行计数,并在计数达到一定值时触发中断。 对于AvR单片机来说,我们可以利用定时器的计数器来实现微秒级的延时。AvR单片机常见的定时器有T
    的头像 发表于 12-26 14:02 387次阅读

    stm32delay函数怎么写

    STM32延时函数可以使用SysTick定时器来实现。SysTick定时器是一个24位的计数器,它可以在每个时钟周期自动减少计数值,直到计数
    的头像 发表于 12-21 17:53 728次阅读

    STM32的向上计数模式如何产生计数器溢出事件?

    STM32的向上计数模式的自动加载值是指定时器计数器的最大计数值。当计数器达到这个值时,它会回滚到0并继续
    的头像 发表于 12-13 10:22 562次阅读

    简述STM32定时器的计数器模式

    STM32的向上计数模式是指定时器的计数器从0开始计数,直到达到自动加载值(TIMx_ARR),然后重新从0开始计数,并产生一个
    的头像 发表于 12-13 10:09 1699次阅读

    如何使RC延时电路无延时呢?

    如何使RC延时电路无延时呢? RC延时电路是一种常见的电子电路,用于在电路中引入一个可控的时间延迟。然而,有时候我们可能需要使RC延时电路无延时
    的头像 发表于 11-20 17:05 529次阅读

    ADC模数转换器的延时原理

    ADC模数转换器的延时原理主要与其内部的采样和保持电路、比较器、计数器等有关。以下是一般的ADC转换延时过程:
    的头像 发表于 11-16 15:59 406次阅读

    STM32如何使用定时器实现微秒(us)级延时

    STM32如何使用定时器实现微秒(us)级延时? 在STM32微控制器中,可以使用定时器实现微秒级延时。具体来说,可以使用定时器的计数器和自
    的头像 发表于 11-06 11:05 3040次阅读

    关于STM32WL LSE 添加反馈电阻后无法起振问题

    关于STM32WL LSE 添加反馈电阻后无法起振问题
    的头像 发表于 10-25 16:48 355次阅读
    <b class='flag-5'>关于</b><b class='flag-5'>STM32</b>WL LSE 添加反馈电阻后无法起振问题

    STM32基于HAL库实现微秒延时

    HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时STM32标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTic
    的头像 发表于 10-25 15:31 1699次阅读
    <b class='flag-5'>STM32</b>基于HAL库实现微秒<b class='flag-5'>延时</b>

    关于STM32F1C8T6 SystemTick延时不准确的是为什么?

    使用stm32f103c8t6的Systick功能,采用中断方式去延时,使用SysTick_Config去配置,当参数为SysTick_Config(SystemCoreClock/900
    发表于 09-25 06:16

    关于STM32CubeIDE链接脚本的小问题

    电子发烧友网站提供《关于STM32CubeIDE链接脚本的小问题.pdf》资料免费下载
    发表于 09-20 11:25 0次下载
    <b class='flag-5'>关于</b><b class='flag-5'>STM32</b>CubeIDE链接脚本的小问题

    HK32MCU应用笔记(五)| 关于应用HK32F030延时效率问题

    HK32MCU应用笔记(五)| 关于应用HK32F030延时效率问题
    的头像 发表于 09-18 11:00 401次阅读

    STM32单片机的延时原理和延时函数方法

    当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机的延时
    发表于 08-09 09:13 1w次阅读

    单片机两大延时方法总结

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法
    发表于 06-14 09:19 2405次阅读

    STM32 Encoder编码器使用总结

    目录 Encoder 原理 STM32 Encoder 计数原理 模型仿真 模拟Encoder 基于Encoder计算角度和速度 关于启动的仿真 代码生成 运行演示 总结总结一下基于STM32
    发表于 05-06 09:44 2次下载
    <b class='flag-5'>STM32</b> Encoder编码器使用总结