Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-июн-18 06:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2 Все  След.
Автор Сообщение
 Заголовок сообщения: lwIp 1986BE1T
СообщениеДобавлено: 2015-июл-13 10:25 
Не в сети

Зарегистрирован: 2015-апр-10 22:42
Сообщения: 18
Добрый день!
Поставили задачу портировать стек lwIP на 1986ВЕ1Т.
Собственно вопрос: может уже кто-нибудь проделал подобное?
Существуют ли подводные камни?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2015-июл-19 14:13 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
Насколько я понимаю, lwIp работает под FreeRTOS и использует оперативку (кучу heap) микроконтроллера, но зато в этом плюс - нормальный стек TCP/IP c нормальными сокетами.

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-янв-05 23:39 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
Свершилось!!! :mrgreen:
Запустил LwIP 1.4.1 в режиме без операционной системы (на поллинге (без прерываний) и таймерах).
Собственно два главных файла были адаптированы по мотивам всяких примеров ...\Source\port\netif\ethernetif.c - драйвер Ethernet для стека LwIP и файл настроек ...\Source\port\lwipopts.h.
Сам архив стека брал с родного сайта http://download.savannah.gnu.org/releases/lwip/ - пришлось кстати менять в некоторых файлах конструкции типа #define \lwip... .h из-за дублирования путей (подключен стек для IPv4).
Микроконтроллер получает адрес по DHCP (параметр #define LWIP_DHCP 1 в файле lwipopts.h), показывает его на 4-строчном текстовом ЖК-индикаторе МЭЛТ и отображает статичную тестовую HTTP-страничку LwIP из памяти микроконтроллера.
В startup.s для кучи выбран размер 10 КБайт, как и параметр #define MEM_SIZE (10*1024) в файле lwipopts.h, для стека поставил 4 КБайт, периферийный таймер Timer4 тикает через 10 миллисекунд. На данных настройках ping нормальный - 1-2 мс, страница грузится быстро, лагов пока не обнаружено. Занятые ресурсы:
Код:
Total RO  Size (Code + RO Data)                59540 (  58.14kB)
Total RW  Size (RW Data + ZI Data)             17572 (  17.16kB)
Total ROM Size (Code + RO Data + RW Data)      59724 (  58.32kB).

Единственный нюанс - так как в стеке используется printf() для дебага стека, пришлось, как и в примерах для STM32 ставить галочку Use MicroLib (усечённая версия стандартной библиотеки от Keil). Кто знает, как полностью выключить отладку стека и скомпилировать с полной стандартной библиотекой, сообщите.

!Respect & Many Thanks to Adam Dunkels & Savannah.org!

P.S. Статья одна понравилась, ещё бы ядро у 1986ВЕ1Т было не Cortex M1, а Cortex M3, чтобы таблицу прерываний переносить. http://microsin.net/programming/arm/upd ... t-iap.html
P.P.S. Статьи про динамические веб-страницы на LwIP:
http://khnu.km.ua/root/kaf/ksm/sayt2/st ... m32_3.html
http://radiokot.ru/circuit/digital/pcmod/64/


Вложения:
LwIP_1_4_1.rar [4.28 МБ]
Скачиваний: 463

_________________
Hack the Planet!
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-фев-06 23:48 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
Цитата:
Единственный нюанс - так как в стеке используется printf() для дебага стека, пришлось, как и в примерах для STM32 ставить галочку Use MicroLib (усечённая версия стандартной библиотеки от Keil). Кто знает, как полностью выключить отладку стека и скомпилировать с полной стандартной библиотекой, сообщите.


Раскопал, как не использовать MicroLib, а использовать полную стандартную библиотеку С/C++ http://www.keil.com/support/docs/3614.htm.

Либо написать свой файл retarget.c, либо (мне понравился этот вариант):
снять галочку Use Microlib и подключить Keil::ARM_Compiler и дописать функции int stdin_getchar (void), int stdout_putchar (int ch), например для UART.
Проверил, printf() работает для UART, правда для отладки стека не годится, а вот CAN пошёл на ура, только следует учесть, что при отладке стек немного тормозит, но не падает.
Отладка включается в lwipopts.h - неплохие сведения есть здесь (page 30) http://www.atmel.com/Images/Atmel-42233 ... T04055.pdf и здесь https://www.lpcware.com/content/project ... bug-output:
Код:
#define LWIP_DEBUG                           1

#define LWIP_DBG_MIN_LEVEL               LWIP_DBG_LEVEL_ALL
#define LWIP_DBG_TYPES_ON                  LWIP_DBG_ON

#define NETIF_DEBUG                           LWIP_DBG_ON
#define ETHARP_DEBUG                        LWIP_DBG_ON
//#define PBUF_DEBUG                           LWIP_DBG_ON

//#define IP_DEBUG                              LWIP_DBG_ON
//#define TCPIP_DEBUG                           LWIP_DBG_ON
#define DHCP_DEBUG                           LWIP_DBG_ON
#define UDP_DEBUG                              LWIP_DBG_ON

//#define TCP_DEBUG                              LWIP_DBG_ON


И это, оказывается, особенность самой архитектуры ARMv6-M и ARMv7-M http://www.keil.com/support/man/docs/AR ... 046598.htm, а я то думал, почему при отключении MicroLib у меня код останавливается постоянно при запуске отладки на инструкции BKPT 0xAB :D - так это же так называемый Semihosting...

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-авг-29 14:43 
Не в сети

Зарегистрирован: 2011-сен-20 11:53
Сообщения: 56
R Max писал(а):
Свершилось!!! :mrgreen:
Запустил LwIP 1.4.1 в режиме без операционной системы (на поллинге (без прерываний) и таймерах).

А на прерываниях и DMA не делали?

И кстати, зачем в комплекте лежит CMSIS_DRV_ETHERNET_FINAL.pack ?
У меня был установлен стандартный Milandr.MDR1986BExx.1.4.2.pack и не собралось, когда установил CMSIS_DRV_ETHERNET_FINAL.pack - собралось, но 1986VE1 в менеджере пакетов попал в группу Cortex-M0, это так и было задумано?
Потом заново установил Milandr.MDR1986BExx.1.4.2.pack и теперь 1986VE1 в менеджере пакетов есть и в группе Cortex-M0, и в группе Cortex-M1, вот думаю не полезут ли глюки.....


Вложения:
1.jpg
1.jpg [ 57.14 КБ | Просмотров: 13173 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-авг-30 20:31 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
На прерываниях не делал, а DMA в 1986ВЕ1Т для блока Ethernet не подключено физически (топологически) к DMA-контроллеру - об этом сказано в спецификации...

CMSIS_DRV_ETHERNET_FINAL.pack - потому что в нём во-первых в .h-файле регситров я мог добавить дополнительные определения - если проект собирается со штатной библиотекой, значит всё норм и специальную ставить не надо. Во-вторых, проект с LwIP я сделал после того, как заставил контроллер работать с встроенным в Keil стеком TCP/IP (http://www.keil.com/pack/doc/mw/Network/html/index.html - плюшек там много, но стек требует операционную систему Keil-а и закрытый (.lib файл) (кстати здесь как раз есть работа по прерываниям приёма/передачи, которые уведомляют ОС о пакетах Ethernet) - можете скачать демо-проект отсюда viewtopic.php?p=16977#p16977 - сами посмотрите - там и HTTP и FTP на SD-карте).

По поводу M0/M1 viewtopic.php?p=17519#p17519 ...

Чтобы не было глюков удалите в папке, куда установлен Keil, папку С:\Keil_v5\ARM\PACK\Keil\MDR1986BExx и заново установите тот пак, который нужен...

Кстати можете попробовать собрать проект viewtopic.php?p=16206#p16206 с последним паком CMSIS_DRV_ETHERNET_FINAL.pack - LwIP будет работать под операционной системой https://www.keil.com/pack/doc/cmsis/RTO ... index.html (CMSIS RTOS) от Keil.

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-авг-30 22:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1284
Откуда: Тула
R Max писал(а):
На прерываниях не делал, а DMA в 1986ВЕ1Т для блока Ethernet не подключено физически (топологически) к DMA-контроллеру - об этом сказано в спецификации...

Можно пруф? А то на Рисунок 8 – Структурная схема организации памяти на стр. 27 СП на ВЕ1 (2.14.0) есть связь между DMA и Ethernet 10/100 по шине M. Далее нигде такого ограничения нет.
Если только в этом проблема?
Цитата:
Дата документа: 25/11/15 1986BE1 Series Errata Notice
Номер Документа: Страница 36 из 37
0022 Ошибка шины AHB Ethernet контроллера
Статус
Будет исправлено в следующей ревизии.
Описание
После операции записи регистров или памяти Ethernet контроллера нельзя проводить
операции чтения/записи с ОЗУ по адресам 0x20100000-0x20103FFF , так как это приводит к
ошибочной записи в Ethernet контроллер. Необходимо дождаться завершения операции
записи в Ethernet контроллер с помощью инструкций “NOP” или инструкций барьерной
синхронизации.
Условия
Всегда
Последствия
Ошибочная запись в Ethernet контроллер.
Рекомендации и способы обхода
Учитывать при разработке ПО.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-авг-31 20:30 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
prostoRoman, из спецификации:

с. 408 - 30.8 События приемника и передатчика
В блоке MAC присутствуют 2 вывода индикации событий: события передатчика (EVNT[1]) и приемника (EVNT[0]). Основным назначением этих выводов является информирование управляющего процессора или DMA-контроллера о наличии данных для перемещения. Выводы EVNT программируемые. В качестве источника события могут быть выбраны:
 состояние буфера;
 начало приема/передачи пакета;
 завершение приема/передачи пакета;
 перемещение слова из/в буфера.
Первое событие предназначено для непрерывного обмена информацией с контролем состояния приема/передачи пакетов при использовании высокоуровневых протоколов. Следующие два события обеспечивают прием и передачу пактов в интерактивном режиме с непосредственным контролем их приема и передачи. Последнее событие предназначено для непосредственного контроля записи/чтения слов данных в/из буферов, и основное назначение этого события – режим отладки.

Мне кажется :? здесь надо дописать внешнего DMA-контроллера...

Комментарий от Petr viewtopic.php?p=14732#p14732

В блоке Ethernet_MAC возможность подключения к DMA есть, поэтому описаны настройки событий для генерирования запросов на выполнение цикл DMA, но к самому блоку DMA данные выводы не подключены (сигналы не доходят)...

Ну типа аппаратного DMA нет, а полусофтовый эт не то....

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-01 08:33 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1284
Откуда: Тула
Действительно, раздел про DMA намеренно пропустил сперва, подумал в этом дело никак не может быть, ан нет -- заведомо не заведено.
Цитата:
стр. 351 Таблица 395 – Распределение каналов DMA

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-01 11:27 
Не в сети

Зарегистрирован: 2011-сен-20 11:53
Сообщения: 56
R Max писал(а):
На прерываниях не делал, а DMA в 1986ВЕ1Т для блока Ethernet не подключено физически (топологически) к DMA-контроллеру - об этом сказано в спецификации...

Да я уже давно готов на этом проце к таким кунштюкам. Значит будем делать на прерываниях.
Мне-то интересно в LwIP наличие DHCP и нормальная работа с дефрагментацией TCP/IP.

Сейчас у меня HCLK 128МГц, теперь ищу где еще может выплыть привязка к HCLK.
Я правильно понимаю, что системная частота прописывается только в #define RTE_HCLK 144000000
и от неё считаются только задержки Delay ? Эти задержки где-то используются кроме LCD?
В таймере написана фиксированная величина MDR_TIMER4->PSG = 8999; и больше нигде нет завязок на HCLK?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-01 12:28 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1284
Откуда: Тула
Ещё бывает
Код:
@file    system_MDR1986VE1T.c

/*******************************************************************************
*  Clock Definitions
*******************************************************************************/
  uint32_t SystemCoreClock = (uint32_t)8000000;         /*!< System Clock Frequency (Core Clock)
                                                         *   default value */
обновляется вызовом
Код:
/**
  * @brief  Update SystemCoreClock according to Clock Register Values
  * @note   None
  * @param  None
  * @retval None
  */
void SystemCoreClockUpdate (void)

после настройки тактирования, завязана на
Код:
* @file    MDR32F9Qx_Demo\Project\Demo\MDR32F9Qx_config.h

/* Target system parameters */
/* RST_CLK generators frequencies in HZ */
#define HSI_Value       ((uint32_t)8000000)
#define HSE_Value       ((uint32_t)8000000)
#define HSE2_Value      ((uint32_t)25000000)
#define LSI_Value       ((uint32_t)40000)
#define LSE_Value       ((uint32_t)32768)

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-01 14:02 
Не в сети

Зарегистрирован: 2011-сен-20 11:53
Сообщения: 56
prostoRoman писал(а):
Ещё бывает

Да не, там StdPeriphDriver не используется.
Так-то я знаю где эти циферки лежат, мне интересно может где-то еще в коде R_Max есть константы пересчитанные из частоты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-01 19:41 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
Цитата:
Сейчас у меня HCLK 128МГц, теперь ищу где еще может выплыть привязка к HCLK.
Я правильно понимаю, что системная частота прописывается только в #define RTE_HCLK 144000000
и от неё считаются только задержки Delay ?
Да
Цитата:
Эти задержки где-то используются кроме LCD?
Нет
Цитата:
В таймере написана фиксированная величина MDR_TIMER4->PSG = 8999; и больше нигде нет завязок на HCLK?
Нет

Единственно - есть ещё делитель скорости DIV в регистре MDIO_CTRL блока MAC Ethernet, но как это всё работает viewtopic.php?f=34&t=2641, я не понял, поэтому в него я вообще ничего не записываю (всё по-умолчанию) - вроде и так работает всё нормально.

Также не забудьте про ошибку номер 21 в errata
Открыть
Цитата:
0021 Ограничения при работе буферов Ethernet контроллера в автоматическом режиме и режиме FIFO

Статус
Будет исправлено в следующей ревизии.

Описание
При работе буферов Ethernet контроллера в автоматическом режиме и режиме FIFO ядро не успевает записывать данные в буферы при работе на частоте менее 144 МГц. Поэтому рекомендуется работать на частоте 144 МГц либо записывать дополнительные упреждающие данные. При считывании принятых пакетов в вышеописанных режимах работы буферов не использовать флаг RF_OK регистра IFR, который может стать неактивным при наличии пакета в буфере. При считывании пакетов использовать условие неравенства указателей R_Tail и R_Head.

Условия
Всегда

Последствия
Потеря пакетов

Рекомендации и способы обхода
Учитывать при разработке ПО.
Закрыть

, если будете вдруг менять режим работы буферов (и соответствующий код приёма/передачи пакетов).

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-02 14:38 
Не в сети

Зарегистрирован: 2011-сен-20 11:53
Сообщения: 56
Заработала шарманка! Адрес получает, httpd отвечает :)
Спасибо за код!
зы. долго искал почему UART не работает, оказалось TIMER4 его перебивал:
MDR_RST_CLK->UART_CLOCK =
(RST_CLK_TIM_CLOCK_TIM_BRG_HCLK_DIV_16 << RST_CLK_UART_CLOCK_TIM4_BRG_Pos) |
(1 << RST_CLK_UART_CLOCK_TIM4_CLK_EN_Pos);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: lwIp 1986BE1T
СообщениеДобавлено: 2016-сен-03 17:12 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
hardegor и все, кто скачивал проект :!: :!: :!:
Разобравшись с микросхемой 5600ВГ1У, понял, почему не работала фильтрация по уникальному MAC-адресу в 1986ВЕ1Т (в файле ethernentif.c был установлен бит приёма всех пакетов ETH_R_CFG_AC_EN_Pos в регистре MDR_ETHERNET1->ETH_R_CFG).

Прикладываю поправленный проект, в файле ethernetif.c исправлено:
строка 131:
MDR_ETHERNET1->ETH_R_CFG =
(0 << ETH_R_CFG_MCA_EN_Pos) |
(1 << ETH_R_CFG_BCA_EN_Pos) |
(1 << ETH_R_CFG_UCA_EN_Pos) |
(0 << ETH_R_CFG_AC_EN_Pos) |
(0 << ETH_R_CFG_EF_EN_Pos) |
(0 << ETH_R_CFG_CF_EN_Pos) |
(0 << ETH_R_CFG_LF_EN_Pos) |
(0 << ETH_R_CFG_SF_EN_Pos) |
(5 << ETH_R_CFG_EVNT_MODE_Pos) |
(0 << ETH_R_CFG_MSB1st_Pos) |
(0 << ETH_R_CFG_BE_Pos) |
(0 << ETH_R_CFG_EN_Pos);

строка 377:
/* initialize MAC address in ethernet MAC */
MDR_ETHERNET1->ETH_MAC_T = (netif->hwaddr[1] << 8) | netif->hwaddr[0];
MDR_ETHERNET1->ETH_MAC_M = (netif->hwaddr[3] << 8) | netif->hwaddr[2];
MDR_ETHERNET1->ETH_MAC_H = (netif->hwaddr[5] << 8) | netif->hwaddr[4];


Также поправил функцию задания тактирования микроконтроллера:
строка 24 в main.c:
MDR_RST_CLK->CPU_CLOCK =
(RST_CLK_CPU_CLOCK_CPU_C1_SEL_HSE << RST_CLK_CPU_CLOCK_CPU_C1_SEL_Pos) |
(RST_CLK_CPU_CLOCK_CPU_C2_SEL_CPU_C1 << RST_CLK_CPU_CLOCK_CPU_C2_SEL_Pos) |
(RST_CLK_CPU_CLOCK_CPU_C3_SEL_CPU_C2 << RST_CLK_CPU_CLOCK_CPU_C3_SEL_Pos) |
(RST_CLK_CPU_CLOCK_HCLK_SEL_CPU_C3 << RST_CLK_CPU_CLOCK_HCLK_SEL_Pos);

Дополнительно частично адаптировал пример "AN3966 Application note LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers" http://www.st.com/content/ccc/resource/ ... 036052.pdf под 1986ВЕ1Т. Работают без операционной системы (режим поллинга) одновременно три примера: Web server, TCP echo server application, UDP echo server application. При этом включен DHCP.

При включении микроконтроллер получает IP от роутера (192.168.1.1) и отображает его на текстовом ЖК-индикаторе МЭЛТ MT–20S4A. С помощью браузера по полученному IP можно зайти на HTTP-сервер, в закладке Led Control - помигать светодиодами, а в закладке ADC status bar, покрутив потенциометр, посмотреть показание 0 канала АЦП микроконтроллера.
В архиве проекта во вложении в папке Soft находится утилита echotool.exe от STM32 для проверки эхо-обмена данными по UDP и TCP. Там же лежат командные .bat-файлы, в которых необходимо исправить IP на IP, полученный микроконтроллером. Далее, запустив их, можно проверить обмен по UDP/TCP.


Вложения:
lw_1986VE1T_udp_tcp_http_cgi.rar [4.96 МБ]
Скачиваний: 447
LwIP_1_4_1_MAC_Ok.rar [4.32 МБ]
Скачиваний: 401

_________________
Hack the Planet!
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2 Все  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB