diff --git a/Core/Src/main.c b/Core/Src/main.c index 0e5da33..5c1f496 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -142,6 +142,11 @@ int main(void) HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_2); htim2.Instance->DIER = (TIM_DIER_UIE | TIM_DIER_CC2IE); + + HAL_TIM_Base_Start(&htim5); + HAL_TIM_IC_Start(&htim5, TIM_CHANNEL_1); + HAL_TIM_IC_Start(&htim5, TIM_CHANNEL_2); + htim5.Instance->DIER = (TIM_DIER_UIE | TIM_DIER_CC2IE); while (1) { HAL_IWDG_Refresh(&hiwdg); // for (int i = 0; i < 7; i++) { diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index e0a4389..803f29c 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -255,7 +255,7 @@ void TIM2_IRQHandler(void) /* USER CODE BEGIN TIM2_IRQn 0 */ static uint32_t overflows = 0; const uint16_t sr = TIM2->SR; - TIM2->SR = 0; + TIM2->SR = TIM_SR_CC1OF | TIM_SR_CC2OF | TIM_SR_CC1IF | TIM_SR_CC2IF; // все флаги кроме флагов нужных мне каналов if (sr & TIM_SR_UIF) { overflows++; @@ -263,16 +263,15 @@ void TIM2_IRQHandler(void) if (sr & (TIM_SR_CC1OF | TIM_SR_CC2OF)) { // overrun, skip processing buffer_ch1.overruns = buffer_ch1.overruns + 1; + TIM2->SR = 0; } else if (sr & TIM_SR_CC2IF) { BufferItem_t b; - b.duration = TIM2->CCR1; - b.timepoint = TIM2->CCR2; + b.timepoint = TIM2->CCR1; + b.duration = TIM2->CCR2; b.duration = b.duration - b.timepoint; b.timepoint |= (uint64_t)(overflows) << 32; ChannelBuffer_push(&buffer_ch1, &b); } - - /* USER CODE END TIM2_IRQn 0 */ /* USER CODE BEGIN TIM2_IRQn 1 */ @@ -285,7 +284,25 @@ void TIM2_IRQHandler(void) void TIM5_IRQHandler(void) { /* USER CODE BEGIN TIM5_IRQn 0 */ + static uint32_t overflows = 0; + const uint16_t sr = TIM5->SR; + TIM5->SR = TIM_SR_CC1OF | TIM_SR_CC2OF | TIM_SR_CC1IF | TIM_SR_CC2IF; // все флаги кроме флагов нужных мне каналов + if (sr & TIM_SR_UIF) { + overflows++; + } + if (sr & (TIM_SR_CC1OF | TIM_SR_CC2OF)) { + // overrun, skip processing + buffer_ch2.overruns = buffer_ch2.overruns + 1; + TIM5->SR = 0; + } else if (sr & TIM_SR_CC2IF) { + BufferItem_t b; + b.timepoint = TIM5->CCR1; + b.duration = TIM5->CCR2; + b.duration = b.duration - b.timepoint; + b.timepoint |= (uint64_t)(overflows) << 32; + ChannelBuffer_push(&buffer_ch2, &b); + } /* USER CODE END TIM5_IRQn 0 */ /* USER CODE BEGIN TIM5_IRQn 1 */