|
LwIP стек в STM32F217 |
|
|
|
Jan 12 2012, 09:42
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
На st имеется демка под LwIP на stm32f207 для PHY DP83848C (режим MII) (в демке реализованы почти все возможные варианты серверов и клиентов). Поскольку у меня на столе имеется платка с stm32f217 + phy ks8721bl (режим RMII) пришлось демку LwIP переделать под нее (не поленился переделал все демки в том числе и под FREE RTOS). Все приложения работают без проблем. Вот ссылка на архив (большой ~47м ). (переделаны проекты для Keil, проекты под IAR переделываюся только сменой камня. Все работает также без проблем) Но остался вопрос. Нормального понимания как работать с LwIP + stm32 пока нет. Дока на стек и демку не проясняет. У кого есть опыт работы с LwIP + stm32 подсобите please для старта простым примером LwIP как принять одни данные по UDP и отправить другие. В демке имеется UDP эхо сервер. Поможет даже подсказка как сделать так, чтобы сервер отправлял не эхо, а конкретные данные из конкретного буфера типа *my_buf. Спасибо. В main все начинается так: Код /* check if any packet received */ if (ETH_CheckFrameReceived()) { /* process received ethernet packet */ LwIP_Pkt_Handle(); } Функция ETH_CheckFrameReceived делает это: CODE /** * @brief This function polls for a frame reception * @param None * @retval Returns 1 when a frame is received, 0 if none. */ uint32_t ETH_CheckFrameReceived(void) { /* check if last segment */ if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET)) { DMA_RX_FRAME_infos->LS_Rx_Desc = DMARxDescToGet; DMA_RX_FRAME_infos->Seg_Count++; return 1; } /* check if first segment */ else if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&& ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)) { DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet; DMA_RX_FRAME_infos->LS_Rx_Desc = NULL; DMA_RX_FRAME_infos->Seg_Count = 1; DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); } /* check if intermediate segment */ else if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET)&& ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)) { (DMA_RX_FRAME_infos->Seg_Count) ++; DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); } return 0; } Я так понимаю, что функция проверяет имеется ли что-то в DMA В частности если имеется фрейм и сегмент в фрейме последний, то возвращается 1. Что такое последний сегмент? Понимаю, что можно послать меня на очередной мануал. Но мануалы меня уже сильно достали из за их непоследовательности и часто бесполезности. Ответьте пожалуйста на русском коротко работу функции ETH_CheckFrameReceived(void) (функция почемуто всегда, послал я фрейм или нет, возвращает 1) Дальше начинается кошмар по имени Код /* process received ethernet packet */ LwIP_Pkt_Handle(); который далее переходит в Код /* Read a received packet from the Ethernet buffers and send it to the lwIP for handling */ ethernetif_input(&netif); и куда дальше попадают собственно данные посланного из компа UDP пакета, так, чтобы с ними можно было -бы поработать и как послать компу ответ в виде своего пакета (а не того же самого) не допираю. Подсобите, кто сталкивался с этим. Нашел пока это http://lwip.wikia.com/wiki/Raw/UDPВсеравно не понятно как на базе LwIP послать на комп UDP пакет Ну допустим так: Код struct udp_pcb *upcb; /* Create a new UDP control block */ upcb = udp_new(); /* Bind the upcb to the UDP_PORT port */ /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */ udp_bind(upcb, IP_ADDR_ANY, 23); /* Connect to the remote client */ udp_connect(upcb, addr, 23); В каком виде нужно записать addr? Похоже, что дальше можно Код udp_send(struct udp_pcb * pcb, struct pbuf * p) тоесть Код udp_send(upcb, p); Что такое struct pbuf * p
Сообщение отредактировал Acvarif - Jan 12 2012, 14:48
|
|
|
|
|
 |
Ответов
|
Jan 18 2012, 07:40
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 17 2012, 16:48)  Если кто не знает. В LwIP системма выдачи отладочной информации. 1. Чтоб ее задействовать нужно определить макрос LWIP_PLATFORM_DIAG в файле debug.h Если говорить про iar то все просто: #define LWIP_PLATFORM_DIAG printf и устанавливаете в опциях пректа флажек "include semihosting interfice", если поддерживает контороллер и отладчик включаете режим "Semihosted, stdout/stderr via SWO"(в режиме "Semihosted, stdout/stderr via semihosting" лучше даже не пытаться - уж больно тормозяво, если не получается через SWO лучше уж через UART предварительно написав драйвер с приличным буфером), в общем включаете выдачу отладочных сообщений на консоль. 2 в файле opt.h #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL/LWIP_DBG_LEVEL_WARNING/LWIP_DBG_LEVEL_SERIOUS в зависимости от того какие сообщения хотите получать. там-же #define LWIP_DBG_TYPES_ON LWIP_DBG_ON там-же настраиваете от каких модулей хотите получать сообщения. 90% вопросов "почему не работает" отпадет при просмотре логов. Ваш К.О. Пытаюсь повторить в IAR. #define LWIP_PLATFORM_DIAG printf в файле debug.h установлено по умолчанию в файле opt.h по умолчанию Код #ifndef LWIP_DBG_MIN_LEVEL #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL #endif#ifndef LWIP_DBG_TYPES_ON #define LWIP_DBG_TYPES_ON LWIP_DBG_ON #endif А это Цитата и устанавливаете в опциях пректа флажек "include semihosting interfice", не нашел. Пользуюсь J-Link 8
|
|
|
|
|
Jan 18 2012, 11:25
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(Acvarif @ Jan 18 2012, 10:40)  А это не нашел. Пользуюсь J-Link 8 Извиняюсь, дал названия из eclipse. Непосредственно в IARе: Project->Option->General Option->Library Configuration->Library Low-level interface impletation ->Переключаете в в режим Semihosted и stdout/stderr в режим Via SWO. Если отлаживаете через JTAG, а не через SWD то режим Via SWO естественно недоступен. IAR 6.21. Цитата Я бы не парился с этим режимом. лучше напишите свой putchar и гоните в свободный UART, их у вас все таки 5 При наличии J-Linkа поддерживающего SWD и контроллера с SWD такой возможностью грех не воспользоватся. Уже давно на кортексах все отладочные сообщения вывожу именно через отладчик. А с UARTом не так все просто. Если в putchar тупо кидать данные в UART то, например при выводе более-менее приличного обема данных в прерывании есть шанс пропустить другое прерывание, это в худшем случае, но даже без этого вывод через UART без буфферизации занимает слишком много времени.
|
|
|
|
|
Jan 18 2012, 13:27
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 18 2012, 14:25)  Извиняюсь, дал названия из eclipse. Непосредственно в IARе: Project->Option->General Option->Library Configuration->Library Low-level interface impletation ->Переключаете в в режим Semihosted и stdout/stderr в режим Via SWO. Если отлаживаете через JTAG, а не через SWD то режим Via SWO естественно недоступен. IAR 6.21. Все сделал. Тоже в IAR 6.21 oph.h Код /** * API_LIB_DEBUG: Enable debugging in api_lib.c. */ #ifndef API_LIB_DEBUG #define API_LIB_DEBUG LWIP_DBG_OFF #endif Хотя файл защищен от записи. Пришлось изменить ему атрибуты и вместо LWIP_DBG_OFF написать LWIP_DBG_ON Отладчик запустился с появлением зеленой кнопки SWO, но сообщений пока на терминале нет. Хотя в api_lib.c есть что выводить на терминал Может еще что нужно сделать ON для того, чтобы увидеть работу терминала при работе стека?
Сообщение отредактировал Acvarif - Jan 18 2012, 13:33
|
|
|
|
|
Jan 18 2012, 13:57
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Прежде всего нужно переопределить макрос LWIP_DBG_TYPES_ON с LWIP_DBG_OFF на LWIP_DBG_ON - это глобальное разрешение выдачи отладочных сообщение. Затем макросом LWIP_DBG_MIN_LEVEL регулируем что именно мы хотим получать - все(LWIP_DBG_LEVEL_ALL), предупреждения(LWIP_DBG_LEVEL_WARNING) или ошибки (LWIP_DBG_LEVEL_SERIOUS). После с помощью макросов ETHARP_DEBUG, NETIF_DEBUG, PBUF_DEBUG...... в том числе API_LIB_DEBUG указывеме из каких модулей вы хотите получать сообщения( например API_LIB_DEBUG управляет отладочными сообщенияим из модуля api_lib.c). PS Для проверки добавте в main что-небудь вроде printf("test\r\n"); если с настройками собственно отладочных сообщений все в норме то при запуске увидите в терминале "test".
Сообщение отредактировал IgorKossak - Jan 18 2012, 20:56
Причина редактирования: Бездумное цитирование
|
|
|
|
Сообщений в этой теме
Acvarif LwIP стек в STM32F217 Jan 12 2012, 09:42 kan35 Дока на lwIP существует, она вполне полезная, по к... Jan 12 2012, 15:49 Acvarif Спасибо. Начало проясняться.
Удалось послать ст... Jan 13 2012, 06:43 kan35 Вы продолжаете работать на уровне pcb, я же предла... Jan 13 2012, 07:33 Acvarif ЦитатаВы продолжаете работать на уровне pcb, я же ... Jan 13 2012, 11:39  Acvarif Цитата(Acvarif @ Jan 13 2012, 15:39) Пыта... Jan 13 2012, 13:03   Acvarif Все прояснилось. Мануал 2001 года подходит для LwI... Jan 13 2012, 14:51 kan35 Чтобы активировать те или иные Api кроме того, что... Jan 13 2012, 16:34 Acvarif Спасибо. Почти получилось...
Портит картину netcon... Jan 13 2012, 18:58  Acvarif RE: LwIP стек в STM32F217 Jan 14 2012, 13:40 kan35 opt.h - это настройки по умолчанию, их не стоит тр... Jan 14 2012, 17:05 Acvarif Понял. Спасибо. Файл нашел.
Можно ли подружить это... Jan 14 2012, 18:17 kan35 Должен работать конечно, но нюансов не скажу, так ... Jan 14 2012, 19:04 Acvarif Понял. Спасибо. С ОС стек компилится без проблем. ... Jan 14 2012, 19:35 MK2 А чем вы с компьютера посылали пакеты? Jan 15 2012, 18:20 Acvarif Цитата(MK2 @ Jan 15 2012, 22:20) А чем вы... Jan 16 2012, 06:36  Acvarif В общем вроде все получилось. Использовал имеющийс... Jan 16 2012, 13:23   scifi Цитата(Acvarif @ Jan 16 2012, 17:23) Все ... Jan 16 2012, 13:36    Acvarif Цитата(scifi @ Jan 16 2012, 17:36) В MAC ... Jan 16 2012, 14:52     scifi Цитата(Acvarif @ Jan 16 2012, 18:52) Но о... Jan 16 2012, 19:43      Acvarif Цитата(scifi @ Jan 16 2012, 22:43) Пакет ... Jan 16 2012, 20:16       MALLOY2 Цитата(Acvarif @ Jan 16 2012, 22:16) Да, ... Jan 17 2012, 08:45       sparcmaster Цитата(Acvarif @ Jan 17 2012, 00:16) Буду... Jan 17 2012, 08:51     =F8= Цитата(Acvarif @ Jan 16 2012, 17:52) Но о... Jan 17 2012, 09:11      scifi Цитата(=F8= @ Jan 17 2012, 13:11) Парамет... Jan 17 2012, 11:10       =F8= Цитата(scifi @ Jan 17 2012, 14:10) Это из... Jan 17 2012, 12:37 MALLOY2 ЦитатаБуду признателен, за подсказку - технологию ... Jan 17 2012, 09:44 Acvarif Цитата(MALLOY2 @ Jan 17 2012, 12:44) Я по... Jan 17 2012, 13:25 Twen Аналогично использую МК stm32 + LwIp на FreeRTOS, ... Jan 17 2012, 12:38 Acvarif Спасибо за полезную информацию.
Что имеется ввиду... Jan 17 2012, 14:12  =F8= Цитата(Acvarif @ Jan 17 2012, 18:12) Спас... Jan 17 2012, 15:59     Acvarif Сделано так
LWIP_DBG_ON
LWIP_DBG_LEVEL_ALL
CODE/**... Jan 18 2012, 14:29 kan35 Я бы не парился с этим режимом.
лучше напишите сво... Jan 18 2012, 08:11 Acvarif Цитата(kan35 @ Jan 18 2012, 11:11) Я бы н... Jan 18 2012, 08:45 kan35 Все верно у тебя сделано.
Чтобы printf куда-то вы... Jan 18 2012, 10:16 MALLOY2 ЦитатаПолучается определяет функцию для выдачи соо... Jan 18 2012, 10:44 =F8= Глубина стека в задаче какая? printf довольно стек... Jan 18 2012, 15:56 Acvarif Цитата(=F8= @ Jan 18 2012, 18:56) Глубина... Jan 18 2012, 18:46 =F8= Чтоб появились сообшения в настройках проекта укаж... Jan 19 2012, 10:14 Acvarif Цитата(=F8= @ Jan 19 2012, 13:14) Чтоб по... Jan 19 2012, 12:26 =F8= Посмотрел код.....
1 Вы обявляете локальную переме... Jan 19 2012, 13:04 Acvarif Цитата(=F8= @ Jan 19 2012, 16:04) Посмотр... Jan 19 2012, 14:31 =F8= А размер пакета(SIZE) увеличить не забыли? От этог... Jan 19 2012, 14:50 Acvarif Цитата(=F8= @ Jan 19 2012, 17:50) А разме... Jan 19 2012, 15:10  Acvarif Касательно этой темы:
1. Удержит ли LwIP+FreeRto... Jan 20 2012, 15:52 MALLOY2 ЦитатаНапример работа с ADC, DAC, цифровая обработ... Jan 20 2012, 16:05 Acvarif Цитата(MALLOY2 @ Jan 20 2012, 20:05) Стра... Jan 20 2012, 17:58 Twen Добрый день. Я разбираюсь с реализацией веб0сервер... Jan 28 2012, 08:46 Алллексей Цитата(Twen @ Jan 28 2012, 12:46) Добрый ... Aug 20 2013, 12:32 Log_in Доброго времени суток. Пытаюсь разобраться с работ... Dec 20 2013, 11:44 Golikov A. Цитата(Log_in @ Dec 20 2013, 15:44) Добро... Dec 20 2013, 12:37 Log_in Дело в том, что у меня F107, и в связи с этим в би... Dec 20 2013, 12:50 Golikov A. ОЙ блин!
не,... надо ваще забыть про мое сообщ... Dec 20 2013, 13:01 Log_in Использовал функцию LwIP_Periodic_Handle, вызывающ... Dec 23 2013, 11:40
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|