第一步:配置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在编译时没有显示错误和警告。
以上的代码参考杨桃电子视频教程以及正点原子。