|
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
MX_TIM5_Init();
/* USER CODE BEGIN 2 */
delay_init();
// OLED_init();//oled初始化
CSB_Init();//超声波初始化
printf ( "STM32 输入捕获实验\n" );
printf ( "按下KEY1,测试KEY1按下的时间\n" );//当初测试时没来得及修改,不影响程序正常进行
t=' ';
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* 超声波触发信号*/
GPIO_SetBits(GPIOA,GPIO_PIN_1);
US100_DelayUS(20);
GPIO_ResetBits(GPIOA,GPIO_PIN_1);
/* 进行超声波反馈高电平脉宽测量*/
if(strCapture.ucFinishFlag == 1 )
{
/*计算高电平数值 */
ulTime = strCapture .usPeriod * GENERAL_TIM_PERIOD + strCapture .usCtr;
temp=((ulTime % ulTmrClk)*340)/(1000*2);
printf ( ">>测得距离为%dmm\n",temp);
strCapture .ucFinishFlag = 0;
HAL_Delay(100);
}
}
/* USER CODE END 3 */
}
定时器中断回调函数
/**
* oˉêy1|Äü: ¶¨ê±Æ÷êäèë2¶»ñÖD¶Ï»Øμ÷oˉêy
* êäèë2Îêy: htim£o¶¨ê±Æ÷¾ä±ú
* ·μ »Ø Öμ: ÎT
* Ëμ Ã÷: ÎT
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
TIM_IC_InitTypeDef sConfigIC;
if ( strCapture .ucStartFlag == 0 )
{
__HAL_TIM_SET_COUNTER(htim,0); //清除定时器计数
strCapture .usPeriod = 0;
strCapture .usCtr = 0;
// 配置输入捕获参数。主要是修改触发电平
sConfigIC.ICPolarity = GENERAL_TIM_END_ICPolarity;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, GENERAL_TIM_CHANNELx);
// 清除中断标志位
__HAL_TIM_CLEAR_IT(htim, GENERAL_TIM_IT_CCx);
// 启动输入捕获并开启中断
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);
strCapture .ucStartFlag = 1;
}
else
{
// 获取定时器计数值
strCapture .usCtr = HAL_TIM_ReadCapturedValue(&htim5,GENERAL_TIM_CHANNELx);
//配置输入捕获参数,主要是修改触发电平
sConfigIC.ICPolarity = GENERAL_TIM_STRAT_ICPolarity;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, GENERAL_TIM_CHANNELx);
// 清除中断标志位
__HAL_TIM_CLEAR_IT(htim, GENERAL_TIM_IT_CCx);
//启动输入捕获并开启中断
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);
strCapture .ucStartFlag = 0;
strCapture .ucFinishFlag = 1;
}
}
以下代码请见tim.c
void CSB_Init(void)
{
ulTmrClk = HAL_RCC_GetHCLKFreq()/GENERAL_TIM_PRESCALER;
/*启动定时器*/
HAL_TIM_Base_Start_IT(&htim5);
/*启动定时器输入捕获并开启中断*/
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);
/*复位超声波引脚*/
GPIO_ResetBits(GPIOA,GPIO_PIN_1);
GPIO_ResetBits(GPIOA,GPIO_PIN_0);
}
|
|