Портирование примера udp_echo_server для отладочной платы ST322xG_EVAL на отладку TE-ST32F207 в среде KEIL.

Речь идёт об этом примере с сайта ST: www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f2x7_eth_lwip.zip

Ну тут всё просто, примеры от ST со временем становятся удобнее и красивее.

1. Идём в main.h и закомментируем
#define USE_LCD
на строке 39.
2. Идём в stm32f2x7_eth_bsp.c и изменяем адрес PHY микросхемы на 0x01F на строке 29. Но по идее должно работать и без этой правки.
Теперь меняем функцию, конфигурирующую GPIO на такую, изменённую для TE-ST32F207:

void ETH_GPIO_Config(void)
{

  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Enable GPIOs clocks */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
                         RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOI |
                         RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH |
                         RCC_AHB1Periph_GPIOF, ENABLE);

  /* Enable SYSCFG clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  

  /* Configure MCO (PA8) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM322xG-EVAL  */
 #ifdef PHY_CLOCK_MCO


  /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */
  RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
 #endif /* PHY_CLOCK_MCO */

  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE  /* Mode RMII with STM322xG-EVAL */

  /* Output PLL clock divided by 2 (50MHz) on MCO pin (PA8) to clock the PHY */
  RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2);

  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif

/* Ethernet pins configuration для ST322xG_EVAL и для TE-ST32F107 отладочных плат
   				           EVAL  	TE, / означает без изменений.
        ETH_MDIO -------------------------> PA2	  	/
        ETH_MDC --------------------------> PC1	  	/
        ETH_PPS_OUT ----------------------> PB5	  	/
        ETH_MII_CRS ----------------------> PH2	  	PA0
        ETH_MII_COL ----------------------> PH3	  	PA3
        ETH_MII_RX_ER --------------------> PI10  	PB10
        ETH_MII_RXD2 ---------------------> PH6	  	PB0
        ETH_MII_RXD3 ---------------------> PH7	  	PB1
        ETH_MII_TX_CLK -------------------> PC3	  	/
        ETH_MII_TXD2 ---------------------> PC2	  	/
        ETH_MII_TXD3 ---------------------> PB8	  	/
        ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1         /
        ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7	        /
        ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4	  	/
        ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5	  	/
        ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11  	PB11
        ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13  	PB12
        ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14  	PB13
                                                  */
   //конфигурируем в соответствии с распиновкой на плате TE-ST32F207
  /* Configure PA */	
  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

  /* Configure PB */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_12;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_ETH);	
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);	
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);	

  /* Configure PC1, PC2, PC3, PC4 and PC5 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
}


Примерно такой же порядок действий для других примеров.
Компилируем, прошиваем. Наша отладка пингуется и работает.
Файлы в топике: main-h+stm32f2x7_eth_bsp-c.zip

Комментарии (8)

RSS свернуть / развернуть
А зачем требуется менять адрес микросхемы PHY? как этот адрес использует программа?
0
Интерфейс MII (соединение МК с PHY микросхемой) поддерживает до 32 PHY микросхем одновременно. Микросхеме должен быть присвоен PHY адрес от 1 до 32, по нему контроллер обращается к регистрам PHY микросхемы, чтобы прочитать или изменить их.

В данном случае PHY микросхема уже сконфигурирована нужным образом с помощью своих конфигурационных выводов, и менять что-либо нет необходимости — PHY адрес может не совпадать, всё равно работает. Но если программно захочется что-либо изменить — адрес должен совпадать.
0
А что за пин такой ETH_PPS_OUT? Для чего он?
0
ETH_PPS_OUT — специальный пин для сетей, в которых есть сигналы синхронизации времени (каждую секунду). У меня от него, естесственно, толку никакого, да и программной поддержки в коде нет.
0
Спсибо! Использую плату ET-STM32F207. Ничего не получалось. Выполнил данные инструкции, запустил проект httpserver от stm. Все откомпилироваk, создал hex в keil 4.20. Далее используя segger зашил hex (это потомучто оригинальный j-link iar не принимает keil, не дружат они видать компаниями))))). Дальше передернул питание платы. Подключил к сетевой карте плату прямым патчкортом, в настройках TCP/IP указал 192.168.0.2, 255.255.255.0 дальше все пустые поля но не автоматически! Пропинговал ping 192.168.0.10 — отозвалась, дальше в браузере ввел 192.168.0.10 и получил радость. Теперь в этом ужасе надо разобраться))) Удачи!
0
Huston, спасибо за очерк!
Волнует вот какой момент. У PHY DP83848 от Texas Instruments, используемый в борде от ST, есть пин PWR_DOWN/INT. В оригинальном примере есть обработка прерывания по этому сигналу. Оно говорит нам о подключении/отключении кабеля. У RTL8201 же такого сигнала нет.
В итоге, если при инициализации МК ethernet-кабель не подключен, то интерфейс больше не поднимется. Это совсем нехорошо.
Ищу способы решения.

Ещё одно замечение. Вот код из stm32f2x7_eth_bsp.c:

while(ETH_GetSoftwareResetStatus() == SET);

Если что-то случится с Ethernet-PHY, то МК останется в бесконечном цикле. У меня такое происходило с платой, на которой не был запаян RJ45 с магнетиками. Вот уж не знаю, почему. Возможно, виновато использование AutoNegotiation-моды.
Например, для меня это важно, потому что в моём случае есть ещё один интерфейс, по которому я смогу достучаться до МК. Здесь я бы установил таймаут.

unsigned long swres_timeout = 0x007FFFFF;
while(ETH_GetSoftwareResetStatus() == SET && swres_timeout--);
0
У RTL8201 же такого сигнала нет.
В итоге, если при инициализации МК ethernet-кабель не подключен, то интерфейс больше не поднимется. Это совсем нехорошо.
А разве нельзя у PHY выяснить, воткнут ли кабель? Наверняка это есть в каком-нить регистре. Так что просто периодически опрашивать этот регистр и как только обнаружится кабель — делать все то же самое, что и по прерыванию.
0
Да, действительно такой регистр есть (в datasheet — 6.17 Register 25 Test Register).
Я лишь хотел подчеркнуть проблему, столкнувшись с ней. Опишу результаты позже.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.