STM32——输入捕获

以下是定时器捕获比较通道的原理图

定时器的四个捕获通道
如图所示,TIM的输出比较与输入捕获共用四个通道(CHANNEL1-CHANNEL4),因此,在使用输入捕获与输出比较时,通常都会将对应引脚设置为复用推挽输出(GPIO_MODE_AF_PP)或者复用开漏输出GPIO_MODE_AF_OD)。

为什么要将引脚设置为复用模式

GPIO结构图
不难看出,当我们将设置了引脚的复用功能时,输入的数据会直接跳过输入数据寄存器,而是传输到片上外设,而输出控制也直接由片上外设控制,而在使用捕获比较功能时,片上外设便是设置的定时器。
片上外设有很多,所以复用功能的用途是非常广泛的,这里着重讲述输入捕获功能。

输入捕获原理

输入捕获的功能主要为测量从捕获通道接受的脉冲宽度或频率(如:测量PWM波频,解析红外波形数据)
输入捕获是通过上升沿或下降沿来触发 “CNT计数器”,以上升沿触发为例,当TIM捕获到上升沿时,激活CNT计数器,当下降沿到来时结束基数,即可精确测得高电平的脉冲宽度。

输入捕获的设置

假设使用TIM1的CHANNEL1作为捕获通道
首先进行TIM1的初始化

  TIM_HandleTypeDef htim1;
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = (72-1);
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 0XFFFF; //这里为了尽可能的接收到数据,设置为最大值
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_IC_Init(&htim1);

随后进行TIM1的输入捕获配置

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_IC_InitTypeDef sConfigIC = {0};
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;//上升沿触发
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1);

TIM1 的CHANNEL1通道位于引脚PA6上,接下来进行PA6的初始化

  _HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

至此,输入捕获的初始化基本完成

输入捕获的使用

输入捕获可以通过以下函数来获取捕获到的信息

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);

同时,在使用输出捕获时也要注意以下函数的使用

HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);//定时器使能
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);//定时器与中断同时使能
HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);//输入捕获使能
HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);//捕获中断使能

2023.03.30 补丁

原因:个人在此之间使用hal库会出现无法调用捕获回传函数HAL_TIM_IC_CaptureCallback()的情况。

捕获中断的函数调用层次

假设使用TIM3作为输入捕获的定时器

void TIM3_IRQHandler(void)
{
   HAL_TIM_IRQHandler(&htim3);
}
//首先触发定时中断,而后在定时中断中调用HAL_TIM_IRQHandler函数
//HAL_TIM_IRQHandler会调用HAL_TIM_IC_CaptureCallback函数,并能实现自动清除标志位。
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

调用关系 TIM3_IRQHandler -> HAL_TIM_IRQHandler -> HAL_TIM_IC_CaptureCallback

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值