Re: STM32, Atolic TrueStudio, CubeMX
taburyak вітаю
по-перше найцікавіша частина ініціалізації таймера залишилась поза зором - функцію HAL_TIM_IC_MspInit() в студію
а переривань не відбувається, бо мабуть в налаштуваннях NVIC не включене (розмасковане) перерирвання TIM2 Global Interrupt.
UPD: або проблема в тому що тригер налаштований на falling
sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
і по ньому з одного боку скидається таймер, а по-друге виконується захват сигналу (який в цей момент нуль). Результат захвату треба забирати не з регістру CNT а регістру каналу, відповідно CCR1.
по-друге можу підказати як міряти простіше: можна налаштувати два канали на одну ніжку (наприклад channel 1 в режимі direct mode з трігером по rising, channel 2 - indirect mode з трігером по falling). тоді обробник переривання буде наступного вигляду:
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
uint32_t pulse;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
static uint32_t rising;
if (htim->Instance == TIM2) {
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
rising = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
} else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
pulse = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2) - rising;
}
}
}
трігер тоді взагалі не потрібен, а якщо зробити період таймеру максимальним (2^32-1) то тоді і переповнення буде автоматично працювати через unsigned математику.
або залишити так само два канали direct + indirect з різнимим тригерами. і по TI1 ресетити таймер як у вас, а по TI2 робити семпл:
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
uint32_t pulse;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) {
} else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
pulse = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
}
}
}