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

    浏览量

    26414
  • STM32
    +关注

    关注

    2312

    文章

    11189

    浏览量

    374514
  • Tim
    Tim
    +关注

    关注

    0

    文章

    85

    浏览量

    19116
  • 计数
    +关注

    关注

    1

    文章

    58

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    以智能计数,筑效率壁垒——博图计数包装机

    以智能计数,筑效率壁垒——山东博图新一代视觉计数包装机,重新定义制造业包装新范式,用技术创新赋能企业降本增效,成为工业4.0时代的核心竞争力。 核心技术突破,铸就精准标杆:采用全链路自主研发的视觉
    的头像 发表于 04-08 14:00 61次阅读
    以智能<b class='flag-5'>计数</b>,筑效率壁垒——博图<b class='flag-5'>计数</b>包装机

    风华高科延时启动型插件 PTC 热敏电阻:稳定启动的可靠助力

    在各类电机、电子设备的启动环节中,延时启动型PTC热敏电阻扮演着关键角色,它能有效控制启动电流、保护设备核心部件,延长使用寿命。南山电子代理的风华高科作为知名电子元器件供应商,其推出的延时启动型插件
    的头像 发表于 03-12 17:28 684次阅读
    风华高科<b class='flag-5'>延时</b>启动型插件 PTC 热敏电阻:稳定启动的可靠助力

    求助STM32H563关于LWESP配置UART问题

    求助STM32H563关于LWESP配置UART问题,信息如下: Uart GPIO:PA9 USART1_TXPA10 USART1_RX 参考文章:https://blog.csdn.net
    发表于 01-27 14:02

    LAT1183+高精度定时器中 single-shot 计数模式不工作应用笔记

    客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现该子定时器无
    发表于 01-11 17:28 0次下载

    如何在Zephyr RTOS中实现延时和计时函数

    在实时操作系统(RTOS)中,时间管理是核心功能之一。无论是任务调度、超时控制,还是周期性事件,延时和计时机制都扮演着至关重要的角色。Zephyr RTOS作为一个轻量级、模块化的开源系统,提供了
    的头像 发表于 12-26 10:32 6038次阅读
    如何在Zephyr RTOS中实现<b class='flag-5'>延时</b>和计时函数

    交流延时电源

    交流延时电源
    的头像 发表于 12-25 12:57 508次阅读
    交流<b class='flag-5'>延时</b>电源

    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

    感知再进化,新增“触发延时”功能!

    ——「触发延时」正式上线!这不仅是一个功能的增加,更是对产品稳定性和场景适用性的一次深刻优化。一、亮点速览什么是“触发延时”功能?简单来说,“触发延时”是指在雷达检测到
    的头像 发表于 11-10 11:05 973次阅读
    感知再进化,新增“触发<b class='flag-5'>延时</b>”功能!

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

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

    探头的延时介绍

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

    认识探头的延时

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

    九进制计数电路仿真设计

    九进制计数电路仿真
    发表于 06-09 14:48 0次下载

    数字延时脉冲发生器的工作原理及应用场景介绍

    SYN5610型数字延时脉冲发生器是一种能够产生精确时间延迟和脉冲信号的电子设备,核心原理基于数字逻辑控制和定时电路,通过编程或外部触发实现对脉冲信号的延迟时间、宽度、频率等参数的精准控制。其主要
    的头像 发表于 06-03 17:22 768次阅读

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

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