STM32L-DISCOVERY + FDD

DIY
Для того что бы подключить STM32L-DISCOVERY к FDD тебе понадобится 4 провода и 2 джампера.


Всё что нужно знать о Floppy Disk Drive



P.S: Время ночь, это моя первая заметка на данную тематику, особых познаний у меня нет, всё подробно расписано на тематических ресурсах, но на то что бы с этим разобраться пришлось потратить уйму времени. В планах сделать из дисковода RTTTL плеер.

С чего начать?


Если посмотреть распиновку разъема то все входы/выходы являются четными, нечетные ножки это земля (GND). На дисководе должен быть зазор, что бы правильно вставить шлейф, переверни девайс зазором вниз, верхняя левая ножка это 2.


Поставь джампер на 12-11 ножки («Drive Sel B» с GND) загорится светодиод на передней панели дисковода, далее джампер на 16-15 («Motor Enable B» с GND) диск начнет крутится.

Логические уровни TTL

In anycase the floppy interface used 5v TTL as the electrical interface, which would also comply with LVTTL switching levels.
На выходах отладочной платы логическая единица это 3.3в, а FDD интерфейс использует 5в, это означает, что подключать FDD нужно к «5v tolerant» пинам. Что бы их найти, достаточно открыть даташит контроллера STM32L152RBT6, который установлен на STM32L-DISCOVERY и посмотреть таблицу с названием "...pin definitions". Если в колонке «I/O structure» стоит «FT» (five-volt tolerant) значит на пин можно смело подавать 5в.

Из подробного мануала нам известны логические уровни TTL
An Input high voltage of 2.0 volts and and input low voltage of 0.8 volts.
An Output high voltage of 2.4 volts and and input low voltage of 0.5 volts.
это означает что 3.3в нам хватит с головой для подачи логической единицы.

В идеале, для согласования логических уровней у устройств должна быть общая земля, поэтому запитаем отладочную плату прямо от дисковода.
На дисководе есть стандартный разъем питания.

Припаиваем два проводка к плате дисковода (на 1 и 2 пин) и втыкаем в EXT_5V и GND на STM32L-DISCOVERY.

Как управлять FDD?


Для управления шаговым двигателем дисковода используется два пина, 18 DIR «Direction» и 20 STEP «Step».
Сначала нужно задать направление движения подав LOW (0) или HIGH (1) на DIR, а после этого сдвинуть головку на один трек:
Step=LOW
Delay(1mS)
Step=HIGH

Пишем тестовую прошивку


Исходный код
#include "stm32l1xx.h"
#include "stm32l1xx_rcc.h"

#define DIR GPIO_Pin_1 // 18 // PA1
#define STEP GPIO_Pin_2 // 20 // PA2

void delay_ms(uint32_t delay)
{
     TIM6->PSC = 2096; 
     TIM6->ARR = delay;  
     TIM6->EGR |= TIM_EGR_UG; 
     TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM; 
     while ( (TIM6->CR1 & TIM_CR1_CEN) != 0);
}

void InitPeriph()
{
 GPIO_InitTypeDef GPIOConfig;
 
 GPIOConfig.GPIO_Speed = GPIO_Speed_40MHz;
 GPIOConfig.GPIO_Mode = GPIO_Mode_OUT;
 GPIOConfig.GPIO_OType = GPIO_OType_PP;
 GPIOConfig.GPIO_PuPd = GPIO_PuPd_NOPULL;
 GPIOConfig.GPIO_Pin = DIR | STEP;
 
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
 GPIO_Init(GPIOA,&GPIOConfig);
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
 
}

void move()
{
 GPIO_ResetBits(GPIOA,STEP);
 delay_ms(1);
 GPIO_SetBits(GPIOA,STEP);
}

int main()
{
 int i;
 InitPeriph();
 for(;;) 
 {
   GPIO_ResetBits(GPIOA,DIR);
   for(i=0;i<100;i++)
   {
    move();
   }
   delay_ms(1000);
   GPIO_SetBits(GPIOA,DIR);
   for(i=0;i<100;i++)
   {
    move();
   }
   delay_ms(2500);
 }
}

Настраиваем порты GPIO на вывод обычного логического сигнала, включаем тактирование порта вывода и 6 таймера общего назначения. Шины к которым они подключены можно посмотреть в даташите. Далее в бесконечном цикле крутим шаговый двигатель на 100 треков, то назад то вперед.
Магическая цифра 2096 это стандартная внутренняя частота работы данного контроллера (2,097 МГц).
Tags:ARMSTM32FDDTTL
Hubs: DIY
+16
28.2k 143
Comments 10

Popular right now

Node.js: серверный JavaScript
March 1, 202127,000 ₽Loftschool
Профессия iOS-разработчик
March 1, 202190,000 ₽SkillFactory
Основы HTML и CSS
March 1, 2021FreeНетология
Курс по аналитике данных
March 1, 202164,200 ₽SkillFactory

Top of the last 24 hours