/* USERCODE BEGIN 1 */
unsignedchar bAcquireTimeTransfer2PCFlag, bCaptureControlFlag;
uint32_tTim3IRQNum = 0, TotalTimeStart, TotalTimeEnd, TotalAcquireTimeUs;
externuint32_t u32Time
RFreq;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim)
{
if( (TIM3 == htim->Instance) &&(HAL_TIM_ACTIVE_CHANNEL_3 == htim->Channel) )
{
bCaptureControlFlag =HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); //PB0输入
if(bCaptureControlFlag) // HighLevel
{
Tim3IRQNum = 0;
TotalTimeStart =HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3); //捕获上升沿时的
计数器读数
bAcquireTimeTransfer2PCFlag= FALSE;
//捕获上升沿后,马上改变极性为Falling,以捕获脉冲下降沿
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3,TIM_INPUTCHANNELPOLARITY_FALLING);
}
else// Low Level
{
TotalTimeEnd =HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
TotalAcquireTimeUs = 65536 * Tim3IRQNum + TotalTimeEnd -TotalTimeStart;
TotalAcquireTimeUs >>=6;
bAcquireTimeTransfer2PCFlag= TRUE;
//change POLARITY;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING); // Rising Edge
}
__HAL_TIM_CLEAR_IT(htim,TIM_IT_CC3);
}
}
voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(TIM3 == htim->Instance)
{
__HAL_TIM_CLEAR_IT(htim,TIM_IT_UPDATE);
if(bCaptureControlFlag)Tim3IRQNum++;
}
}
/* USERCODE END 1 */
1) HAL_TIM_IC_CaptureCallback和HAL_TIM_PeriodElapsedCallback是重构函数,HAL库里自带,但只是个壳,需要自己重新编写内容。
2) 之所以要使用HAL_TIM_PeriodElapsedCallback溢出回调函数,是因为脉冲有长短,以us计算,会超过65536/64M=1024us.累计高电平脉冲内的溢出次数,就可以测算长脉宽。
3) 捕获脉冲时间计算问题:
a) 捕获得知的是多少个时钟脉冲,以1KHz脉宽计算,高电平部分是500us,捕获共计32000个时钟脉冲。
b) Tim3的时钟是64MHz,这个可以用函数测得u32TimerFreq= HAL_RCC_GetPCLK1Freq()<<1;
c) 由于Prescaler=0,不分频,因此时长t=32000/(64M/(Prescaler+1))=500us.
7. 编译通过,烧写开发板,用1KHz脉冲做试验。实测高电平部分为500us,项目顺利完成。