
Для того что бы подключить STM32L-DISCOVERY к FDD тебе понадобится 4 провода и 2 джампера.
Всё что нужно знать о Floppy Disk Drive
- Floppy Disk Drive Pinout — очень подробно;
- Interfacing A Floppy Drive — здесь расписан псевдокод операций чтения и записи;
- Duinomite plays the Imperial march — пример подключения девайса.
P.S: Время ночь, это моя первая заметка на данную тематику, особых познаний у меня нет, всё подробно расписано на тематических ресурсах, но на то что бы с этим разобраться пришлось потратить уйму времени. В планах сделать из дисковода RTTTL плеер.
С чего начать?
Если посмотреть распиновку разъема то все входы/выходы являются четными, нечетные ножки это земля (GND). На дисководе должен быть зазор, что бы правильно вставить шлейф, переверни девайс зазором вниз, верхняя левая ножка это 2.

Логические уровни 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 МГц).