From 6b5edc1c41387b1a851d0ff25eda2a5e749c7f2f Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Mon, 31 Mar 2025 18:39:34 +0300 Subject: [PATCH] =?UTF-8?q?IWDG=20=D0=B7=D0=B0=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 4 ++-- CMakeLists_template.txt | 4 ++-- Core/Inc/recorder_buffer.h | 39 ++++++++++++++++++++++++++++++++++++ Core/Src/main.c | 24 +++++++++++++++++++++- Core/Src/recorder_buffer.cpp | 34 +++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 Core/Inc/recorder_buffer.h create mode 100644 Core/Src/recorder_buffer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index dd663d4..5719989 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,8 +15,8 @@ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # project settings project(f411-pulse-recorder C CXX ASM) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_C_STANDARD 17) #Uncomment for hardware floating point #add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING) diff --git a/CMakeLists_template.txt b/CMakeLists_template.txt index 3b7fc44..a8b58fc 100644 --- a/CMakeLists_template.txt +++ b/CMakeLists_template.txt @@ -14,8 +14,8 @@ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # project settings project(${projectName} C CXX ASM) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_C_STANDARD 17) #Uncomment for hardware floating point #add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING) diff --git a/Core/Inc/recorder_buffer.h b/Core/Inc/recorder_buffer.h new file mode 100644 index 0000000..ef198bd --- /dev/null +++ b/Core/Inc/recorder_buffer.h @@ -0,0 +1,39 @@ +#ifndef RECORDER_BUFFER_H +#define RECORDER_BUFFER_H + +#ifdef __cplusplus +#include +extern "C" { +#else +#include +#endif + +// размер буфера, должен быть 2^x +#define CHANNEL_BUFFER_SIZE 1024 +#define CHANNEL_BUFFER_SIZE_MASK (CHANNEL_BUFFER_SIZE - 1) + +typedef struct { + uint64_t timepoint; + uint32_t duration; +} BufferItem; + +// Структура кольцевого буфера +typedef struct { + volatile uint32_t head; + volatile uint32_t tail; + volatile uint32_t overruns; + BufferItem 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); + +extern ChannelBuffer_t buffer_ch1; +extern ChannelBuffer_t buffer_ch2; + +#ifdef __cplusplus +} +#endif + +#endif //RECORDER_BUFFER_H diff --git a/Core/Src/main.c b/Core/Src/main.c index 9c69fb3..c86bbc8 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -22,7 +22,9 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include "recorder_buffer.h" +#include "usbd_cdc.h" +#include "usbd_cdc_if.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -105,7 +107,27 @@ int main(void) MX_TIM11_Init(); MX_IWDG_Init(); /* USER CODE BEGIN 2 */ + char isIwdgReset = 0; + if (RCC->CSR & RCC_CSR_IWDGRSTF) { + SET_BIT(RCC->CSR, RCC_CSR_RMVF); + isIwdgReset = 1; + } + HAL_IWDG_Refresh(&hiwdg); + ChannelBuffer_reset(&buffer_ch1); + ChannelBuffer_reset(&buffer_ch2); + + { + HAL_Delay(1000); + if (isIwdgReset) { + char msg[] = "RESET_IWDG\r\nINIT_COMPLETE\r\n"; + CDC_Transmit_FS(msg, 27); + } else { + char msg[] = "INIT_COMPLETE\r\n"; + CDC_Transmit_FS(msg, 15); + } + } + HAL_IWDG_Refresh(&hiwdg); /* USER CODE END 2 */ /* Infinite loop */ diff --git a/Core/Src/recorder_buffer.cpp b/Core/Src/recorder_buffer.cpp new file mode 100644 index 0000000..ccb8190 --- /dev/null +++ b/Core/Src/recorder_buffer.cpp @@ -0,0 +1,34 @@ +#include "recorder_buffer.h" + +ChannelBuffer_t buffer_ch1; +ChannelBuffer_t buffer_ch2; + +// Функция инициализации буфера +void ChannelBuffer_reset(ChannelBuffer_t *buffer) { + buffer->head = 0; + buffer->tail = 0; + buffer->overruns = 0; +} + +// Функция добавления элемента в буфер +void ChannelBuffer_push(ChannelBuffer_t *buffer, BufferItem item) { + // Проверка на переполнение буфера + if (((buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK) == buffer->head) { + buffer->overruns = buffer->overruns + 1; + } + + buffer->buffer[buffer->tail] = item; + buffer->tail = (buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK; +} + +// Функция извлечения элемента из буфера +int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem* dest) { + const uint32_t h = buffer->head; + if (h == buffer->tail) { + return 0; + } + + *dest = buffer->buffer[h]; + buffer->head = (h + 1) & CHANNEL_BUFFER_SIZE_MASK; + return 1; +}