【STM32F4】HAL库 CubeMX(九)--------定时器输入捕获实验


前言

上一篇,我们介绍了 STM32F4 的通用定时器作为 PWM 输出的使用方法,这一篇,我们将向大家介绍通用定时器作为输入捕获的使用。在本章中,我们将用 TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 KEY_UP 按键输入高电平),通过串口打印高电平脉宽时间。

一、输入捕获是什么?

输入捕获模式可以用来测量脉冲宽度或者测量频率。(原理方面不做过多讲解,需要则可以查看STM32F4开发指南库函数版本本节知识,我们开始配置)

二、输入捕获实验

1.功能配置

1、根据库函数本实验是以定时器5的CH1为例,在功能选择区选择TIM5。
2、根据库函数配置,选择对应的参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、设置串口,接收数据。
在这里插入图片描述

4、采用LED0作为实验提示。
在这里插入图片描述

2.时钟配置

RCC时钟配置如前文一样(此处一般情况是不变的)。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)

3.生成代码

1、串口代码中,定义printf和scanf。此处参看【STM32F4】HAL库 CubeMX(三)--------串口实验
2、此处虽然改定时器32位,数据范围比较宽广,但是为了适应更加多的场合,我们采用宁外一种方式,记录溢出中断次数。(请注意溢出中断和捕获中断是两个不同的中断回调函数)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	uint32_t TIM5CH1_CAPTURE_STA,TIM5CH1_CAPTURE_VAL;
	uint32_t high_time; 
  HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1); 
	if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获第一次高电平
	{
		HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);//获取一次翻转一次LED
		high_time=TIM5CH1_CAPTURE_STA&0X3F;
		high_time*=0xFFFFFFFF;					        //溢出时间总和
		high_time+=TIM5CH1_CAPTURE_VAL;		//得到总的高电平时间
		TIM5CH1_CAPTURE_STA=0;
		printf("%d	us\n",high_time);
	}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM5)
	{
		if((TIM5CH1_CAPTURE_STA & 0x80) == 0)
		{
			if(TIM5CH1_CAPTURE_STA & 0x40)
			{
				if((TIM5CH1_CAPTURE_STA & 0x3f) == 0x3f)
				{
				  TIM5CH1_CAPTURE_STA |= 0x80;
				  TIM5CH1_CAPTURE_VAL = 0XFFFFFFFF;
				}else	TIM5CH1_CAPTURE_STA++;
			}
		}
	}
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if ( (TIM5CH1_CAPTURE_STA & 0x80) == 0 )
  {
    if (TIM5CH1_CAPTURE_STA & 0x40)
    {
      TIM5CH1_CAPTURE_STA |= 0x80;
      TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1);
      TIM_RESET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1);	
      TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);
      
    }
    else
    {
      TIM5CH1_CAPTURE_STA = 0;
      TIM5CH1_CAPTURE_VAL = 0;
      TIM5CH1_CAPTURE_STA |= 0x40;
      __HAL_TIM_DISABLE(&htim5);
      __HAL_TIM_SET_COUNTER(&htim5,0);
      TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);
      TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
      __HAL_TIM_ENABLE(&htim5);
    }
  }
}

代码注释就不写了(太难打了),大家可以对应库函数实验代码进行理解。有问题也可以在评论里提出来。一起解决,如果以上有误请提出来,谢谢


总结

输入捕获就存在两种中断。在定时器中断我们也具体说过两个的不同。
到此为止,我们大概了解了32的一些基本的操作,后面我们将一一推出模块的调试和实验。
在这里插入图片描述

  • 16
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HAL库中的定时器输入捕获功能可以通过以下几个函数来实现: 1. HAL_TIM_Base_Start_IT(&htim2):该函数用于开启定时器的溢出中断,其中htim2是定时器的句柄。 2. HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2):该函数用于开启输入捕获中断,其中htim2是定时器的句柄,TIM_CHANNEL_2是要使用的通道。 3. HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_2):该函数用于关闭输入捕获中断,其中htim2是定时器的句柄,TIM_CHANNEL_2是要关闭的通道。 4. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim):这是一个定时器溢出回调函数,当定时器溢出时会自动调用该函数。 5. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim):这是一个捕获中断回调函数,当捕获到信号跳变沿时会自动调用该函数。 #### 引用[.reference_title] - *1* [【STM32F4HAL库 CubeMX()--------定时器输入捕获实验](https://blog.csdn.net/qq_47877230/article/details/108971861)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)](https://blog.csdn.net/Dir_x/article/details/129006634)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值