Разработка копировщика флоппи дисков (Floppy Deuce). Часть 9
EWARM. Тестирование системы захвата дорожки флоппи диска.
Для эмуляции флоппи диска я использовал сигналы симуляции INDEX и READ_DATA. Без применения флоппи привода удалось протестировать всю систему захвата данных дорожки, размещения данных дорожки в FIFO буфере и передаче данных дорожки по каналу USB в PC. Тестирование захвата данных дорожки показало, что код C сгенерированный STM32CubeMX для обслуживания прерываний не эффективный (обработчик HAL_TIM_IRQHandler(&htim2) очень медленный). Как обычно за универсализм приходится расплачиваться быстродействием. Поэтому пришлось написать собственный обработчик прерываний от таймера TIM2 и работать с его регистрами напрямую. Это позволило работать с прерываниями на частоте 500 кГц, которые возникают от сигнала READ_DATA.
Вот так выглядит код обработчика прерываний:
Код:void TIM2_IRQHandler(void) { /* USER CODE BEGIN TIM2_IRQn 0 */ /* прерывание от канала 1 ? */ if (TIM2->SR & TIM_SR_CC1IF) { /* сбрасываем флаг прерывания от канала 1 */ TIM2->SR &= ~TIM_SR_CC1IF; /* это первое прерывание от INDEX ? */ if (IndexSemaphor == 0) { /* устанавливаем семафор захвата сигнала Index */ IndexSemaphor = 1; } else { if (ReadSemaphor == 0) { /* резрешаем захват дорожки */ ReadSemaphor = 1; /* инициализируем значение захвата READ_DATA */ ReadTicks = 0; /* сбрасываем флаги повторного захвата */ TIM2->SR &= (TIM_SR_CC1OF | TIM_SR_CC2OF); /* разрешаем работу канала 2 таймера 2 по прерываниям */ HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); } else { /* запрещаем работу канала 1 таймера 2 по прерываниям */ HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_1); /* запрещаем работу канала 2 таймера 2 по прерываниям */ HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_2); /* устаналиваем признак конца дорожки в FIFO дорожки */ Track[Track_Head] = 0; Track_Head++; Track[Track_Head] = 0; Track_Head++; /* сохраняем длительность сигнала INDEX в тиках */ IndexTicks = TIM2->CCR1; } } } /* прерывание от канал 2 ? */ if (TIM2->SR & TIM_SR_CC2IF) { /* сбрасываем флаг прерывания от канала 2 */ TIM2->SR &= ~TIM_SR_CC2IF; /* считываем захваченные данные */ uint32_t temp = TIM2->CCR2; /* сохраняем значение периода READ_DATA в FIFO дорожки */ Track[Track_Head] = temp - ReadTicks; Track_Head++; Track[Track_Head] = (temp - ReadTicks) >> 8; Track_Head++; /* индекс больше размера FIFO дорожки ? */ if (Track_Head >= Track_Len) { /* инициализируем индекс в FIFO дорожки */ Track_Head = 0; } /* запоминаем текущее значение захваченных данных */ ReadTicks = temp; TrackCount += 2; } /* выходим из прерывания игнорируя обработчик прерываний STM32Cube */ return; /* USER CODE END TIM2_IRQn 0 */ HAL_TIM_IRQHandler(&htim2); /* USER CODE BEGIN TIM2_IRQn 1 */ /* USER CODE END TIM2_IRQn 1 */ }
Для обработчика прерываний от таймера TIM2 системы захвата данных выделен 0 (высший) уровень приоритета, это позволило производить измерение READ_DATA без потерь, а для USB выделил 1 уровень приоритета. Пока запас прочности при увеличении частоты MFM 6%, то есть максимально 533 кГц, затем происходит потеря данных от READ_DATA. Улучшениями характеристик буду заниматься попозже, на сегодняшнем этапе хочется получить полный функционал от копировщика для обычных дискет с обычными защитами (копирование для ознакомительных целей ), а с особо хитрыми дискетами разберёмся потом (защита диска: ну типа один сектор на дорожке с наложением на INDEX).
Добавил в приложение Floppy Deuce команду чтения дорожки. Пока не сделал контроль целостности передачи данных дорожки (CRC).
Результат чтения дорожки для MFM 500 kb/s и передачи дорожки PC на картинке
Теперь займусь интерфейсом для управления флоппи приводом.
Комментарии
Трекбэков
Всего трекбэков 0
Ссылка трекбэка: