stm32 测频率(1HZ—15MHZ时精度0.01%,可测更高,但不是很准)

这篇具有很好参考价值的文章主要介绍了stm32 测频率(1HZ—15MHZ时精度0.01%,可测更高,但不是很准)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


准备电赛的过程中,尝试了几种测量频率的方法,也参考了一些博主,没有一种可以测量范围很广的方法,那就都尝试一下,需要什么就用什么吧。

下面的代码都是我运行成功的,可以测量

平台:stm32F407

外部中断(低频)

第一个想到的就是外部中断,也是最简单的方式,在每一个上升沿或者下降沿进入一次中断,定时统计进入中断的次数,即可算出频率,如果需要计算出占空比,可以在用另外一个定时器测量上升沿和下降沿的时间就可以啦,
下面贴出外部中断和定时器的代码,在低频时很不错,但是50KHZ之后太不行了,误差好大,频繁进入中断,只能测测低频啦

下面展示一些 内联代码片
TIM4_Int_Init(10000-1,8400-1);//*外部中断测频率 PA0

// A code block
/**
  * @brief 外部中断测频率
  * @param  
  * @retval 
  */
void TIM4_Int_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  ///使能TIM3时钟
	
  TIM_TimeBaseInitStructure.TIM_Period = arr; 	//自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//初始化TIM2
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //允许定时器2更新中断
	TIM_Cmd(TIM4,ENABLE); //使能定时器3
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //定时器3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

void TIM4_IRQHandler(void)
{
	
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中断
	{
  	LCD_ShowNum(60,60,freq,8,16);
		freq=0;

	}
	
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除中断标志位
}

// An highlighted block
//外部中断初始化程序
void EXTIX_Init(void)
{
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	KEY_Init(); //按键对应的IO口初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
	
	
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
	/* 配置EXTI_Line0 */
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
  EXTI_Init(&EXTI_InitStructure);//配置
		NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
}

//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
	 
//   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1){
//	    GPIO_ResetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);
//	 }
	 freq++;
	 EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位 
}	

输入捕获模式(中高频)

既然是测频率,自然会想到定时器的输入捕获模式,本以为这个还不错,但是超过100KHZ误差就很大了,测中高频是可以的。
这个我参考了野火的程序
输入捕获可以对输入信号的上升沿、下降沿、双边沿进行捕获,用于测量脉宽、频率、占空比
当相应的 ICx 信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx)来锁存计数器的值。通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。通过对上升沿下降沿捕获的值来计算需要的值
下面展示一些 内联代码片
// TIM8_Configuration();//输入捕获模式测频率


// A code block
**
  * @brief 定时器输入捕获模式
  * @param  
  * @retval 
  */
/**
  * @brief  配置TIM复用输出PWM时用到的I/O
  * @param  无
  * @retval 无
  */
static void TIMx_GPIO_Config(void) 
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;

	/*开启LED相关的GPIO外设时钟*/
	RCC_AHB1PeriphClockCmd (GENERAL_OCPWM_GPIO_CLK, ENABLE); 
	RCC_AHB1PeriphClockCmd (ADVANCE_ICPWM_GPIO_CLK, ENABLE); 	

	/* 定时器复用引脚 */
	GPIO_PinAFConfig(GENERAL_OCPWM_GPIO_PORT,GENERAL_OCPWM_PINSOURCE,GENERAL_OCPWM_AF); 
	GPIO_PinAFConfig(ADVANCE_ICPWM_GPIO_PORT,ADVANCE_ICPWM_PINSOURCE,ADVANCE_ICPWM_AF); 
	
	/* 通用定时器PWM输出引脚 */															   
	GPIO_InitStructure.GPIO_Pin = GENERAL_OCPWM_PIN;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
	GPIO_Init(GENERAL_OCPWM_GPIO_PORT, &GPIO_InitStructure);
	
	/* 高级控制定时器PWM输入捕获引脚 */
	GPIO_InitStructure.GPIO_Pin = ADVANCE_ICPWM_PIN;	
	GPIO_Init(ADVANCE_ICPWM_GPIO_PORT, &GPIO_InitStructure);
}

 /**
  * @brief  高级控制定时器 TIMx,x[1,8]中断优先级配置
  * @param  无
  * @retval 无
  */
static void TIMx_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		
		// 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQn; 	
		// 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	 
	  // 设置子优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
	  NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
	 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	
	 NVIC_Init(&NVIC_InitStructure);
 	
}
static void TIM_PWMOUTPUT_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	// 开启TIMx_CLK,x[2,3,4,5,12,13,14] 
  RCC_APB1PeriphClockCmd(GENERAL_TIM_CLK, ENABLE); 

  /* 累计 TIM_Period个后产生一个更新或者中断*/		
  //当定时器从0计数到9999,即为10000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Period = 10000-1;       
	
	// 通用定时器2时钟源TIMxCLK = HCLK/2=84MHz 
	// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
  TIM_TimeBaseStructure.TIM_Prescaler = 840-1;	
  // 采样时钟分频
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  // 计数方式
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	
	// 初始化定时器TIMx, x[1,8]
	TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
	
	/* PWM输出模式配置 */
	/* 配置为PWM模式1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	
	/* PWM脉冲宽度 */
  TIM_OCInitStructure.TIM_Pulse = 3000-1;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	/* 使能通道1 */
  TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);	
	/*使能通道1重载*/
	TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
	// 使能定时器
	TIM_Cmd(GENERAL_TIM, ENABLE);	
}

static void TIM_PWMINPUT_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_ICInitTypeDef  TIM_ICInitStructure;
	
	// 开启TIMx_CLK,x[1,8] 
  RCC_APB2PeriphClockCmd(ADVANCE_TIM_CLK, ENABLE); 
	
	TIM_TimeBaseStructure.TIM_Period = 0xFFFF-1; 	
	// 高级控制定时器时钟源TIMxCLK = HCLK=168MHz 
	// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
  TIM_TimeBaseStructure.TIM_Prescaler = 168-1;	
  // 计数方式
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;	
	// 初始化定时器TIMx, x[1,8]
	TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
	
	/* IC1捕获:上升沿触发 TI1FP1 */
  TIM_ICInitStructure.TIM_Channel = ADVANCE_IC1PWM_CHANNEL;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
	
	/* IC2捕获:下降沿触发 TI1FP2 */	
	TIM_ICInitStructure.TIM_Channel = ADVANCE_IC2PWM_CHANNEL;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
	
	/* 选择定时器输入触发: TI1FP1 */
  TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);		

  /* 选择从模式: 复位模式 */
  TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable);

  /* 使能高级控制定时器 */
  TIM_Cmd(ADVANCE_TIM, ENABLE);

  /* 使能捕获/比较2中断请求 */
  TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);
}


/**
  * @brief  初始化高级控制定时器定时,1ms产生一次中断
  * @param  无
  * @retval 无
  */
void TIM8_Configuration(void)
{
	TIMx_GPIO_Config();
	
	TIMx_NVIC_Configuration();	
  
  TIM_PWMOUTPUT_Config();
	
	TIM_PWMINPUT_Config();
	printf("TIMx_Configuration_ok\n");
}
void  ADVANCE_TIM_IRQHandler (void)
{

  TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);

  IC1Value = TIM_GetCapture1(ADVANCE_TIM);
  IC2Value = TIM_GetCapture2(ADVANCE_TIM);	
//printf("IC1Value = %d  IC2Value = %d ",IC1Value,IC2Value);
//		LCD_ShowNum(0,60,IC1Value,8,16);
//		LCD_ShowNum(70,70,IC1Value,8,16);
  if (IC1Value != 0)
  {
    
    DutyCycle = (float)(IC2Value * 100) / IC1Value;

    Frequency = 168000000/168/(float)IC1Value;
		printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);
		LCD_ShowNum(10,20,DutyCycle,8,16);
		LCD_ShowNum(60,40,Frequency,8,16);
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}
// An highlighted block

 void PWM1_Intput_Mode_Config(void);
 /* 通用定时器PWM输出 */
/* PWM输出引脚 */
#define GENERAL_OCPWM_PIN             GPIO_Pin_5              
#define GENERAL_OCPWM_GPIO_PORT       GPIOA                      
#define GENERAL_OCPWM_GPIO_CLK        RCC_AHB1Periph_GPIOA
#define GENERAL_OCPWM_PINSOURCE				GPIO_PinSource5
#define GENERAL_OCPWM_AF							GPIO_AF_TIM2

/* 通用定时器 */
#define GENERAL_TIM           		    TIM2
#define GENERAL_TIM_CLK       		    RCC_APB1Periph_TIM2

/* 高级控制定时器PWM输入捕获 */
/* PWM输入捕获引脚 */
#define ADVANCE_ICPWM_PIN             GPIO_Pin_6            
#define ADVANCE_ICPWM_GPIO_PORT       GPIOC                      
#define ADVANCE_ICPWM_GPIO_CLK        RCC_AHB1Periph_GPIOC
#define ADVANCE_ICPWM_PINSOURCE				GPIO_PinSource6
#define ADVANCE_ICPWM_AF							GPIO_AF_TIM8
#define ADVANCE_IC1PWM_CHANNEL        TIM_Channel_1
#define ADVANCE_IC2PWM_CHANNEL        TIM_Channel_2

/* 高级控制定时器 */
#define ADVANCE_TIM           		    TIM8
#define ADVANCE_TIM_CLK       		    RCC_APB2Periph_TIM8

/* 捕获/比较中断 */
#define ADVANCE_TIM_IRQn					    TIM8_CC_IRQn
#define ADVANCE_TIM_IRQHandler        TIM8_CC_IRQHandler

外部计数器模式(高频)

原本我还不知道有这种用法,后来看到有人这样用,真的能测到很高100khz-15Mhz误差0.01%——0.02%,频率过于大存在一定的误差,总体还不错。
外部计数器可以用于脉冲数计数
下面展示一些 内联代码片

// A code block
void TIM2_Cnt_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_DeInit(TIM2);
        TIM_DeInit(TIM7);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM7,ENABLE);     
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);            
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOA0
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;      
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PA0
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2); 
        TIM_TimeBaseStructure.TIM_Prescaler=0; 
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
        TIM_TimeBaseStructure.TIM_Period=0xFFFFFFFF;  
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
        TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI2,TIM_ICPolarity_Rising,0);
        TIM_TimeBaseStructure.TIM_Prescaler=18000-1; 
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
        TIM_TimeBaseStructure.TIM_Period=1000-1; 
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
  NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;         
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 
        NVIC_Init(&NVIC_InitStructure);       
        TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE); 
 
        TIM_Cmd(TIM7,ENABLE );        
        TIM_Cmd(TIM2,ENABLE );       
}
u32 TIM7_LastCnt;
u32 TIM_ExtCntFreq;
//频率为TIM_ExtCntFreq 
void TIM7_IRQHandler(void)
{
         char        str[32];
        TIM_ExtCntFreq=(TIM2->CNT-TIM7_LastCnt)*(1/0.1);
	     // printf("%3.3f\n",TIM_ExtCntFreq/1.0/2.128);
        TIM7_LastCnt=TIM2->CNT;
        TIM_ClearITPendingBit(TIM7,TIM_IT_Update);
}

借鉴了一些别人的做法,从中学到了经验,非常感谢__,把自己的学习过程记录一下,也是一个巩固的好方法。如果有错误,请大家指正文章来源地址https://www.toymoban.com/news/detail-651951.html

到了这里,关于stm32 测频率(1HZ—15MHZ时精度0.01%,可测更高,但不是很准)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • E4980A 精密型 LCR 表,20 Hz 至 2 MHz

    E4980A 精密型 LCR 表  20 Hz 至 2 MHz E4980A 精密型 LCR 表实现了测量准确度、速度与通用性的理想结合,适用于各种元器件测量。 E4980A 精密型 LCR 表实现了测量准确度、速度与通用性的理想结合,适用于各种元器件测量。 无论是在低阻抗量程还是在高阻抗量程内,E4980A 均能提供超

    2024年02月06日
    浏览(23)
  • STM32系统时钟频率更改

    注:此文仅作为个人学习记录。 海创学习记录: 图0:手册时钟图   stm32的系统时钟频率在驱动文件中一般情况下是被固定的。系统频率有几种,分别为24MHz、36MHz、48MHz、56MHz、72MHz。一般情况下(_md.s),默认设置为72MHz。可以对系统时钟频率进行更改以适应不同的要求。  

    2024年02月11日
    浏览(39)
  • STM32 输入捕获模式测频率

    单片机学习! 目录 文章目录 前言 一、输入捕获测频率配置步骤 二、代码示例及注意事项 2.1 RCC开启时钟 2.2 GPIO初始化 2.3 配置时基单元 2.4 配置输入捕获单元 2.5 选择从模式的触发源 2.6 配置从模式为Reset 2.7 开启定时器 总结         博文介绍如何配置输入捕获电路来测

    2024年03月10日
    浏览(41)
  • stm32输入捕获测频率&PWM模式测频率占空比

    本文章转自B站江科大自化协    1,输入捕获测频率 接线图  目录结构 IC.h IC.c pwm.c PWM.h      main.c 编译下载出结果   2.PWM模式测频率占空比 接线图同上 目录结构同上 IC.c  IC.h main.c 编译下载测试     PS:测h   

    2024年02月15日
    浏览(34)
  • 64MHz 闪存STM32G0B1CEU6(STM32G0B1CCU6)STM32G0B1CBU6引脚配置图、32位微控制器

    STM32G0B1 32位微控制器具有最高512KB嵌入式闪存和144kB RAM存储器。该器件采用48-UFQFPN 引脚封装。它支持USB全速主机/设备、集成USB Type-C控制器和收发器、FDCAN协议以及多达8个UART。 STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用,并可随时用于物联网 (IoT) 解决方案

    2024年02月09日
    浏览(38)
  • 【单片机】STM32单片机频率计程序,外部脉冲计数程序,基于脉冲计数的频率计程序,STM32F103

    两种方法用于在单片机中实现频率计的功能。 第一种方法是通过定时器来衡量信号的周期,然后将周期转换为频率。在这种方法中,你可以使用单片机的定时器模块来测量输入信号的周期,定时器会产生一个计数值,你可以根据这个计数值来推算出输入信号的周期,并通过简

    2024年02月11日
    浏览(50)
  • STM32——输入捕获IC(测试频率以及PWMI测试频率占空比)

    目录 一、IC介绍 1.1、IC作用 1.2、电路部分  1.2.1、详细电路作用  1.2.2、从模式控制器 1.3、输入捕获配置基本结构 1.3.1、PWMI模式 二、代码配置 2.1、从模式函数 2.1.1、TIM_SelectInputTrigger() 2.1.2、TIM_SelectSlaveMode() 2.1.3、TIM_SelectSlaveMode() 2.2.输入捕获及时基单元函数 2.2.1、

    2024年01月25日
    浏览(40)
  • 基于高性能的STM32G031K4T6、STM32G031K6T6、STM32G031K8T6(ARM微控制器)64MHz 闪存 32-LQFP

    STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用,并可随时用于物联网 (IoT) 解决方案。这些微控制器具有很高的集成度,基于高性能ARM® Cortex®-M0+ 32位RISC内核,工作频率高达64MHz。该器件包含内存保护单元 (MPU)、高速嵌入式内存、DMA以及各种系统功能、增强型

    2024年02月11日
    浏览(44)
  • STM32 定时器 周期 频率 时间 计算

    公式: T(溢出时间)=(ARR+1)*(PSC+1)/Tclk  ARR:自动重装载值 PSC:预分频系数 TCLK:时钟频率 例如:Tclk=72MHz ARR=719 PSC=999 那么 T=720*1000/72000000=1/100s 即每10ms溢出一次 中断计时一次 公式: f=1/T 频率就是周期的倒数   例如:Tclk=72MHz ARR=719 PSC=999 那么 f=72000000/720*1000=100Hz 即该定时器的

    2024年02月16日
    浏览(61)
  • 【STM32】软件I2C控制频率

    在上一篇文章中,我们已经介绍了整个软件I2C的实现原理,但是也遗留了一个问题,那就是I2C速率的控制,其实就是控制SCL信号的频率。 微秒级延时 在上篇文章中,我们使用了SysTick进行延时,具体如下: 关于SysTick延时的原理,可以参考这篇文章 HAL库下的systick 底层配置

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包