1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| TIM_HandleTypeDef htim3; volatile uint32_t pulse_width = 0; volatile uint8_t capture_done = 0;
void MX_TIM3_IC_Init(void) { TIM_IC_InitTypeDef sConfigIC = {0}; __HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3; htim3.Init.Prescaler = 71; htim3.Init.Period = 65535; HAL_TIM_IC_Init(&htim3);
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1);
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1); HAL_NVIC_EnableIRQ(TIM3_IRQn);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); }
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance != TIM3) return;
static uint32_t last_capture = 0;
if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin)) { uint32_t now = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1); pulse_width = (now > last_capture) ? (now - last_capture) : (65535 - last_capture + now); capture_done = 1; } else { __HAL_TIM_SET_COUNTER(&htim3, 0); last_capture = 0; } }
float distance_cm = pulse_width / 58.0f;
|