STM32-HAL 学习-TIM输入捕获-07

1.时钟配置如前面

 

2.定时器输入捕获通道一设置

 3.主函数(注意开启定时器中断)

uint16_t  capture = 0;
uint8_t End_status = 0;
uint16_t Cap_Timer = 0;
uint32_t H_Timer = 0;



int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM6_Init();
  MX_TIM5_Init();
  /* USER CODE BEGIN 2 */
   HAL_TIM_Base_Start_IT(&htim5);               //开启定时器5中断
   HAL_TIM_Base_Start_IT(&htim6);               //开启定时器6中断
   HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);	//启动输入捕获       
   printf("STM32 定时器2 输入捕获 获取高电平脉冲");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  if(End_status == 1)   //捕获成功
	  {
	      End_status = 0;
		  H_Timer = capture + Cap_Timer*0xFFFF;
		  printf("获取高电平脉冲时间: %d.%d ms",H_Timer/1000,H_Timer%1000);
	  }
	 
  }
  /* USER CODE END 3 */
}

4.定时器回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint16_t Timer = 0;
	
	if(TIM5 == htim->Instance)
	{
         Cap_Timer++;
	}
	
	if(TIM6 == htim->Instance)
	{
	    if(++Timer == 1000)  //到1S LED取反
		{
			Timer = 0;
		   HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
		}
	}
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	
	static  uint8_t First_status = 1;
   
	if(TIM5 == htim->Instance )
	{
		
	   if(First_status == 1)
	   {
		   Cap_Timer = 0;
		   capture = 0;
		   
		   __HAL_TIM_SetCounter(&htim5,0);         //清零
		   //修改定时器一通道的输入捕获极性 下降沿
		  __HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); 
		   
		   
		   First_status = 0;
	   }  
	   else
	   {
		   //capture = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
		   capture = __HAL_TIM_GetCounter(&htim5); //获取高电平时间
	       __HAL_TIM_SetCounter(&htim5,0);	   
           //修改定时器一通道的输入捕获极性 上升沿
		   __HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
		  
		   
		   First_status = 1;
		   End_status = 1;   //捕获成功标志
	   }	     
	}
}

4.调试结果(抓取PC0时间)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,输入捕获是一种用于测量外部信号脉冲宽度或频率的功能。通过输入捕获,可以在特定的跳变沿上锁存计数器的值,并计算出脉冲宽度或频率。在HAL库中,提供了一些函数来实现输入捕获功能。 首先,可以使用以下函数来启动或停止输入捕获功能: - HAL_TIM_IC_Start_IT:以中断方式启动输入捕获功能,并使能相应的中断。 - HAL_TIM_IC_Stop_IT:以中断方式停止输入捕获功能和相应中断。 - HAL_TIM_IC_Start:以轮询方式启动输入捕获功能。 - HAL_TIM_IC_Stop:以轮询方式停止输入捕获功能。 另外,可以使用以下函数来读取捕获值: - HAL_TIM_ReadCapturedValue:读取CCRx寄存器的值,获取当前的捕获值。 在使用输入捕获功能时,需要注意捕获的脉宽时间长度是否超过捕获定时器的周期,如果超过会发生溢出,需要进行额外的处理。 在HAL库中,还提供了一些回调函数来处理定时器溢出和捕获中断: - HAL_TIM_PeriodElapsedCallback:定时器溢出回调函数。 - HAL_TIM_IC_CaptureCallback:捕获中断回调函数。 通过使用这些HAL库函数,可以方便地实现STM32输入捕获功能。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [STM32定时器输入捕获教程(hal库)](https://blog.csdn.net/weixin_46002646/article/details/117003312)[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^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32 HALSTM32CubeMX -- 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^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值