物理引脚连接
连接PULS1、PULSE2
对应RP3、RP4
Cubemax
引脚配置
PA1-TIM2_CH2
PA2-TIM2_CH3
初始化
将相应TIM和通道设为input Capture direct mode
PSC:79
Counter Period:0xFFFFFFFF
NVIC使能中断
keil代码部分
主函数中初始化
//开启捕获中断
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_3);
回调函数主要是复制example中的回调函数,包括其中的变量定义
复制文件路径:
2-新版竞赛平台\4-库文件\STM32Cube_FW_G4_V1.2.0\Projects\NUCLEO-G431RB\Examples\TIM\TIM_InputCapture
找到里面的回调函数代码
//变量定义
uint32_t uwIC2Value1 = 0;
uint32_t uwIC2Value2 = 0;
uint32_t uwDiffCapture = 0;
/* Capture index */
uint16_t uhCaptureIndex = 0;
/* Frequency Value */
uint32_t uwFrequency = 0;
//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
if(uhCaptureIndex == 0)
{
/* Get the 1st Input Capture value */
uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
uhCaptureIndex = 1;
}
else if(uhCaptureIndex == 1)
{
/* Get the 2nd Input Capture value */
uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
/* Capture computation */
if (uwIC2Value2 > uwIC2Value1)
{
uwDiffCapture = (uwIC2Value2 - uwIC2Value1);
}
else if (uwIC2Value2 < uwIC2Value1)
{
/* 0xFFFF is max TIM1_CCRx value */
uwDiffCapture = ((0xFFFF - uwIC2Value1) + uwIC2Value2) + 1;
}
else
{
/* If capture values are equal, we have reached the limit of frequency
measures */
Error_Handler();
}
/* Frequency computation: for this example TIMx (TIM1) is clocked by
APB2Clk */
uwFrequency = HAL_RCC_GetPCLK2Freq() / uwDiffCapture;
uhCaptureIndex = 0;
}
}
}
上面是复制过来的代码,下面需要把上面的代码完整复制下来,用keil5新建文件(就像建立一个.c文件一样),放到里边进行修改,修改完文件也不用保存,再复制到回调函数中即可。
修改:
用ctrl加h调出来集体替换的按钮
完成以下替换
uwIC2Value1--> uwIC3Value1
uwIC2Value2-->uwIC3Value2
uwDiffCapture-->uwDiffCapture_ch3
uhCaptureIndex-->uhCaptureIndex_ch3
uwFrequency-->uwFrequency_ch3
HAL_TIM_ACTIVE_CHANNEL_2-->HAL_TIM_ACTIVE_CHANNEL_3
换完后放入将定义的变量放入之前定义变量的地方,回调函数的内容复制到刚才复制的回调函数中
(注意大括号)
最后将这两个通道的回调函数的内容在回调函数中用下面的if包起来,防止与其他TIM冲突
if(htim->Instance == TIM2)
{
}
最后的结构类似:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
//TIM_2CH3的频率捕获
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
}
//TIM_2CH2的频率捕获
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
}
}
}
下面是完整的回调函数代码
//输入捕获
uint32_t uwIC2Value1 = 0;
uint32_t uwIC2Value2 = 0;
uint32_t uwDiffCapture = 0;
/* Capture index */
uint16_t uhCaptureIndex = 0;
/* Frequency Value */
uint32_t uwFrequency = 0;
uint32_t uwIC3Value1 = 0;
uint32_t uwIC3Value2 = 0;
uint32_t uwDiffCapture_ch3 = 0;
/* Capture index */
uint16_t uhCaptureIndex_ch3 = 0;
/* Frequency Value */
uint32_t uwFrequency_ch3 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
if(uhCaptureIndex == 0)
{
/* Get the 1st Input Capture value */
uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
uhCaptureIndex = 1;
}
else if(uhCaptureIndex == 1)
{
/* Get the 2nd Input Capture value */
uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
/* Capture computation */
if (uwIC2Value2 > uwIC2Value1)
{
uwDiffCapture = (uwIC2Value2 - uwIC2Value1);
}
else if (uwIC2Value2 < uwIC2Value1)
{
/* 0xFFFF is max TIM1_CCRx value */
uwDiffCapture = ((0xFFFFFFFF - uwIC2Value1) + uwIC2Value2) + 1;
}
else
{
/* If capture values are equal, we have reached the limit of frequency
measures */
Error_Handler();
}
/* Frequency computation: for this example TIMx (TIM1) is clocked by
APB2Clk */
uwFrequency = HAL_RCC_GetPCLK2Freq() / uwDiffCapture;
uhCaptureIndex = 0;
}
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
if(uhCaptureIndex_ch3 == 0)
{
/* Get the 1st Input Capture value */
uwIC3Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
uhCaptureIndex_ch3 = 1;
}
else if(uhCaptureIndex_ch3 == 1)
{
/* Get the 2nd Input Capture value */
uwIC3Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
/* Capture computation */
if (uwIC3Value2 > uwIC3Value1)
{
uwDiffCapture_ch3 = (uwIC3Value2 - uwIC3Value1);
}
else if (uwIC3Value2 < uwIC3Value1)
{
/* 0xFFFF is max TIM1_CCRx value */
uwDiffCapture_ch3 = ((0xFFFFFFFF - uwIC3Value1) + uwIC3Value2) + 1;
}
else
{
/* If capture values are equal, we have reached the limit of frequency
measures */
Error_Handler();
}
/* Frequency computation: for this example TIMx (TIM1) is clocked by
APB2Clk */
uwFrequency_ch3 = HAL_RCC_GetPCLK2Freq() / uwDiffCapture_ch3;
uhCaptureIndex_ch3 = 0;
}
}
}
}