STM32CubeMX应用 -- 定时器输入脉冲计数

目录

参考链接

一、实现过程

二、STM32CubeMX配置示例

三、C语言示例程序


参考链接

https://blog.csdn.net/m0_37845735/article/details/105395643

 

一、实现过程

当选择外部的同步时钟信号(TI1F_ED、TI1FP1、TI2FP2)作为计数器的时钟源,也就是计数器时钟源选择为外部模式1时,计数器可以在选定输入端的每个上升沿或下降沿计数,以此来统计输入脉冲,实现脉冲计数功能

 

除了要配置 选择要使用的通用定时器(TIM2~TIM5),选择计时器的时钟源为内部时钟(CK_INT)、根据要定时的时间计算预分频系数(TIMx_PSC)、自动重装载值(TIMx_ARR)、内部时钟的分频系数以外,更重要的还需要配置:

  • 捕获/比较模式寄存器1/2(TIMx_CCMR1/2):有2个寄存器,一个寄存器只能设置2个通道;该寄存器用于设置通道的输入(捕获模式)或输出(比较模式)参数,就输入捕获而言,主要设置滤波器、预分频器、输入映射关系
  • 捕获/比较使能寄存器(TIMx_CCER):配置捕获触发的信号级性、捕获使能,每个定时器有4个通道,这里的CC1P/CC1E表示的是第一个通道
  • 从模式控制寄存器(TIMx_SMCR):选择触发输入源和从模式

例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

1. 配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿

2. 配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000) 注: 捕获预分频器不用作触发,所以不需要对它进行配置

3. 配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性

 

4. 配置TIMx_SMCR寄存器的SMS=’111’,选择定时器外部时钟模式1

5. 配置TIMx_SMCR寄存器中的TS=’110’,选定TI2作为触发输入源

6. 设置TIMx_CR1寄存器的CEN=’1’,启动计数器 当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。

 

二、STM32CubeMX配置示例

 

三、C语言示例程序

下面拿一个测量电容式湿度传感器的脉冲频率为例。如下图所示,湿度传感器会在FOUT输出脚 输出 频率大概为6K-7K的脉冲,频率大小与湿度有一个一 一对应的关系,通过查表的方法就可以将统计的脉冲频率转换成湿度。可以定时1S统计输入的脉冲,这样就可以很方便的计算湿度传感器的频率,进而算出湿度。

/* TIM2 init function */
/*
  TIM2用作湿度传感器定时1S,计算频率
  溢出时间 = (Autoreload + 1) * (Prescaler + 1)/TCCLK72M 
*/
void MX_TIM2_Init(void)
{
    LL_TIM_InitTypeDef TIM_InitStruct;

    /* Peripheral clock enable */
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);

    TIM_InitStruct.Prescaler         = 9999;
    TIM_InitStruct.CounterMode       = LL_TIM_COUNTERMODE_UP;
    TIM_InitStruct.Autoreload        = 7199;
    TIM_InitStruct.ClockDivision     = LL_TIM_CLOCKDIVISION_DIV1;
    TIM_InitStruct.RepetitionCounter = 0;  //重复计数器
    LL_TIM_Init(TIM2, &TIM_InitStruct);
    LL_TIM_EnableARRPreload(TIM2);   //使能自动重装载预装载,ARR寄存器有缓冲区

    LL_TIM_SetClockSource  (TIM2, LL_TIM_CLOCKSOURCE_INTERNAL);
    LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_RESET);
    LL_TIM_DisableMasterSlaveMode(TIM2);
    
    /* TIM2 interrupt Init */
    NVIC_EnableIRQ(TIM2_IRQn);
    
    LL_TIM_EnableIT_UPDATE (TIM2);//使能更新中断
    LL_TIM_ClearFlag_UPDATE(TIM2);
    LL_TIM_EnableCounter   (TIM2);

}

/* TIM1-CH1 init function */
/*
  TIM1-CH1用作湿度传感器外部计数
*/
void MX_TIM1_Init(void)
{
    LL_TIM_InitTypeDef     TIM_InitStruct = {0};

    /* Peripheral clock enable */
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM1);
    /**TIM1 GPIO Configuration  
    PA8   ------> TIM1_CH1 湿度传感器脉冲计数
    */
    
    
    TIM_InitStruct.Prescaler     = 0;
    TIM_InitStruct.CounterMode   = LL_TIM_COUNTERMODE_UP;
    TIM_InitStruct.Autoreload    = 0xffff;
    TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
    LL_TIM_Init(TIM1, &TIM_InitStruct);
    LL_TIM_DisableARRPreload     (TIM1);
	
	/*从模式控制寄存器(TIMx_SMCR)*/
    LL_TIM_SetTriggerInput       (TIM1, LL_TIM_TS_TI1FP1);//TIMx_SMCR->TS 设置输入触发源
    LL_TIM_SetClockSource        (TIM1, LL_TIM_CLOCKSOURCE_EXT_MODE1);//TIMx_SMCR->SMS 选择计数器的时钟来源
	/*捕获/比较模式寄存器1(TIMx_CCMR1)*/
    LL_TIM_IC_SetFilter          (TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_IC_FILTER_FDIV1);//设置输入滤波器,不滤波 TIMx_CCMR1->ICxF
	/*捕获/比较使能寄存器(TIMx_CCER)*/
    LL_TIM_IC_SetPolarity        (TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_FALLING);//设置输入捕获极性,下降沿捕获 TIMx_CCER->CCxP
	
    LL_TIM_DisableIT_TRIG        (TIM1);
    LL_TIM_DisableDMAReq_TRIG    (TIM1);
	
    LL_TIM_SetTriggerOutput      (TIM1, LL_TIM_TRGO_RESET);
    LL_TIM_DisableMasterSlaveMode(TIM1);

    /* TIM1 interrupt Init */
    NVIC_EnableIRQ(TIM1_UP_IRQn);
    
    LL_TIM_SetCounter      (TIM1, 0);
    LL_TIM_EnableIT_UPDATE (TIM1);
    LL_TIM_ClearFlag_UPDATE(TIM1);
    LL_TIM_EnableCounter   (TIM1);   
	
}

/*
  * @brief This function handles TIM1-CH1 update interrupt.
  * 湿度传感器脉冲计数溢出中断
  * 中断优先级大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,所以在中断中不可调用FreeRTOS函数
  * 湿度传感器频率大概为6K-7K,而TIM1溢出计数为65536,溢出视为错误
*/
void TIM1_UP_IRQHandler(void)
{
    if(LL_TIM_IsActiveFlag_UPDATE(TIM1))
    {
        Humit_FreqOver_Set();
        LL_TIM_ClearFlag_UPDATE(TIM1);	       
    }
}


/*
  * @brief This function handles TIM2 update interrupt.
  * 湿度传感器定时1S中断
  * 中断优先级大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,所以在中断中不可调用FreeRTOS函数
*/
void TIM2_IRQHandler(void)
{
    unsigned int iFreq = 0;
    
    if(LL_TIM_IsActiveFlag_UPDATE(TIM2))
    {
        iFreq = LL_TIM_GetCounter(TIM1); //获取TIM1湿度传感器脉冲计数
        Humit_Freq_Set(iFreq);
        LL_TIM_SetCounter(TIM1,0);
        
        LL_TIM_SetCounter(TIM2,0);   //清空计数
        LL_TIM_ClearFlag_UPDATE(TIM2);	
    }
}

 

 

  • 15
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在STM32CubeMX中进行脉冲计数,可以通过以下步骤实现: 1. 配置GPIO引脚:首先,使用STM32CubeMX配置工具选择适当的GPIO引脚,将其设置为输入模式,并使能上拉电阻或下拉电阻,以确保稳定的输入信号。 2. 配置定时器:选择一个合适的定时器(例如TIM2),并在STM32CubeMX中配置它。设置定时器计数模式为向上计数,选择适当的时钟源和预分频器,以满足计数需求。确保启用定时器计数功能,并选择适当的计数模式(例如边沿计数模式)。 3. 配置输入捕获通道:在定时器配置中,启用一个或多个输入捕获通道。选择适当的输入捕获通道(例如TI2),并设置其输入捕获模式为上升沿触发。这将使得定时器在检测到上升沿时记录当前计数器的值。 4. 启动计数器:在配置完成后,将TIMx_CR1寄存器中的CEN位设置为1,以启动定时器计数器。 5. 读取计数值:当上升沿出现在输入捕获通道时,定时器将自动记录当前计数器的值,并设置相应的标志位(例如TIF标志)。通过读取定时器计数寄存器,可以获得脉冲计数值。 使用上述步骤,您可以在STM32CubeMX中进行脉冲计数并将其显示在TFTLCD上。同时,如果上位机传来命令,您可以将计数值上传到上位机进行进一步处理。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [利用STM32的HAL库进行脉冲计数(捕获方式)](https://download.csdn.net/download/qq_44851109/12338207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32CubeMX应用 -- 定时器输入脉冲计数](https://blog.csdn.net/m0_37845735/article/details/105399892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值