Улушения:

- логики дма (только по полному заполнению)
- фильтров
- расчетов действующих значений
- параметров (сатурация, сделан параметр время нарастания пуска Tnt, добавлен параметр скважность пачки импульсов)
This commit is contained in:
2025-11-28 18:25:05 +03:00
parent 5624468d09
commit 854ea6f6c2
29 changed files with 419 additions and 215 deletions

View File

@@ -95,16 +95,76 @@ void DMA_Sim_Transfer(DMA_TypeDef* DMAx, uint32_t stream)
stream_sim->current_index++;
// Проверяем завершение передачи
// Определяем какой регистр использовать (LISR или HISR) в зависимости от потока
volatile uint32_t* lisr_reg = NULL;
volatile uint32_t* hisr_reg = NULL;
uint32_t tcif_mask = 0;
uint32_t htif_mask = 0;
// Настраиваем маски флагов в зависимости от потока
if (DMAx == DMA1) {
lisr_reg = &DMA1->LISR;
hisr_reg = &DMA1->HISR;
}
#ifdef DMA2
else if (DMAx == DMA2) {
lisr_reg = &DMA2->LISR;
hisr_reg = &DMA2->HISR;
}
#endif
// Устанавливаем маски для конкретного потока
switch (stream) {
case 0:
case 4:
tcif_mask = DMA_FLAG_TCIF0_4; htif_mask = DMA_FLAG_HTIF0_4; break;
case 1:
case 5:
tcif_mask = DMA_FLAG_TCIF1_5; htif_mask = DMA_FLAG_HTIF1_5; break;
case 2:
case 6:
tcif_mask = DMA_FLAG_TCIF2_6; htif_mask = DMA_FLAG_HTIF2_6; break;
case 3:
case 7:
tcif_mask = DMA_FLAG_TCIF3_7; htif_mask = DMA_FLAG_HTIF3_7; break;
};
// Проверяем и выставляем флаги
if (stream_sim->current_index == stream_sim->buffer_size / 2) {
// Половинное заполнение - выставляем флаг HTIF
if (stream < 4) {
*lisr_reg |= htif_mask; // Потоки 0-3 в LISR
}
else {
*hisr_reg |= htif_mask; // Потоки 4-7 в HISR
}
// Вызываем обработчик прерывания
//DMA_Call_IRQHandller(DMAx, stream); //todo
}
if (stream_sim->current_index >= stream_sim->buffer_size) {
// Полное заполнение - выставляем флаг TCIF
if (stream < 4) {
*lisr_reg |= tcif_mask; // Потоки 0-3 в LISR
}
else {
*hisr_reg |= tcif_mask; // Потоки 4-7 в HISR
}
stream_sim->transfer_complete = 1;
if (stream_sim->circular_mode) {
stream_sim->current_index = 0;
} else {
// В циклическом режиме не сбрасываем флаги - они должны быть сброшены программно
}
else {
stream_sim->transfer_enabled = 0;
stream_sim->enabled = 0;
DMA_Call_IRQHandller(DMAx, stream);
}
// Вызываем обработчик прерывания
DMA_Call_IRQHandller(DMAx, stream);
}
}