/********************************************************************************* @file main.c* @author MCD Application Team* @version V1.0.0* @date 06/19/2009* @brief Main program body******************************************************************************* @copy** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>*//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include "stm32_eval.h"#include "stm32_eth.h"#include <stdio.h>#include <errno.h>#include "uip.h"/** @addtogroup Webserver_Demo_uIP* @{*//* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//*---------------LCD Messages ------------------------------------------------*/#define DP83848_PHY /* Ethernet pins mapped on STM3210C-EVAL Board */#define PHY_ADDRESS 0x01 /* Relative to STM3210C-EVAL Board */#define MII_MODE /* MII mode for STM3210C-EVAL Board (MB784) (check jumpers setting) *///#define RMII_MODE /* RMII mode for STM3210C-EVAL Board (MB784) (check jumpers setting) */#define ETH_RXBUFNB 8#define ETH_TXBUFNB 2/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/ETH_InitTypeDef ETH_InitStructure;/* Ethernet Rx & Tx DMA Descriptors */ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];/* Ethernet buffers */u8 Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE];ErrorStatus HSEStartUpStatus;vu32 Value = 0;/* Private functions ---------------------------------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void ADC_Configuration(void);void uIPMain(void);int _write(int file, char *ptr, int len){int i;if (file == 1) {for (i = 0; i < len; i++) {USART_SendData(USART1, *ptr++);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}return i;}errno = EIO;return -1;}/*** @brief Main program.* @param None* @retval None*/int main(void){/* Setup STM32 system (clock, PLL and Flash configuration) */SystemInit();/* Initialize LEDs **********************************************************/STM_EVAL_LEDInit(LED1);STM_EVAL_LEDInit(LED2);STM_EVAL_LEDInit(LED3);STM_EVAL_LEDInit(LED4);/* Turn on leds available on STM3210X-EVAL **********************************/STM_EVAL_LEDOff(LED1);STM_EVAL_LEDOff(LED2);STM_EVAL_LEDOff(LED3);STM_EVAL_LEDOff(LED4);/* System Clocks Configuration */RCC_Configuration();/* NVIC configuration */NVIC_Configuration();/* ADC configuration */ADC_Configuration();/* ETHERNET pins remapp in STM3210C-EVAL board: RX_DV and RxD[3:0] *///GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);/* MII/RMII Media interface selection */#ifdef MII_MODE /* Mode MII with STM3210C-EVAL */GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_MII);/* Get HSE clock = 25MHz on PA8 pin(MCO) *///RCC_MCOConfig(RCC_MCO_HSE);#elif defined RMII_MODE /* Mode RMII with STM3210C-EVAL */GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);/* Get HSE clock = 25MHz on PA8 pin(MCO) *//* set PLL3 clock output to 50MHz (25MHz /5 *10 =50MHz) */RCC_PLL3Config(RCC_PLL3Mul_10);/* Enable PLL3 */RCC_PLL3Cmd(ENABLE);/* Wait till PLL3 is ready */while (RCC_GetFlagStatus(RCC_FLAG_PLL3RDY) == RESET){}/* Get clock PLL3 clock on PA8 pin */RCC_MCOConfig(RCC_MCO_PLL3CLK);#endif/* Configure the GPIO ports */GPIO_Configuration();USART_Cmd(USART1, ENABLE);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);/* Enable ETHERNET clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);/* Reset ETHERNET on AHB Bus */ETH_DeInit();/* Software reset */ETH_SoftwareReset();/* Wait for software reset */while(ETH_GetSoftwareResetStatus()==SET);/* ETHERNET Configuration ------------------------------------------------------*//* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ETH_StructInit(Ð_InitStructure);/* Fill ETH_InitStructure parametrs *//*------------------------ MAC -----------------------------------*/ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;//ETH_InitStructure.ETH_Speed = ETH_Speed_100M;ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;//ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;/* Configure ETHERNET */printf("Before init...\r\n");Value = ETH_Init(Ð_InitStructure, PHY_ADDRESS);printf("After init... Value: %x\r\n", Value);/* Initialize Tx Descriptors list: Chain Mode */ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);/* Initialize Rx Descriptors list: Chain Mode */ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);/* Enable MAC and DMA transmission and reception */ETH_Start();/* uIP stack main loop */uIPMain();/* Infinite loop */while (1){}}/*** @brief Configures the clock* @param None* @retval None*/void RCC_Configuration(void){RCC_ClocksTypeDef RCC_ClockFreq;/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus != ERROR){/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/****************************************************************//* HSE=25MHz, HCLK=72MHz, PCLK2=72MHz, PCLK1=36MHz *//****************************************************************//* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* ADCCLK = PCLK2/4 */RCC_ADCCLKConfig(RCC_PCLK2_Div6);/* Configure PLLs *********************************************************//* PPL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */RCC_PREDIV2Config(RCC_PREDIV2_Div5);RCC_PLL2Config(RCC_PLL2Mul_8);/* Enable PLL2 */RCC_PLL2Cmd(ENABLE);/* Wait till PLL2 is ready */while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET){}/* PPL1 configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while (RCC_GetSYSCLKSource() != 0x08){}}RCC_GetClocksFreq(&RCC_ClockFreq);/* Enable USART1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/* Enable GPIOs clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);/* Enable ADC1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);}/*** @brief Configures the different GPIO ports.* @param None* @retval None*/void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* ETHERNET pins configuration *//* AF Output Push Pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/* Input (Reset Value) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);}/*** @brief Configures the ADC.* @param None* @retval None*/void ADC_Configuration(void){ADC_InitTypeDef ADC_InitStructure;/* ADC1 Configuration ------------------------------------------------------*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel4 configuration */ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_13Cycles5);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* Start ADC1 Software Conversion */ADC_SoftwareStartConvCmd(ADC1, ENABLE);}/*** @brief Configures the nested vectored interrupt controller.* @param None* @retval None*/void NVIC_Configuration(void){/* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/void assert_failed(uint8_t* file, uint32_t line){/* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/*** @}*//******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/