IWDG заведен
This commit is contained in:
parent
b9d5ff7f46
commit
6b5edc1c41
@ -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)
|
||||
|
@ -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)
|
||||
|
39
Core/Inc/recorder_buffer.h
Normal file
39
Core/Inc/recorder_buffer.h
Normal 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
|
@ -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 */
|
||||
|
34
Core/Src/recorder_buffer.cpp
Normal file
34
Core/Src/recorder_buffer.cpp
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user