условно работающий первый канал, не вычисляется только duration

This commit is contained in:
Vladislav Ostapov 2025-04-01 14:42:19 +03:00
parent b577be4b82
commit 40fca38a75
5 changed files with 78 additions and 16 deletions

View File

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

View File

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

View File

@ -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_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();
}
HAL_Delay(500);
}
/* USER CODE END 3 */
}

View File

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

View File

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