Знакомимся с Ethernet микроконтроллером W7500p
11 Сентябрь, 2020
В данной статье мы познакомимся с Ethernet-микроконтроллером W7500P от компании WIZnet и его особенностями на примере отладочной платы Wizwiki W7500P, создадим проект в Keil μvision, напишем программу для управления портами ввода-вывода и узнаем, какими способами можно производить отладку и загрузку ПО в микроконтроллер.
1. Создание проекта в Keil μvision.
Ethernet на сегодняшний день является одним из ключевых интерфейсов, используемых во встраиваемом оборудовании, системах контроля и промышленной автоматике. Он удобен тем, что все устройства можно объединить в локальную сеть, контролируя их работу с ПК или при помощи микроконтроллера. Чаще всего, в проектах используются Ethernet-мосты, которые заметно упрощают обмен данными между различными устройствами. Но при этом мосты всегда имели ограниченный набор функций и интерфейсов, с которыми они работали. Поэтому при проектировании устройства мост обычно объединяют с внешним управляющим микроконтроллером, что далеко не всегда удобно. Компания WIZnet решила эти проблемы очень просто: она объединила на одном кристалле: - популярное микроконтроллерное ядро ARM Cortex -M0 с тактовой частотой до 48 МГц. Таким образом, мы получаем законченную комбинацию из отлично реализованного аппаратного Ethernet и полноценного функционального контроллера. Микросхема поддерживает возможность отладки и загрузки кода при помощи встроенного SWD-отладчика, выпускаются в стандартном корпусе TQFP64 с размерами 7х7 мм. Дополнительно на кристалле имеется: - два SPI интерфейса Благодаря этой микросхеме, у разработчиков появляется возможность объединить хорошо известные и популярные мосты от WIZnet (W5100, W5100s, W5200, W5300, W5500, W3150+) и модули на их основе вместе с современным микроконтроллерным ядром по заметно меньшей цене.
Говоря о конкурентных решениях, нужно отметить, что на микроконтроллерах STM32 имеется возможность использовать программно-реализованный TCP/IP, но исключительно на ядрах выше Cortex -M4, что сильно сказывается на конечной стоимости проекта. Программная реализация такого сложного интерфейса может вызвать трудности в разработке и отладке. К тому же, освоение Ethernet на STM32 сильно осложняется тем, из-за программной реализации блока требуется много времени, чтобы в деталях разобраться с функциями и возможностями библиотек. Компания Microchip также выпускает два известных микроконтроллера: ATSAME54(Cortex -M4F) ATSAME70 (Cortex -M7), имеющих аппаратный МАС и возможность работы с аппаратными TCP/IP, UDP. Но у этих микросхем отсутствует интегрированный PHY (необходимо использовать внешнюю микросхему), они гораздо дороже, чем W7500p и сложнее в освоении. Также, Microchip производят 8-разрядный микроконтроллеры семейства PIC18F..J с аппаратным блоком Ethernet, но он уступает W7500x по многим параметрам. Ниже приведена сравнительная таблица W7500x и PIC18F87J60-I/PT.
Среди мостов, производимых конкурентами, можно выделить популярный EN28J60 от компании Microchip, имеющий аппаратную реализацию MAC, PHY, интерфейс SPI (с максимальной скоростью передачи до 20МГц) и 2 сокета с объемом памяти буфера 8кб. Но, находясь в одинаковой ценовой категории с W7500р, этот кристалл заметно уступает по своему функционалу решению от WIZnet.
Контроллер W7500p удобен тем, что весь Ethernet-блок реализован аппаратно, поэтому все низкоуровневые процессы контролируются самим чипом, что сильно упрощает освоение микроконтроллера и разработку ПО, сокращая время, затрачиваемое разработчиком на решение типовых низкоуровневых задач, позволяя уделить больше внимания непосредственно разработке.
Рис. 1. Отладочная плата WIZwiki 7500p
При первом взгляде на отладочную плату (рис. 1) становится ясно, что контроллер изначально создавался для работы в Mbed. Mbed - среда разработки, включающая одноимённую операционную систему, предназначенная для работы с отладочными платами в режиме онлайн. Но нашей задачей будет создание проекта и написание программного кода в более привычной многим среде Keil μvision, чтобы продемонстрировать гибкость и вариативность работы с микроконтроллером. Для удобства работы со своим контроллером компания WIZnet подготовила стандартную библиотеку для периферии, функции которой помогают разработчику сразу же начать использовать весь потенциал аппаратно реализованных интерфейсов и периферии. В данной статье мы увидим, насколько удобен, функционален и прост в использовании микроконтроллер «под началом» этой библиотеки. Отметим, что в библиотеке находится множество примеров и готовых проектов от производителя. Можно как создать проект в Keil с нуля, так и использовать уже готовый проект, которому посвящена данная статья, или же использовать проекты от производителя, находящиеся в архиве с библиотекой. Создание проекта в Keil μvision Создаем в удобном нам месте папку, в которой будет храниться сам проект. Назовем, к примеру, “W7500p test” и сразу же создадим вспомогательные папки, как показано на рис. 2, в которые будут размещены все файлы проекта. Рис. 2. Папки в директории проекта
Запускаем Keil μVision, переходим во вкладку project, Выбираем строку New μVision Project, как показано на рис. 3. Рис. 3. Создание нового проекта в Keil μVision
Выбираем созданную нами папку проекта, даём ему имя. Рис. 4. Выбор директории нового проекта
Как показано на рис. 5, в появившемся окне выбираем ARM -> ARM Cortex M0 -> ARMCM0 Рис. 5. Выбор устройства
Далее появляется окно выбора компонентов, не выбираем ничего, нажимаем «ок». Открывается окно проекта. Сразу же создадим в нем группы, аналогичные папкам, которые мы создавали ранее. Жмём правой кнопкой мыши на Target group 1 -> Add Group.
Рис. 6. Добавление групп в проект
Добавим в группу User файл main.c (см. рис. 7), для этого правой кнопкой мыши жмем на группу и во всплывающем окне выбираем Add New Item To Group ‘User’. Формат C File (.c) Рис. 7. Создание файла main.c в группе проекта
Теперь нам необходимо перенести файлы из скачанной библиотеки в директорию проекта. Из C:\Users\... \W7500x_Library_Examples\Libraries\CMSIS\Device\WIZnet\W7500\Source\ARM файл “startup_W7500x.s” переносим в папку проекта: C:\Users\...\W7500p test\MDK-ARM. В эту же папку переносим все файлы, находящиеся в папке C:\Users\...\W7500x_Library_Examples\Libraries\CMSIS\Include
Из C:\Users\...\W7500x_Library_Examples\Libraries\CMSIS\Device\WIZnet\W7500\Include переносим файлы “system_W7500x.h” , “system_W7500x.c”и “W7500x.h” в папку C:\Users\...\W7500p test\CMSIS
А так же переносим нужные библиотечные файлы из папок C:\Users\... \W7500x_Library_Examples\Libraries\W7500x_stdPeriph_Driver\src и C:\Users\... \W7500x_Library_Examples\Libraries\W7500x_stdPeriph_Driver\inc Далее необходимо указать в Keil пути для каждой из папок. В окне наверху выбираем «Options for target», как показано на рис. 8. Рис.8. Панель “Options for target”
В появившемся окне выбираем вкладку C/C++ (AC6). Далее напротив “include paths” жмём на иконку с правой стороны как показано на рис. 9. Рис. 9. Включение папок и файлов в проект
В появившемся окне выбираем созданные ранее папки, как это показано на рис. 10. Рис. 10. Добавление путей в директорию вспомогательных папок.
После того как пути указаны, добавляем файлы в группы. Нажимаем правой кнопкой мыши на группу, выбираем “Add existing file to Group …”. Рис. 11. Добавление файлов библиотеки в проект.
В Группе MDK-ARM должен быть файл «startup_W7500x.s» из соответствующей папки проекта.
В конечном итоге проект и его группы должны следующим образом: (см. рис. 12): Рис.12. Готовый проект.
В main.c добавляем строку #include “W7500x.h” и напишем пустую функцию int main(), чтобы проверить проект на собираемость и наличие ошибок. При правильном выполнении всех шагов, После нажатия клавиши F7 проект должен собраться без ошибок.
Проект мы создали, теперь начнем непосредственно писать сам код нашей программы. Для начала добавим библиотеку, которая отвечает за работу портов ввода-вывода. Немного о тактировании и его настройках. За инициализацию и настройки отвечает функция ‘SystemInit()’. Можно вызвать ее без изменений и тактирование на микроконтроллер будет включено, но использоваться будет внутренний (не всегда стабильный) кварцевый резонатор на 8МГц с соответствующей тактовой частотой. Но а как, к примеру, подключить внешний резонатор? В файле system_7500x.h, в разделе «Defines» убираем комментарий к строке: ”#define SYSCLK_EXTERN_OSC”. Готово! Регулировка частоты тактирования производится путем записи в регистр frequency calculating register PLL_FCR блока Clock Reset Generator (CRG). На рисунке 13 показана его структура. Рис. 13. Структура регистра расчета частоты.
Частота задаётся путем записи в биты М, N и OD, исходя из формулы: Где Fout – выходная частота, Гц; Fin – частота работы кварцевого резонатора, Гц; M и N заносятся в регистр, как обычные числа шестнадцатиричной СИ, а OD рассчитывается по формуле ниже: где OD[0] и OD[1] – нулевой и первый биты регистра. OD может принимать следующие значения: 1 (0х00), 2 (0х01), 4 (0х03) и 8 (0х04).
Для примера попробуем включить частоту тактирования 12MHz. Взглянем еще раз на формулу и увидим, что OD – отвечает за деление частоты, а сама частота задаётся отношением M/N. Чтобы было от чего отталкиваться, примем OD = 2, входная частота = 8MHz, заносим имеющиеся данные в формулу и получаем: Соблюдаем получившееся тождество и примем М = 24, N = 8. Создаем переменные для битов, сдвигаем их, чтобы биты попали в нужное место регистра и получаем следующее: SystemInit(); uint32_t M = 0x18<<16; //M = 24 uint16_t N = 0x08<<8; //N = 8 uint8_t OD = 0x01; //OD = 2
Заносим переменные в регистр:
На рис. 14 показана схема устройства блока CRG, который отвечает за настройки тактирования. Для того, чтобы настроить частоты тактирования периферии, необходимо занести в регистры, указанные на рис. 14 справа, значения делителей частоты.
Рис. 14. Блок-схема устройства тактирования микроконтроллера.
Библиотеки подключили, частоту настроили, теперь займёмся конкретно работой с GPIO.
Рис. 15. Назначение выводов отладочной платы WizWiki W7500p
Как видно на рис. 15, светодиоды находятся на выводах PC_0 (красный), PC_4 (зелёный), PC_5 (синий). Соответственно, эти выводы нам нужно настроить на выход. Добавим новый тип для инициализации: Static GPIO_InitTypeDef GPIO_InitDef;
Удобства ради, всю инициализацию портов gpio объединим в отдельную функцию: Void gpio_ini() GPIO_InitDef.GPIO_Pin = GPIO_Pin_0; GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOC, &GPIO_InitDef); PAD_AFConfig(PAD_PC,GPIO_Pin_0, PAD_AF1); } Теперь коротко об инициализации GPIO.
Как видно на рис. 19, у одного порта может быть несколько выполняемых функций (Alternative Functions). Параметр AFConfig определяет режим работы вывода. Для работы светодиодов необходим режим Normal Function. В настройках он обозначается как PAD_AF1.(PAD_AF0 и PAD_AF2 отвечают за ШИМ).
Добавим стандартную функцию задержки:
{ for(; delay != 0; delay--) __NOP(); }
За переключение состояний портов ввода-вывода отвечают функции:
Напишем несколько строк, определяющих режимы включения и выключения портов, и получим следующее:
#include "W7500x.h" Static GPIO_InitTypeDef GPIO_InitDef; // Создание нового типа для инициализации int main () { SystemInit (); // инициализация системы CRG->PLL_FCR = M|N|OD; // Запись переменных в регистр расчета частоты while (1) { delay_ms (100); //Задержка 100мс. GPIO_SetBits (GPIOC, GPIO_Pin_0); //Выкл. красный delay_ms (100); //Задержка 100мс. GPIO_SetBits (GPIOC, GPIO_Pin_4);// Выкл. зелёный delay_ms (100); // задержка 100мс. GPIO_ResetBits (GPIOC, GPIO_Pin_0); //Вкл. красный delay_ms (100);// Задержка 100мс. } void gpio_ini (void) { GPIO_SetBits (GPIOC, GPIO_Pin_0); // Выкл.
Загрузить ПО в микроконтроллер можно несколькими способами:
Рис. 16. Расположение бинарного файла в директории проекта.
Далее подключаем отладочную плату к USB порту компьютера через кабель Mini-USB.
Рис. 17. Отладочная плата при подключении к ПК.
Отладочная плата определится, как устройство со съёмным носителем «MBED», открываем и переносим наш бинарный файл в его корневую папку. 2. Используя CMSIS-DAP Debugger в Keil.
Аналогично первому варианту, подключение отладочной платы происходит через USB-порт. Для загрузки ПО и отладки платы через средства Keil μVision необходимо скачать и установить Serial-драйвер. Переходим по ссылке и выбираем «Download latest driver». Скачиваем, устанавливаем. Также необходимо загрузить flash programming algorithm. Переходим по ссылке, загружаем, распаковываем архив, переносим файл “W7500_128.FLM” в папку C:\...\Keil_v5\ARM\Flash. В Keil Переходим в меню “Options for target”, раздел “Target”, заполняем поля как показано на рис. 18.
Рис. 18. Настройки памяти.
Далее во вкладке “Linker” Ставим галочку напротив пункта “Use Memory Layout Target Dialog”.
Рис. 18.1 настройки памяти.
Во вкладке “C/C++” в графе “Define:” Пишем следующее: «CORTEX_M0 USE_STDPERIPH_DRIVER».
Рис. 19. Настройки компилятора.
Во вкладке «User», как показано на рис. 20, в разделе «After build/rebuild» ставим галочку напротив графы «Run #1:» и добавляем справа :
Рис. 20. Настройки запуска программы.
Далее нам необходимо выбрать средство отладки и загрузки. Для отладочной платы WIZwiki W7500p будем использовать CMSIS-DAP Debugger. Переходим в меню вверху во вкладку flash -> Configure flash tools -> Debug -> выбираем CMSIS-DAP Debugger, как показано на рис. 21.
Рис. 21. Настройки программатора.
Переходим во вкладку “Utilities” -> выбираем CMSIS-DAP-Debugger. Подключаем нашу плату по Mini-USB к компьютеру. Жмём на кнопку Settings -> Debug-> убираем галочку с “SWJ”
Рис. 21.1. Настройки программатора.
Переходим во вкладку Debug -> Рядом с CMSIS-DAP Debugger жмём Settings -> переходим во вкладку Flash Download , Выбираем пункт Erase full chip.
Рис. 22. Настройки адресов памяти и алгоритма программирования.
3. Используя внешний SWD-отладчик. На плате WIZwiki W7500p для отладки по CMSIS-DAP Debugger имеется дополнительный чип, но а как же загрузить код программы в микроконтроллер напрямую? В этом поможет встроенный SWD-отладчик. В данном примере мы будем использовать популярный отладчик ST-Link v2. Для начала работы с ST-Link v2 необходимо загрузить ST-Link Utility, программу, которая установит все необходимые драйверы. Переходим по ссылке в нижнюю часть страницы, нажимаем Get Software -> ACCEPT. Скачиваем, устанавливаем. Далее подключаем отладчик к плате, как показано на рис. 23. Убираем перемычки на отладочной плате, как показано на рис.23.
Рис. 23. Подключение внешнего SWD-отладчика.
Далее мы подключаем отладчик к USB-порту компьютера и запускаем наш проект в Keil. Затем, как показано на рис. 24, заходим во вкладку Flash -> Configure flash tools -> Utilities -> Settings-> Debug. В окне SW Device должен появиться сам отладчик. Убираем галочку с SWJ (если она стоит).
Рис. 24. Настройка SWD-отладчика
Далее, как показано на рис. 25, заходим во вкладку Flash Download -> выбираем пункт Erase full chip. В разделе RAM for Algorithm меняем значения на '0x20000000 и 0x4000'. Также необходимо загрузить flash programming algorithm. Переходим по ссылке, загружаем, распаковываем архив, перекидываем файл “W7500_128.FLM” в папку C:\...\Keil_v5\ARM\Flash После того, как вы загрузили алгоритм согласно рис. 25, жмем кнопку Add, в появившемся списке выбираем W7500 128KB FLASH.
Рис. 25. Настройка алгоритмов программирования.
Собираем пустой проект (клавиша F7), загружаем код в отладочную плату (клавиша F8). Если все было сделано правильно, программа должна загрузиться без проблем. Заключение Почему в этой статье мы углубились до настроек, когда можно было бы разобрать готовый пример, взятый из библиотеки? Ответ прост: Чтобы продемонстрировать простоту работы с этим контроллером. Полезные ссылки 1. WIZwiki W7500p По техническим вопросам просьба обращаться к Сергею Долгушину, email: dsa@efo.ru |
|