01-CubeMX 输入捕获实验

第一步:配置CubeMX 基本参数

注意:本文选用的芯片是STM32F103C8T6,不同的芯片大同小异,区别在于外设引脚的不同,所配置的管脚不用以及所写的函数不同。

1.RCC/SYS/CLOCK 72MZ等。在00_STM32CubeMX基本配置中已经讲解

第二步:配置输入捕获/串口

2.1 配置PA1 TIM2CH2 为输入捕获

在这里插入图片描述

2.2 配置串口

在这里插入图片描述
配置好后点击CubeMX右上角的generate code

第三步:编写MAIN函数以及TIM的回调函数以及TIM溢出更新中断函数

3.1 编写输入捕获回调函数以及溢出更新中断函数

uint8_t  TIM5CH1_CAPTURE_STA=0;							//ÊäÈ벶»ñ״̬		    				
uint16_t	TIM5CH1_CAPTURE_VAL;							//ÊäÈ벶»ñÖµ(TIM5ÊÇ16λ)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//¸üÐÂÖжϣ¨Òç³ö£©·¢ÉúʱִÐÐ
{
	if((TIM5CH1_CAPTURE_STA&0X80)==0)				//»¹Î´³É¹¦²¶»ñ
	{
		if(TIM5CH1_CAPTURE_STA&0X40)				//ÒѾ­²¶»ñµ½¸ßµçƽÁË
		{
			if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)	//¸ßµçƽ̫³¤ÁË
			{
				TIM5CH1_CAPTURE_STA|=0X80;			//±ê¼Ç³É¹¦²¶»ñÁËÒ»´Î
				TIM5CH1_CAPTURE_VAL=0XFFFF;
			}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(&htim2,TIM_CHANNEL_2);//»ñÈ
			TIM_RESET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_2);   //Ò»¶¨ÒªÏÈÇå³ýÔ­À´µÄÉèÖã¡£¡
            TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_2,TIM_ICPOLARITY_FALLING);//ÅäÖÃTIM5ͨµÀ1ÉÏÉýÑز¶»ñ
		}else  										//»¹Î´¿ªÊ¼,µÚÒ»´Î²¶»ñÉÏÉýÑØ
		{
			TIM5CH1_CAPTURE_STA=0;					//Çå¿Õ
			TIM5CH1_CAPTURE_VAL=0;
			TIM5CH1_CAPTURE_STA|=0X40;				//±ê¼Ç²¶»ñµ½ÁËÉÏÉýÑØ
			__HAL_TIM_DISABLE(&htim2);      	//¹Ø±Õ¶¨Ê±Æ÷5
			__HAL_TIM_SET_COUNTER(&htim2,0);
			TIM_RESET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_2);   //Ò»¶¨ÒªÏÈÇå³ýÔ­À´µÄÉèÖã¡£¡
			TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_2,TIM_ICPOLARITY_RISING);//¶¨Ê±Æ÷5ͨµÀ1ÉèÖÃΪϽµÑز¶»ñ
			__HAL_TIM_ENABLE(&htim2);		//ʹÄܶ¨Ê±Æ÷5
		}		    
	}		
}

在这里插入图片描述

3.2 编写主函数

1)在主函数中打开捕获中断以及使能溢出更新中断。注意一定要在各种初始化函数后,否则会造成无法按代码运行的情况

  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);  //¿ªÆôTIM2_CH2²¶»ñÖжÏ
  __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);  //ʹÄܸüÐÂÖжÏ

在这里插入图片描述
2)编写主函数while函数中的内容

HAL_Delay(10);
    if(TIM5CH1_CAPTURE_STA&0X80)        //³É¹¦²¶»ñµ½ÁËÒ»´Î¸ßµçƽ
		{  
			temp=TIM5CH1_CAPTURE_STA&0X3F; 
			temp*=65536;		 	    	//Òç³öʱ¼ä×ܺÍ
			temp+=TIM5CH1_CAPTURE_VAL;      //µÃµ½×ܵĸߵçƽʱ¼ä
			printf("HIGH:%lld us\r\n",temp);//´òÓ¡×ܵĸߵãƽʱ¼ä
			TIM5CH1_CAPTURE_STA=0;          //¿ªÆôÏÂÒ»´Î²¶»ñ
		}

在这里插入图片描述
temp为 long long类型,在mian函数中声明
TIM5CH1_CAPTURE_STA 为无符号短整形 8位 位[7],位[6]为捕获状态的判断条件。位[5:0]为溢出数据的次数最大为2的5次方为64。在 mian.c文件中声明extern
TIM5CH1_CAPTURE_VAL 为TIM最后一个CRR的时间,如下图所示。在 mian.c文件中声明extern
在这里插入图片描述

总结

大致流程就是这样,不同的芯片配置基本一样。但是要注意一些细节本人在配置的时候就因为不细心一个分号的位置不对导致排查了一个晚上+上午。如下图所示
在这里插入图片描述
在这里插入图片描述
非常不巧的是keil在编译时没有显示错误和警告。

以上的代码参考杨桃电子视频教程以及正点原子。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值