Знакомимся с Ethernet микроконтроллером W7500P

Знакомимся с Ethernet микроконтроллером W7500p

11 Сентябрь, 2020

 

         В данной статье мы познакомимся с Ethernet-микроконтроллером W7500P от компании WIZnet и его особенностями на примере отладочной платы Wizwiki W7500P, создадим проект в Keil μvision, напишем программу для управления портами ввода-вывода и узнаем, какими способами можно производить отладку и загрузку ПО в микроконтроллер.

 

      1. Создание проекта в Keil μvision.

      2. Первые опыты с GPIO.

      3. Прошивка и отладка.

 

          Ethernet на сегодняшний день является одним из ключевых интерфейсов, используемых во встраиваемом оборудовании, системах контроля и промышленной автоматике. Он удобен тем, что все устройства можно объединить в локальную сеть, контролируя их работу с ПК или при помощи микроконтроллера. Чаще всего, в проектах используются Ethernet-мосты, которые заметно упрощают обмен данными между различными устройствами. Но при этом мосты всегда имели ограниченный набор функций и интерфейсов, с которыми они работали. Поэтому при проектировании устройства мост обычно объединяют с внешним управляющим микроконтроллером, что далеко не всегда удобно.

          Компания WIZnet решила эти проблемы очень просто: она объединила на одном кристалле:

- популярное микроконтроллерное ядро ARM Cortex -M0 с тактовой частотой до 48 МГц.
 - 128Кb Flash-памяти программ.
 - аппаратную реализацию стека протоколов TCP/IP (TCP, UDP, IPv4, ICMP, ARP, IGMP и PPPoE) с восемью соединениями.
- разделяемый буфер памяти RX/TX  объемом 32К.
- аппаратный узел PHY, MAC.

          Таким образом, мы получаем законченную комбинацию из отлично реализованного аппаратного Ethernet и полноценного функционального контроллера. Микросхема поддерживает возможность отладки и загрузки кода при помощи встроенного SWD-отладчика, выпускаются в стандартном корпусе TQFP64 с размерами 7х7 мм.

          Дополнительно на кристалле имеется:

-  два SPI интерфейса
 - два I2C интерфейса
 - три UART интерфейса
- восемь 32-битных ШИМ контроллеров
- четыре 32-битных аппаратных таймера
- сторожевой  32-битный таймер
- шесть DMA каналов с поддержкой SPI и UART
- аппаратный генератор случайных чисел
-12-разрядный 8-канальный АЦП
- внутренний генератор частоты 8 МГц
- ФАПЧ
- внутренний регулятор напряжения (от 3.3 В до 1.5 В)
- 34 линии ввода-вывода общего назначения (GPIO).

          Благодаря этой микросхеме, у разработчиков появляется возможность объединить хорошо известные и популярные мосты от 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.

Характеристика            W7500x PIC18F87J60-I/PT
PHY 10/100Base-T PHY 10Base-T PHY
Память буфферов 32кб 8кб
Разрядность системы 32бит 8бит
RAM 48кб 12кб
Тактовая частота 48 МГц 41.667 МГц
Встроенные интерфейсы I2C - 2шт.
SPI – 2шт. (DMA)
UART – 3шт.
(2 c FIFO и flow Control)
(DMA)
I2C – 1шт.
SPI – 1шт.
UART - 2шт.
Отладка и загрузка кода Serial Wire Debug

ICD (In-Circuit-Debug)

Кол-во сокетов 8 1
Поддержка OS FreeRTOS, Mbed FreeRTOS
Генератор случ. чисел + -
Ядро Cortex M0 PIC18

 

          Среди мостов, производимых конкурентами, можно выделить популярный 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
Сегодня нас интересует «W7500x_gpio.h» и «W7500x_gpio.с». 

          Далее необходимо указать в 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» из соответствующей папки проекта.


          В группе CMSIS должны быть файлы "system_W7500x.h", “system_W7500x.c” и "W7500x.h"


          А в группе Periph-Lib будут файлы нашей библиотеки. Выбираем "W7500x_gpio.c" и "W7500x_gpio.h"

          В конечном итоге проект и его группы должны следующим образом: (см. рис. 12):

Рис.12. Готовый проект.

 

          В main.c добавляем строку #include “W7500x.h” и напишем пустую функцию int main(),  чтобы проверить проект на собираемость и наличие ошибок. При правильном выполнении всех шагов, После нажатия клавиши F7 проект должен собраться без ошибок.

 

 

Первые опыты с GPIO

          Проект мы создали, теперь начнем непосредственно писать сам код нашей программы.

           Для начала добавим библиотеку, которая отвечает за работу портов ввода-вывода.
В файле “main.c” добавляем строку «#include "W7500x_gpio.h"».

Немного о тактировании и его настройках.

           За инициализацию и настройки отвечает функция ‘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

 

Заносим переменные в регистр:
CRG->PLL_FCR = M|N|OD;          

 

          На рис. 14 показана схема устройства блока CRG, который отвечает за настройки тактирования.

          Для того, чтобы настроить частоты тактирования периферии, необходимо занести в регистры, указанные на рис. 14 справа, значения делителей частоты.

Рис. 14. Блок-схема устройства тактирования микроконтроллера.

 

 Библиотеки подключили, частоту настроили, теперь займёмся конкретно работой с GPIO.

Рис. 15. Назначение выводов отладочной платы WizWiki W7500p

 

          Как видно на рис. 15, светодиоды находятся на выводах PC_0 (красный), PC_4 (зелёный), PC_5 (синий). Соответственно, эти выводы нам нужно настроить на выход.

Добавим новый тип для инициализации:

Static GPIO_InitTypeDef GPIO_InitDef;

 

          Удобства ради, всю инициализацию портов gpio объединим в отдельную функцию:

 Void gpio_ini()
{
//Ниже приведен пример инициализации вывода 0 порта GPIOA.

    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.
GPIO_InitDef.GPIO_Pin = GPIO_Pin_0;  - инициализируется вывод 0

GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; - режим работы – выход.

GPIO_Init(GPIOC, &GPIO_InitDef); - инициализируется порт С.

PAD_AFConfig(PAD_PC,GPIO_Pin_0, PAD_AF1);  -  Определяется функция вывода.

 

          Как видно на рис. 19, у одного порта может быть несколько выполняемых функций (Alternative Functions). Параметр AFConfig определяет режим работы вывода. Для работы светодиодов необходим режим Normal Function. В настройках он обозначается как PAD_AF1.(PAD_AF0 и PAD_AF2 отвечают за ШИМ).

 

          Добавим стандартную функцию задержки:

 


void delay_ms(__IO uint32_t nCount)

{
    volatile uint32_t delay = nCount * 1200;  //
 Корректировка для 12MHz

    for(; delay != 0; delay--)

        __NOP();

}

 

          За переключение состояний портов ввода-вывода отвечают функции:
GPIO_SetBits (GPIOx, GPIO_Pin_x); //Логический ноль.
GPIO_ResetBits (GPIOx, GPIO_Pin_x); //Логическая единица.

 

          Напишем несколько строк, определяющих режимы включения и выключения портов, и получим следующее:

 

#include "W7500x.h"
#include "W7500x_gpio.h"
// Подключение библиотек

 Static GPIO_InitTypeDef GPIO_InitDef; // Создание нового типа для инициализации
void gpio_ini(void);
void delay_ms(__IO uint32_t nCount);
// прототипы функций

 int main () {                      
uint32_t M = 0x18 <<16; //M = 24
uint16_t N = 0x08<<8; //N = 8
uint16_t OD = 0x01; //OD = 2
// Переменные для расчета частоты тактирования

SystemInit (); // инициализация системы

CRG->PLL_FCR = M|N|OD; // Запись переменных в регистр расчета частоты
gpio_ini(); // Инициализация GPIO             

while (1) {
GPIO_ResetBits (GPIOC, GPIO_Pin_0); // Вкл. красный
GPIO_SetBits (GPIOC, GPIO_Pin_4); // Выкл. зелёный
GPIO_SetBits (GPIOC, GPIO_Pin_5); // Выкл. синий

delay_ms (100); //Задержка 100мс.

 GPIO_SetBits (GPIOC, GPIO_Pin_0); //Выкл. красный
GPIO_ResetBits (GPIOC, GPIO_Pin_4); //Вкл. зелёный

 

delay_ms (100); //Задержка 100мс. 

GPIO_SetBits (GPIOC, GPIO_Pin_4);// Выкл. зелёный
GPIO_ResetBits (GPIOC, GPIO_Pin_5); //Вкл. синий

delay_ms (100); // задержка 100мс.

 GPIO_ResetBits (GPIOC, GPIO_Pin_0); //Вкл. красный
GPIO_ResetBits (GPIOC, GPIO_Pin_4);//Вкл. зелёный
GPIO_ResetBits (GPIOC, GPIO_Pin_5);//Вкл. синий

delay_ms (100);// Задержка 100мс.

}
}

 void gpio_ini (void) {
//pin 0 (красный)
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);  //Выбор функции работы вывода
//pin 4(зелёный)
GPIO_InitDef.GPIO_Pin = GPIO_Pin_4;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOC, &GPIO_InitDef);
PAD_AFConfig(PAD_PC,GPIO_Pin_4, PAD_AF1);
//pin 5 (Синий)
GPIO_InitDef.GPIO_Pin = GPIO_Pin_5;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOC, &GPIO_InitDef);
PAD_AFConfig(PAD_PC,GPIO_Pin_5, PAD_AF1);                                

GPIO_SetBits (GPIOC, GPIO_Pin_0); // Выкл.
GPIO_SetBits (GPIOC, GPIO_Pin_4); // Выкл.
GPIO_SetBits (GPIOC, GPIO_Pin_5); // Выкл.
}
void delay_ms(__IO uint32_t nCount) //Функция задержки в миллисекундах.
{
volatile uint32_t delay = nCount * 1200; //Корректировка для 12MHz
    for(; delay != 0; delay--)
__NOP();
}

 

 

 

Прошивка и отладка

 

          Загрузить ПО в микроконтроллер можно несколькими способами:


          1. Загрузкой бинарного файла напрямую в микроконтроллер.
          После сборки проекта, в папке W7500p test ->  должен появиться одноимённый проекту файл с расширением «.bin».

Рис. 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:» и добавляем справа :
fromelf --bin -o "$L@L.bin" "#L"

Рис. 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 MBED-CMSIS-DAP, в поле справа выбираем Появившееся устройство.

Рис. 21.1. Настройки программатора.

 

          Переходим во вкладку  Debug -> Рядом с CMSIS-DAP Debugger жмём Settings -> переходим во вкладку Flash Download , Выбираем пункт Erase full chip.
          Далее жмем кнопку Add, в появившемся списке выбираем W7500 128KB FLASH.
          В разделе RAM for Algorithm меняем значения на '0x20000000 и 0x4000' как показано на рис. 22.

Рис. 22. Настройки адресов памяти и алгоритма программирования.

 

          3. Используя внешний SWD-отладчик.

          На плате WIZwiki W7500p для отладки по CMSIS-DAP Debugger имеется дополнительный чип, но а как же загрузить код программы в микроконтроллер напрямую? В этом поможет встроенный SWD-отладчик. В данном примере мы будем использовать популярный отладчик ST-Link v2.

Для начала работы с ST-Link v2 необходимо загрузить ST-Link Utility, программу, которая установит все необходимые драйверы. Переходим по ссылке в нижнюю часть страницы, нажимаем Get Software -> ACCEPT. Скачиваем, устанавливаем.

Далее подключаем отладчик к плате, как показано на рис. 23.
Вывод 1 подключаем к выводу питания отладчика (3.3В – 5В).
Вывод 2 (PA_4) подключаем к выводу SWDIO отладчика.
Выход 3 подключаем к выводу GND отладчика.
Вывод 4 (PA_3) подключаем к выводу SWCLK отладчика.

          Убираем перемычки на отладочной плате, как показано на рис.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). Если все было сделано правильно, программа должна загрузиться без проблем.

Заключение

          Почему в этой статье мы углубились до настроек, когда можно было бы разобрать готовый пример, взятый из библиотеки? Ответ прост: Чтобы продемонстрировать простоту работы с этим контроллером.
          
Все прочие настройки выполняются аналогичным образом. Вся необходимая информация просто и доступно изложена в Reference manual. В следующий раз уже полноценно рассмотрим возможности Ethernet-библиотеки, попробуем реализовать мосты на различных интерфейсах и подключим что-нибудь из периферии.

Полезные ссылки

1. WIZwiki W7500p
2. How to make W7500p project
3. How to write the firmware into WIZwiki W7500p


По техническим вопросам просьба обращаться к Сергею Долгушину, email: dsa@efo.ru 

                                                                                                     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                                                                 

 

 

 

 

 

 

 

 

Ваш заказ
Наверх