关于以太网这个,原来真是费事,先是下载LWIP.然后开始对着去写ETH驱动,也没ETH库,都快骂ST不厚道了,然后突然发现一个神奇的网址,原来是我自己眼瞎.ST本身提供很好地库.地址是:
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257906
当然,如果你有更好的,不必沿用这个库,主要是LWIP比较流行,也比较节省RAM,特别是这么紧张的片内RAM,真是弥足珍贵啊.需要移植的文件只有一个,就是stm32f4x7_eth_bsp.c,还有他对应的头文件,其他,INCLUDE上就没什么问题了.
然而,这个文件却其实只需要移植三个函数,第一个是初始化,第二个是中断处理,第三个时间,时间可以从RTC拿,也可以直接来设置,然后中断就处理数据,按照他的example,复制过来也可以,接着就是配置IO,网口工作模式有两个,一个是RMII,一个是MII,MII呢,比较占IO,RMII比较省IO,性能是一样的.下图是RMII的图:
因为RMII/MII协议是标准的,所以非常好搞定,另外有函数ETH_WritePHYRegister,是写DP83848的寄存器,ST评估板也是这个芯片,所以,直接用就可以了.但是,官方Demo并不能直接编译看结果,因为我们并没有包含官方EVAL的头文件,所以把USE_LCD去掉,把STMEVAL LED操作也去掉,可以编译通过,但是ADC也是没法使用的,所以,ADC通道要换一下.原始函数:
static void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable ADC3 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); /* Configure ADC Channel 7 as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOF, &GPIO_InitStructure); /* ADC Common Init */ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); /* ADC3 Configuration ------------------------------------------------------*/ ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC3, &ADC_InitStructure); /* ADC3 Regular Channel Config */ ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 1, ADC_SampleTime_56Cycles); /* Enable ADC3 */ ADC_Cmd(ADC3, ENABLE); /* ADC3 regular Software Start Conv */ ADC_SoftwareStartConv(ADC3); }
修改后:
static void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable ADC3 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); /* Configure ADC Channel 7 as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC, &GPIO_InitStructure); /* ADC Common Init */ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); /* ADC3 Configuration ------------------------------------------------------*/ ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC3, &ADC_InitStructure); /* ADC3 Regular Channel Config */ ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 1, ADC_SampleTime_56Cycles); /* Enable ADC3 */ ADC_Cmd(ADC3, ENABLE); /* ADC3 regular Software Start Conv */ ADC_SoftwareStartConv(ADC3); }
千万不要因为ADC占用网口IO哦,不然就没法做了.然后编译时候,加上USE_DHCP,就可以通过路由获取到板子的IP.
然后就可以Ping试验.与破的ENC28J60不是一个等级的.
访问Web测试:
看MAP文件,我们就做个以太网,用了36K的RAM,对于以太网来说呢,是很节省的,但是对于片内192K的RAM来说,好浪费,另外,如果加入USB,Audio Buffer,DCMI,那192根本就不够玩啊.
============================================================================== Code (inc. data) RO Data RW Data ZI Data Debug 36010 1656 53138 320 37144 607283 Grand Totals 36010 1656 53138 88 37144 607283 ELF Image Totals (compressed) 36010 1656 53138 88 0 0 ROM Totals ============================================================================== Total RO Size (Code + RO Data) 89148 ( 87.06kB) Total RW Size (RW Data + ZI Data) 37464 ( 36.59kB) Total ROM Size (Code + RO Data + RW Data) 89236 ( 87.14kB) ==============================================================================
根据惯例,程序应提供下载:DP83848以太网测试