Важная информация
RSS лента

gordiole

Разработка копировщика флоппи дисков (Floppy Deuce). Часть 9

Рейтинг: 5.00. Голосов: 2.

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 на картинке



Теперь займусь интерфейсом для управления флоппи приводом.

Обновлено 05.09.2017 в 14:25 gordiole

Метки: Нет Добавить / редактировать метки
Категории
Без категории

Комментарии

  1. Аватар для newart
    Nucleo совместимо с Discovery?
  2. Аватар для gordiole
    Цитата Сообщение от newart
    Nucleo совместимо с Discovery?
    Формат Discovery по шине входов/выходов не совместим с Nucleo, даже если микроконтроллеры одинаковые.
    Проект Floppy Deuce будет открытым и при желании можно будет адаптировать под любые микроконтроллеры STM32, но с некоторыми ограничениями:
    • микроконтроллер должен работать на частоте 100 МГц или выше
    • оперативной памяти 128 кБайт или больше
    • USB порт на Full скорости
  3. Аватар для newart
    А под какую IDE сорцы?
  4. Аватар для newart
    Проект очень нужный!

    Не забрасывайте.
  5. Аватар для gordiole
    Цитата Сообщение от newart
    А под какую IDE сорцы?
    Приложение для Windows пишется в Visual Studio 2012 на С++ MFC
    Среда для микроконтроллера STM32 IAR Embedded Workbench 7.5
    Конфигурация микроконтроллера STM32CubeMX. Используя Cube, можно будет адаптировать
    и под другие микроконтроллеры STM32, но только с ограничениями которые описал выше.
    В ближайшее время я буду размещать текущие результате работы на github.com, но
    пока для меня github это танцы с бубнами (в процессе изучения).

Трекбэков