From 40fca38a75f1b71180f2015c86af73797c83a949 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Tue, 1 Apr 2025 14:42:19 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=BA=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB,=20=D0=BD=D0=B5=20=D0=B2=D1=8B=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20duration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/main.h | 3 ++- Core/Inc/recorder_buffer.h | 10 +++---- Core/Src/main.c | 52 +++++++++++++++++++++++++++++++----- Core/Src/recorder_buffer.cpp | 7 ++--- Core/Src/stm32f4xx_it.c | 22 ++++++++++++++- 5 files changed, 78 insertions(+), 16 deletions(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 7f2eba5..0e23c2e 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -61,7 +61,8 @@ void Error_Handler(void); #define LED_GPIO_Port GPIOC /* USER CODE BEGIN Private defines */ - +#define LED_On() LED_GPIO_Port->BSRR = (LED_Pin << 16) +#define LED_Off() LED_GPIO_Port->BSRR = (LED_Pin) /* USER CODE END Private defines */ #ifdef __cplusplus diff --git a/Core/Inc/recorder_buffer.h b/Core/Inc/recorder_buffer.h index ef198bd..c0bebd4 100644 --- a/Core/Inc/recorder_buffer.h +++ b/Core/Inc/recorder_buffer.h @@ -9,25 +9,25 @@ extern "C" { #endif // размер буфера, должен быть 2^x -#define CHANNEL_BUFFER_SIZE 1024 +#define CHANNEL_BUFFER_SIZE 2048 #define CHANNEL_BUFFER_SIZE_MASK (CHANNEL_BUFFER_SIZE - 1) typedef struct { uint64_t timepoint; uint32_t duration; -} BufferItem; +} BufferItem_t; // Структура кольцевого буфера typedef struct { volatile uint32_t head; volatile uint32_t tail; volatile uint32_t overruns; - BufferItem buffer[CHANNEL_BUFFER_SIZE]; + BufferItem_t buffer[CHANNEL_BUFFER_SIZE]; } ChannelBuffer_t; void ChannelBuffer_reset(ChannelBuffer_t *buffer); -void ChannelBuffer_push(ChannelBuffer_t *buffer, BufferItem item); -int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem* dest); +void ChannelBuffer_push(ChannelBuffer_t *buffer, const BufferItem_t* item); +int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem_t* dest); extern ChannelBuffer_t buffer_ch1; extern ChannelBuffer_t buffer_ch2; diff --git a/Core/Src/main.c b/Core/Src/main.c index 6e5dc8a..1234cd6 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -119,6 +119,7 @@ int main(void) { HAL_Delay(1000); + LED_On(); if (isIwdgReset) { char msg[] = "RESET_IWDG\r\nINIT_COMPLETE\r\n"; CDC_Transmit_FS(msg, 27); @@ -126,6 +127,7 @@ int main(void) char msg[] = "INIT_COMPLETE\r\n"; CDC_Transmit_FS(msg, 15); } + LED_Off(); } HAL_IWDG_Refresh(&hiwdg); /* USER CODE END 2 */ @@ -136,13 +138,51 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - LED_GPIO_Port->ODR |= LED_Pin; + HAL_TIM_Base_Start(&htim2); + 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); while (1) { - for (int i = 0; i < 7; i++) { - HAL_Delay(100); - LED_GPIO_Port->ODR ^= LED_Pin; - } - HAL_Delay(500); + HAL_IWDG_Refresh(&hiwdg); + // for (int i = 0; i < 7; i++) { + // HAL_Delay(100); + // LED_GPIO_Port->ODR ^= LED_Pin; + // } + // HAL_Delay(500); + BufferItem_t bi; + if (ChannelBuffer_pop(&buffer_ch1, &bi)) { + char tmp[64]; + LED_On(); + CDC_Transmit_FS(tmp, sprintf(tmp, "D1;0x%llX,0x%lX\r\n", bi.timepoint, bi.duration)); + LED_Off(); + } + + if (buffer_ch1.overruns) { + uint32_t overs = buffer_ch1.overruns; + buffer_ch1.overruns = 0; + + char tmp[64]; + LED_On(); + CDC_Transmit_FS(tmp, sprintf(tmp, "D1OVR;0x%lX\r\n", overs)); + LED_Off(); + } + + if (ChannelBuffer_pop(&buffer_ch2, &bi)) { + char tmp[64]; + LED_On(); + CDC_Transmit_FS(tmp, sprintf(tmp, "D2;0x%llX,0x%lX\r\n", bi.timepoint, bi.duration)); + LED_Off(); + } + + if (buffer_ch2.overruns) { + uint32_t overs = buffer_ch2.overruns; + buffer_ch2.overruns = 0; + + char tmp[64]; + LED_On(); + CDC_Transmit_FS(tmp, sprintf(tmp, "D2OVR;0x%lX\r\n", overs)); + LED_Off(); + } } /* USER CODE END 3 */ } diff --git a/Core/Src/recorder_buffer.cpp b/Core/Src/recorder_buffer.cpp index ccb8190..6505c55 100644 --- a/Core/Src/recorder_buffer.cpp +++ b/Core/Src/recorder_buffer.cpp @@ -11,18 +11,19 @@ void ChannelBuffer_reset(ChannelBuffer_t *buffer) { } // Функция добавления элемента в буфер -void ChannelBuffer_push(ChannelBuffer_t *buffer, BufferItem item) { +void ChannelBuffer_push(ChannelBuffer_t *buffer, const BufferItem_t* item) { + if (!item) { return; } // Проверка на переполнение буфера if (((buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK) == buffer->head) { buffer->overruns = buffer->overruns + 1; } - buffer->buffer[buffer->tail] = item; + buffer->buffer[buffer->tail] = *item; buffer->tail = (buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK; } // Функция извлечения элемента из буфера -int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem* dest) { +int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem_t* dest) { const uint32_t h = buffer->head; if (h == buffer->tail) { return 0; diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 3be627c..727aa8b 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -22,6 +22,7 @@ #include "stm32f4xx_it.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include "recorder_buffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -252,9 +253,28 @@ void TIM1_TRG_COM_TIM11_IRQHandler(void) void TIM2_IRQHandler(void) { /* USER CODE BEGIN TIM2_IRQn 0 */ + static uint32_t overflows = 0; + const uint16_t sr = TIM2->SR; + TIM2->SR = 0; + + if (sr & TIM_SR_UIF) { + overflows++; + } + if (sr & (TIM_SR_CC1OF | TIM_SR_CC2OF)) { + // overrun, skip processing + buffer_ch1.overruns = buffer_ch1.overruns + 1; + } else if (sr & TIM_SR_CC2IF) { + BufferItem_t b; + b.duration = TIM2->CCR1; + b.timepoint = 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 */ - HAL_TIM_IRQHandler(&htim2); + //HAL_TIM_IRQHandler(&htim2); /* USER CODE BEGIN TIM2_IRQn 1 */ /* USER CODE END TIM2_IRQn 1 */