Я две недели разбирался с тем, чтобы запустить Ethernet-модуль в STM32F107 с использованием микросхемы физического уровня LAN8720. Именно эта микросхема PHY установлена на отладочной плате MikroElectronica, и планировалось её использовать в боевом проекте — она маленькая, дешёвая и доступная.

Похоже на то, что я — единственный человек, запустивший lwIP-стек на STM32F107 с микросхемой PHY LAN8720 в IAR, или по крайней мере, единственный написавший об этом. Вся сложность заключалась в том, чтобы найти/написать необходимый драйвер для микросхемы PHY именно в этом МК и именно в этом компиляторе. Этот драйвер так и не нашёлся, и в итоге я написал свой.

Проблема в том, что хоть протокол MII/RMII и стандартизирован, но адреса управляющих регистров всё-таки остаются на откуп производителю микросхемы. Стек lwIP не имеет никаких средств доступа к железу, поскольку железо у всех слишком разное, поэтому HAL, т.е. драйверы, для всех микросхем PHY немного отличаются. Однако, не так много народу поднимали именно такую связку технологий, и готовых примеров нет. На сайте ST есть пример для микросхемы DP83848, которая всё же отличается от LAN7820, и он не работает сходу.

Поэтому я адаптировал этот пример к своему стеку технологий написанием своего драйвера — конечно, по мотивам драйвера из примеров, и с неоценимой помощью товарища core_dumped с easyelectronics.ru.

В итоге это увенчалось успехом. После всех мучений к полученному проекту установить FreeRTOS оказалось делом двух минут :)

Состав проекта

В архиве проекта лежат:

  • стек lwIP версии 1.3.1 (довольно старый. нужно перейти на 1.4.1)
  • библиотеки CMSIS и SPL от ARM и ST
  • драйвер PHY для STM32F107/LAN8720
  • операционка FreeRTOS версии 8.0.0 (свежайшая)
  • файл проекта для IAR.

Весь код от ST основательно проверен и вычищен, компилируется без ошибок. Проект переведён на рельсы FreeRTOS, что, кстати, сильно его упростило.

Включен HTTP-сервер и Telnet-сервер. IP — 192.168.1.59, шлюз — 192.168.1.1.

Скачать архив проекта