stm32 运行时间测量与间隔执行

STM32基础10--实时时钟(RTC) 目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量 重写周期唤醒回调函数 重写闹钟中断函数 前言 在做51单片机项目时,如果需要年月日时分秒的时间记录,会在51单片机上面外挂一个DS1302的时钟芯片,再加上时间芯片的外围电路。但在STM32F407中,不再需... 阅读详情

这个程序利用stm32普通定时器构成了执行时间测量功能和间隔执行函数功能,使用如下,两种功能复用,通过#define选择

//执行时间测试模式下 #define StopWatch
//使用:

#include "Runtime.h"

Runtime_init();
while(1){
        Runtime_start();
        delay_ms(1);
        Runtime_stop();
        delay_ms(1000);
}


//setInterval模式 #define setInterval

setInterval(fun,1000);//传入回调,周期1.024*1000ms

c文件

#include "Runtime.h"


unsigned int nTime = 0;
void Runtime_init(void) {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStu;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);  //使能TIM6时钟
	
	#if defined(StopWatch) 
    /*基础设置,最大可测时间定为8.192ms*/
    TIM_TimeBaseStructure.TIM_Period =
        65536 - 1;  // arr放最大,以实现最大测量范围
	#endif
	
	#if defined(setIntervalMODE) 
    /*1.024ms溢出*/
    TIM_TimeBaseStructure.TIM_Period =
        8192 - 1;  // arr放最大,以实现最大测量范围
	#endif
	
    TIM_TimeBaseStructure.TIM_Prescaler = 9 - 1;                 //预分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  //使能TIM6中断
    TIM_Cmd(TIM6, ENABLE);                      //使能定时器6

    NVIC_InitStu.NVIC_IRQChannel = TIM6_IRQn;  //外部中断线,定时器6
    NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1;  //抢占优先级
    NVIC_InitStu.NVIC_IRQChannelSubPriority = 1;         //子优先级
    NVIC_Init(&NVIC_InitStu);
}
#if defined(StopWatch) 
void TIM6_IRQHandler(void) {
    //判断是否为定时器6的更新中断
    if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
        nTime++;

        //注意要清除中断标志
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    }
}

void Runtime_start(void) {
    nTime = 0;                //清次数
    TIM_SetCounter(TIM6, 0);  //清空定时器的CNT
}

void Runtime_stop(void) {
    unsigned int count = TIM6->CNT;              // TIM_GetCounter(TIM6);
    TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);  //关TIM6中断
    printf("run time:%f us %f ms\n", (float)count / 8 + 8192 * nTime,
           (float)count / 8000 + 8.192 * nTime);
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  //使能TIM6中断
}
#endif

#if defined(setIntervalMODE) 

callbackType callback = NULL;
unsigned int intervalTime=0;

//初始化和设置setInterval
void setInterval(callbackType cb,unsigned int time){
	callback=cb;
	intervalTime=time;
	Runtime_init();
}

void TIM6_IRQHandler(void) {
    //判断是否为定时器6的更新中断
    if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
        nTime++;
		if(nTime>=intervalTime){
			TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);  //关TIM6中断
			nTime=0;
			//需要定时执行的逻辑
			if(callback){
				callback();
			}
			TIM_SetCounter(TIM6, 0);  //清空定时器的CNT
			TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  //使能TIM6中断
		}
        //注意要清除中断标志
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    }
}
#endif

h文件

#ifndef __RUNTIME__
#define __RUNTIME__

////////MODE SET/////////

//#define StopWatch
#define setIntervalMODE

/////////////////////////

#include "sys.h"
#include "usart.h"


typedef void (*callbackType)(void);

void Runtime_init(void);   //初始化

#if defined(StopWatch)
void Runtime_start(void);  //开始执行时间测试
void Runtime_stop(void);   //结束执行时间测试,打印结果到串口
#endif

#if defined(setIntervalMODE)
void setInterval(callbackType cb,unsigned int time);//初始化和设置setInterval
#endif

#endif

基于STM32的数字时钟(闹钟)2.0(可显示时间、日期、星期、温湿度) 对于按键,我用到了四个按键,分别用于设置页面的切换(选择设置时间、闹钟、日期)、设置项目(时、分、秒、年、月、日)的切换、数字的加和减。按键使用外部中断模式,因为我的板子按键按下为高电平,所以我设置为上升沿触发+下拉,大家可以根据自己板子的实际情况来配置,如果按键按下为低电平,则设置为下降沿触发+上拉(效果为按键按下时进入中断)。我做了一款基于STM32的数字时钟,它可以显示时间、日期、星期,同时还可以通过按键和蓝牙修改时间和设置闹钟,此外还增加了温湿度传感器,实时显示当前的温度和湿度。 阅读详情

相关推荐

STM32之RTC实时时钟

STM32之RTC实时时钟

weixin_52483742的博客 5973

stm32定时器中断实现按键检测,消抖

定时器中断实现按键的消抖及松手检测

qq_74099543的博客 8321

(四)基于STM32通过Event Recoder实现时间测量功能

通过以上步骤,即可以在STM32微控制器上成功实现基于Event Recorder的时间测量功能。

FCZlll的博客 1481

STM32 HAL库 CubeMX 低功耗STOP模式,RTC定时5分钟发送一次数据然后进入休眠,实测待机电流5.6uA(一)

STM32 HAL库 低功耗STOP模式,RTC定时5分钟发送一次数据然后进入休眠,实测待机电流5.6uA 主函数: // An highlighted block /* USER CODE BEGIN WHILE */ while (1) { MX_RTC_Init();//每次同步后都初始化,5分钟后可以再次报警 ATRecTime = HAL_GetTick(); ...

qq_34471936的博客 6060

STM32输入捕获之快速构建频率计

简介:配置好STM32 CUBE IDE后只需要额外7行代码就可以构建一个频率计,目前只计算测频,占空比测量需要加入下降沿捕获标记(暂时没做)。

qq_30993593的博客 4029

STM32振弦式频率测量仪器研发与实践

本文还有配套的精品资源,点击获取 简介:本研究文档详细介绍了使用STM32微控制器开发一款振弦式频率测量仪器的过程。文档首先解释了振弦传感器的工作原理,然后阐述了STM32的选型及应用,包括信号采集、频率分析和处理。研究涉及硬件设计、固件开发、信号去噪、用户界面设计、误差校准和系统集成等关键环节。目标是开发出一种高精度、实时响应的智能测量仪器,以满足工程和科研领域的测量需求...

weixin_36311421的博客 3157

STM32频率测量

频率测量是个最基本的且常见的工业需求. 但是这种简单的需求却不是那么的好实现. 总体来看, 目前的单片机还是有很大的改进空间. 很少有频率测量能够覆盖所有的频率范围. 而使用 STM32F103 性能有限. 根据待测频率, 我分成低中高, 三个阶段. 分别对应着3种不同的测量方法.测量方法, STM32 时钟计数器的输入捕获中断函数测量法. 测量原理 输入捕获模式可以用来测量脉冲宽度或者测量频率。 STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升

走错路的程序员 1万+

STM32输入捕获模式频率测量指南

STM32微控制器基于ARM Cortex-M3、M4或M7内核,提供了不同级别的性能和功耗选项。它们通常包含内置的FLASH存储器、RAM以及各种外设接口如ADC、DAC、UART、SPI、I2C等。其设计允许在保持低功耗的同时执行复杂的实时处理,非常适合于物联网、工业控制、消费电子等领域。输入捕获模式是微控制器中定时器的一种应用方式,它能够精确测量外部信号的频率、周期或者占空比。在此模式下,定时器会在外部信号的特定边沿(上升沿或下降沿)到来时捕获当前计数器的值。

weixin_42607969的博客 1306

一种测量STM32程序执行时间的方法

本文详细讲解了如何使用STM32的SysTick系统定时器实现程序代码执行时间的方法。

goodrenze的专栏 3077

STM32基于外部中断的频率测量项目实战

STM32频率计是一种基于STM32微控制器的电子测量工具,广泛应用于电子工程领域。它能测量周期性信号的频率和周期,并在显示屏上直观显示结果。频率计的设计基于对信号周期的计数,在固定时间间隔内,通过计算信号的上升沿或下降沿次数来确定频率值。外部中断是微控制器(MCU)能够响应外部事件的一种机制,通过该机制,MCU能够在外部事件发生时暂停当前执行的程序,并跳转到一个特定的中断服务例程(ISR)来处理中断事件。

weixin_42627459的博客 1153

STM32_TDC高精度时间测量实战指南

STM32微控制器系列是ST公司推出的一款广泛使用的32位ARM Cortex-M微控制器。它以其高性能、高灵活性和低功耗特性,成为工业控制、医疗设备、消费电子等领域中不可或缺的组件。STM32微控制器通常包含多种外设功能,TDC(时间数字转换器)是其中的一项重要功能。TDC功能是指微控制器内部集成的硬件电路,它能够进行高精度的时间测量。这在一些需要时间同步或精确计时的应用中极为重要,如时间飞行测量、无线通信、高速数据采集等。

weixin_36483050的博客 1547

[STM32 HAL] 使用TIM 测量两次按键时间间隔

使用STM32HAL库,完成用TIM测量两次按键时间间隔

u011545492的博客 4381

STM32标准库实现频率和占空比测量

STM32微控制器是由STMicroelectronics生产的广泛使用的32位ARM Cortex-M处理器系列。以其高性能、低功耗和丰富的外设集成度著称,特别适合需要实时处理和复杂控制的应用场景。该系列微控制器广泛应用于工业控制、医疗设备、家用电器等多个领域,成为嵌入式开发者喜爱的选择之一。在深入探讨STM32的输入捕获功能前,首先需要对其有一个基础的了解。STM32系列提供了多种不同的微控制器,它们的型号不同,主要区别在于内核、存储容量、外设接口等方面。

weixin_42298254的博客 1187

STM32G4之测量两路PWM频率和占空比

STM32G4PWM输入捕获频率和占空比的测量

风间琉璃的博客 8426

基于STM32的脉冲间隔时间测量测距系统设计与实现

你看,一个看似简单的“测距功能”,背后竟藏着如此多门道。从GPIO模式的选择,到定时器的配置,再到中断优先级、温度补偿和状态管理——每一个环节都可能成为系统瓶颈。但这也正是嵌入式开发的魅力所在:你不仅要懂代码,还要懂电流、懂时间、懂物理世界是如何与数字逻辑对话的。下次当你面对一个“明明应该工作却总是不准”的测距模块时,不妨回头问问自己:“我是不是忽略了某个电阻的值?“中断优先级设对了吗?“温度补偿开了吗?“计数器有没有溢出?有时候,答案就在那些不起眼的细节里。✨。

weixin_42097508的博客 492

使用Typora时LaTeX内联公式简单汇总

0、前言 在使用Typora写笔记时,有时候需要添加上LaTeX排版的公式。以下是整理出的一份简单笔记,方便记忆不清楚时查阅。笔记暂时不够完善,之后再补充。 注:有些公式语法KateX不能解析,但在Typora中可以使用(不用在意) 1、一些基本内联公式 位置关系 展示 LaTeX 说明 x2x^{2}x2 x^{2} 右上标 x2x_{2}x2​ x_{2} 右下标 2x{}^{2}x2x {}^{2}x 左上标 2x{}_{2}x2​x {}_{2}x 左下标

白白旧维的博客 4438

STM 32——TIM定时器频率测量

STM 32——TIM定时器频率测量 1.定时器不同工作模式的配置 在使用STM32进行脉冲频率测量时,免不了会碰上TIM定时器的配置问题,这里做一个简单介绍 1.1计数器模式 首先我们选择内部时钟(PCLK)作为定时器的时钟源,PHB总线时钟的频率配置为170MHZ,在不采用预分频的情况下计数加一的时间即为1/(170M)秒。 如上图所示,预分频系数(Prescaler)为1(0+1),向上计数模式,计数溢出值为65535(16位),若需要出发定时器中断(计数溢出中断)就要在NVIC Setting

bojin4564的博客 6581

Realsense D435i运行ORB-SLAM3

【代码】Realsense D435i运行ORB-SLAM3。

MAX_Hope的博客 2563

STM32学习笔记之测量某个函数运行时间

1. 设置Trace时的工作频率(就是当前的系统时钟,如stm32f103,f107为72MHz,f407为168M,f429为180M): 2. 进入调试状态,在一条语句前设置断点执行到此,再执行到另外的语句处,下面的Sec就是执行时间 得到adc_init()时间为: T2-T1 单位秒。 3. 还有一种办法,更加精

一颗偏执的心 1万+

西门子S7-200SMART控制步进电机(五)

前面详细讲述了运动控制向导的配置和运动控制指令的使用方法,接下来要讲的是简单程序的编写和调试。 在编写程序时,需要注意的是自定义的符号和地址不能与运动控制向导分配的存储器冲突。 一、软硬件组成 1、软件:STEP-7-Micro/WIN SMART软件; 2、硬件:西门子S7-200 SMART ST40 PLC、57步进电机和驱动器(DM542)。 二、手动控制步进电机旋转方向和速度 具体步骤...

qq_43134642的博客 2万+

WIFI和BT测试(射频工程师)

买不了吃亏买不了上当,我卖的是技能,你收获的是经验。

m0_58834499的博客 599

IAR\ST-Link调试程序查看STM32单片机某段代码运行时间

需要知道某段代码的运行时间,有硬件的方法,也有软件的方法 硬件方法: 1:在测量起始点,反转电平 2:在测量结束点,再次反转电平 软件方法: 1、在测量起始点和测量结束点设置断点 2、进入调试模式,点击工具栏ST-Link→Data Log Summary→弹出的窗口右键Enable。 3、运行程序到达测量起始点,会显示运行时间,再全速运行至结束点,时间差即为测量出的运行时间。 没有验证过精度,要求不高的可以满足。 ...

zd845101500的博客 6012

【WRF-Chem工具】anthro_emiss 详解:生成人为排放数据

anthro_emiss 详解:生成人为排放数据

WW、forever的博客 2053
上一篇: stm32 HC05驱动
下一篇: stm32 12路pwm舵机控制器
leida_wt
博客等级 码龄10年 420粉丝 77原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值