IWDG заведен

This commit is contained in:
Vladislav Ostapov 2025-03-31 18:39:34 +03:00
parent b9d5ff7f46
commit 6b5edc1c41
5 changed files with 100 additions and 5 deletions

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,39 @@
#ifndef RECORDER_BUFFER_H
#define RECORDER_BUFFER_H
#ifdef __cplusplus
#include <cstdint>
extern "C" {
#else
#include <stdint.h>
#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

View File

@ -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 */

View File

@ -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;
}