STM32—TIM:基本定时器(输入捕获:测频率、周期)(标准库)

 频率测量:

 频率>中界频率:适用测周法                                                          频率<中界频率:适用测频法

第一步:配置GPIO,TIM的时基单元
             在配置TIM的时基单元参数有些许不同。

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;


	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);



    TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARR
    
    以最大量程计数,防止计数溢出




    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC 

    这个决定计数频率:72M/PSC,这里取72-1,则计数频率就1MHZ

    最低频率:1MHZ/65535 = 15HZ  所以最低频率由PSC决定


初始化输入捕获单元:void TIM_ICInit();
 

/**
  * @brief  Initializes the TIM peripheral according to the specified
  *         parameters in the TIM_ICInitStruct.
  * @param  TIMx: where x can be  1 to 17 except 6 and 7 to select the TIM peripheral.
  * @param  TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
  *         that contains the configuration information for the specified TIM peripheral.
  * @retval None
  */
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
{
  ......
}


   参数讲解

	TIM_ICInitStructure.TIM_Channel =          选择通道

	TIM_ICInitStructure.TIM_ICFilter =         选择滤波器

	TIM_ICInitStructure.TIM_ICPolarity =       选择触发极性

	TIM_ICInitStructure.TIM_ICPrescaler =      选择分频系数

	TIM_ICInitStructure.TIM_ICSelection =      选择触发信号的输入端      

配置触发源:void TIM_SelectInputTrigger()
 

/**
  * @brief  Selects the Input Trigger source
  * @param  TIMx: where x can be  1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
  * @param  TIM_InputTriggerSource: The Input Trigger source.
  *   This parameter can be one of the following values:
  *     @arg TIM_TS_ITR0: Internal Trigger 0
  *     @arg TIM_TS_ITR1: Internal Trigger 1
  *     @arg TIM_TS_ITR2: Internal Trigger 2
  *     @arg TIM_TS_ITR3: Internal Trigger 3
  *     @arg TIM_TS_TI1F_ED: TI1 Edge Detector
  *     @arg TIM_TS_TI1FP1: Filtered Timer Input 1
  *     @arg TIM_TS_TI2FP2: Filtered Timer Input 2
  *     @arg TIM_TS_ETRF: External Trigger input
  * @retval None
  */
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
{
  ...........
}

选择从模式:void TIM_SelectSlaveMode()
 

/**
  * @brief  Selects the TIMx Slave Mode.
  * @param  TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
  * @param  TIM_SlaveMode: specifies the Timer Slave Mode.
  *   This parameter can be one of the following values:
  *     @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes
  *                               the counter and triggers an update of the registers.
  *     @arg TIM_SlaveMode_Gated:     The counter clock is enabled when the trigger signal (TRGI) is high.
  *     @arg TIM_SlaveMode_Trigger:   The counter starts at a rising edge of the trigger TRGI.
  *     @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.
  * @retval None
  */
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)
{
  .............
}

使能定时器:void TIM_Cmd();
 

/**
  * @brief  Enables or disables the specified TIM peripheral.
  * @param  TIMx: where x can be 1 to 17 to select the TIMx peripheral.
  * @param  NewState: new state of the TIMx peripheral.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  ............
}

那么,怎么获取周期呢:根据测周法:fx = fc / N  
 

根据测周法:fx = fc / N

fc  为标准频率  根据PSC的配置 fc = 1MHZ


 则 N 等于输入捕获的值: TIM_GetCapture1()、 TIM_GetCapture2()、 TIM_GetCapture3()、 
                        TIM_GetCapture4()、

/**
  * @brief  Gets the TIMx Input Capture 2 value.
  * @param  TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
  * @retval Capture Compare 1 Register value.
  */
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx)
{
  ..............
}


如何测占空比?只需要将CH2通道配置成相反的的数

然后 Duty = CCR(CH2)/CCR(CH1)  or  CCR(CH1)/CCR(CH2) 

其他函数:void TIM_PWMIConfig();

/**
  * @brief  Configures the TIM peripheral according to the specified
  *         parameters in the TIM_ICInitStruct to measure an external PWM signal.
  * @param  TIMx: where x can be  1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
  * @param  TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
  *         that contains the configuration information for the specified TIM peripheral.
  * @retval None
  */
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
{
.........................
}



将通道CH1和CH2配置成相反的参数,不支持CH3,和CH4

快速配置成PWMI的标准模型

<think>好的,用户想要在STM32F407上使用TIM4定时器输入捕获功能来频率,并且需要标准库的代码示例。首先,我需要回忆一下STM32标准库定时器的配置方法,特别是输入捕获模式。 首先,输入捕获通常用于量信号的脉冲宽度或频率TIM4是一个通用定时器,支持输入捕获功能。用户需要配置TIM4的某个通道(比如通道1)为输入捕获模式,并设置相应的中断来捕获上升沿或下降沿。 接下来,考虑如何频率。通常的方法是捕获两个连续的上升沿,计算这两个事件之间的时间差,从而得到周期,进而得到频率。这需要用到定时器的计数器溢出处理,因为如果信号频率较低,计数器可能会溢出多次,需要记录溢出的次数来准确计算时间差。 然后,需要配置GPIO引脚,将TIM4的通道1对应的引脚设置为复用功能,并配置为上拉或下拉输入,具体取决于信号源的情况。例如,使用PA11引脚作为TIM4_CH1的输入。 在标准库中,需要初始化TIM4的时基单元,设置预分频器(PSC)和自动重载值(ARR),以确定定时器的计数频率。例如,如果系统时钟是168MHz,预分频设置为83,则定时器的时钟为168MHz/(83+1)=2MHz,每个计数周期为0.5微秒。这样,ARR设置为最大值0xFFFF,可以量更长的周期输入捕获的配置包括设置捕获边沿(如上升沿)、使能捕获中断和更新中断(处理计数器溢出)。在中断服务例程中,需要处理两种中断:捕获事件和溢出事件。每次捕获时记录当前计数器的值,并计算与前一次捕获的时间差,同时考虑溢出的次数。 此外,还需要编写中断服务函数,计算两次上升沿之间的时间差,从而得到信号的周期频率即为周期的倒数。需要注意处理计数器溢出的情况,每次溢出时增加一个溢出计数器,以便在计算总时间时加上溢出次数乘以ARR的值。 最后,试代码的正确性,可能需要通过示波器或信号发生器生成已知频率的信号,验证量结果的准确性。同时,需要考虑输入信号的频率范围,确保定时器的配置能够覆盖所需的量范围,避免溢出次数过多导致计算错误。 可能的问题包括中断优先级配置不当导致其他中断延迟,或者未正确清除中断标志位导致中断重复进入。此外,输入信号的噪声可能会影响捕获的准确性,需要添加滤波措施,如配置输入捕获滤波器。 总结步骤:配置GPIO、初始化TIM4、配置输入捕获参数、启用中断、编写中断处理函数、计算频率。需要参考STM32F4的标准外设库手册,确保函数和寄存器配置正确。</think>以下是基于STM32F407标准库TIM4输入捕获频率代码示例及解析: ### 1. GPIO配置 将PA11引脚配置为TIM4_CH1输入: ```c GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻 GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_TIM4); // 复用为TIM4 ``` ### 2. 定时器基础配置 ```c TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStruct.TIM_Prescaler = 83; // 84分频(168MHz/84=2MHz) TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBa
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值