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

    文章

    107

    浏览量

    25504
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354706
  • Tim
    Tim
    +关注

    关注

    0

    文章

    81

    浏览量

    17873
  • 计数
    +关注

    关注

    1

    文章

    56

    浏览量

    20088
收藏 人收藏

    评论

    相关推荐

    延时开关上l和a是什么意思

    延时开关是一种常见的电子控制元件,广泛应用于各种电子设备和系统中。它可以实现对电路的自动控制,使电路在一定的延时后自动接通或断开。在延时开关的标识中,L和A通常代表不同的意义。 一、延时
    的头像 发表于 08-19 15:45 1440次阅读

    揭秘:单片机硬件与软件延时之大不同!

    在嵌入式项目中,软件开发基本上都会使用到延时,那么,该用软件延时还是硬件延时?它们又有什么区别呢?今天就来讲讲关于硬件延时和软件
    的头像 发表于 07-25 08:11 723次阅读
    揭秘:单片机硬件与软件<b class='flag-5'>延时</b>之大不同!

    如何使用定时器写一个延时函数?

    ;//不报警不中断 delay.counter_en=1;//使能定时器 timer_init(0,0,&delay);//0组0定时器初始化 }; 按照stm32的写法应该还有一个更新状态位,等待定时器计时更新完成就是延时了,esp32是哪个呢?求解答
    发表于 06-14 06:03

    stm32cubemx的HAL_Delay()函数,当HAL_GetTick()的计数正好要溢出时,是不是延时就不准了?

    (); while((HAL_GetTick() - tickstart) < Delay) { } } 这里使用这个延时函数有没有这种情况,当HAL_GetTick()的计数正好要溢出时,是不是延时就不准了?
    发表于 05-09 06:20

    FreeRtos能否直接读取Rtos的系统时钟计数器来实现延时统计,改如何读取呢?

    关于200~300uS的延时 1 能否直接读取Rtos的 系统时钟计数器来 实现延时统计,改如何读取呢? 2 通过独立的定时器中断来实现,这样感觉有点麻烦,好处是比较严谨,但是代码
    发表于 04-29 08:40

    stm32f303进行ad采集,采集完需要延时1000ms,请问stm32f303的延时程序怎么写?

    各位大神。最近用stm32f303进行ad采集,采集完需要延时1000ms,请教一下f3的延时程序怎么写,多谢了
    发表于 04-10 07:51

    关于STM32 DMAMUX模块具体的应用示例代码

    有人通过公众号微信留言,询问是否有关于STM32 DMAMUX模块具体的应用示例代码。同时,个人也发现,虽然STM32片内的DMAMUX不是什么新模块,似乎还是很多人并不太熟悉。这里借机聊聊这方面的内容,重点演示相关功能的实现,
    的头像 发表于 03-25 09:15 2319次阅读
    <b class='flag-5'>关于</b><b class='flag-5'>STM32</b> DMAMUX模块具体的应用示例代码

    时间继电器通电延时与断电延时的区别

    时间继电器通电延时与断电延时的区别  时间继电器是一种常用的控制设备,可用于各种延时应用。常见的时间继电器主要包括通电延时继电器和断电延时
    的头像 发表于 02-04 13:43 4297次阅读

    延时继电器工作原理 延时继电器的接法和用途

    延时继电器是一种常用的电子设备,它能够延迟触发继电器的动作,从而在电路中产生一定的延时效果。它在工业自动化控制、电气设备保护、通信系统和家庭电器控制等领域中广泛应用。 一、延时继电器的工作原理
    的头像 发表于 01-19 11:24 6706次阅读

    延时继电器工作原理 断电延时继电器原理

    延时继电器工作原理 断电延时继电器原理  延时继电器是一种常用的电器元件,可用于各种电路控制和自动化控制系统中。它在电路中的作用是在断电之后,延时一定的时间才会切断电路。
    的头像 发表于 12-26 15:26 2703次阅读

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

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

    stm32delay函数怎么写

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

    STM32的向上计数模式有哪些特点及应用场景?

    计数器从0开始计数,直到达到自动加载值(TIMx_ARR),然后重新从0开始计数
    的头像 发表于 12-13 10:25 955次阅读

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

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

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

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