Ethernet на базе LwIP стека в SK-STM32F217

LwIP стек в SK-STM32F217Ethernet на базе LwIP стека в SK-STM32F217 от starterkit.ru реализуется несложно. Хотя к отладочному модулю и придается демо проект веб сервера на базе стека uIP, но его однотипность и отсутствие всяких пояснений уменьшает его полезность. Лучший вариант - это оригинальный демо проект от ST к STM3220G-EVAL evaluation board который снабжен всей необходимой документацией. Проект, оригинальный вариант которого можно найти на st.com, построен на базе LwIP стека и содержит все возможные приложения для работы по Ethernet - udp_echo_server, tcp_echo_client, httpserver и др., а также приложения работающие под управлением FreeRTOS.

Но вот незадачка, все проекты выполнены под микросхему физического уровня Etеhernet DP83848C, а в платке от starterkit стоит ks8721bl. Кроме всего прочего все оригинальные проекты Eternet работают на базе MII интерфейса, а в платке применен RMII интерфейс. Но не беда, переделка оказалась несложной. Нужно инициализацию GPIO и MAC сделать так же как и в прилагаемой к платке демке, но только на базе новой библиотеки работы с периферией, которая встроена в оригинальные проекты от ST, и в установках проектов задефайнить режим RMII.

Итак к файлу stm32f2x7_eth_bsp.c всех проектов добавлены функции void ComPortInit(void) - инициализация com порта 1 вместо 3 void; GPIO_Configuration(void) - конфигурация GPIO для работы Ethernet в SK-STM32F217; void RCC_Configuration(void) - конфигурация клоков для работы MAC в режиме RMII. Вызов этих функций включен в оригинальные функции void ETH_BSP_Config(void) и static void ETH_MACDMA_Config(void).

Кроме всего порочего в файле main.h #define MII_MODE сменен на #define RMII_MODE. Ниже пример функций конфигурации GPIO и RCC для работы MAC stm32f217 совместно с ks8721bl в режиме RMII.


void GPIO_Configuration(void)
{

//	Enable GPIOA, GPIOB, GPIOC, GPIOG clock 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
                         RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE);

//	PG13 -> TD0  
//	PG14 -> TD1 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH);

//	PB11 -> TEN 	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);

//	PA8 -> MCO1 50MHz output 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);

//	PA7 -> CRS 	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

//	 PC4 -> RD0  	
//	 PC5 -> RD1 	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

//	 PC1 -> MDC    	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);

//	PA2 -> MDIO 		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);

// PA1 -> REFC 		  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);


void RCC_Configuration(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
#ifdef MII_MODE
	SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE
	SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif
 	
	SYSCFG_CompensationCellCmd(ENABLE);
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_HASH, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
                        RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_CRC, ENABLE);
}

Ну и собственно сам архив Ethernet LwIP для SK-STM32F217. Кому все это пригодилось или есть замечания и дополнения не забывайте оставлять свой коммент.

Top.Mail.Ru