Улушения:
- логики дма (только по полному заполнению) - фильтров - расчетов действующих значений - параметров (сатурация, сделан параметр время нарастания пуска Tnt, добавлен параметр скважность пачки импульсов)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user