这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
lan_http实验_网页服务器 [2020/07/09 09:27] zgf |
lan_http实验_网页服务器 [2022/03/22 10:23] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-07-09 | gingko | 初次建立 | | | V1.0 | 2020-07-09 | gingko | 初次建立 | | ||
行 16: | 行 15: | ||
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
- | - iCore4 双核心板。 | + | - iCore4 双核心板[[https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22598974120.15.5923532fsFrHiE&id=551864196684|点击购买]]。 |
- | - JLINK(或相同功能)仿真器。 | + | - JLINK(或相同功能)仿真器[[https://item.taobao.com/item.htm?id=554869837940|点击购买]]。 |
- Micro USB线缆。 | - Micro USB线缆。 | ||
- 网线。 | - 网线。 | ||
行 36: | 行 35: | ||
* BSD API提供了基于open-read-write-close模型的UNIX标准API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。 | * BSD API提供了基于open-read-write-close模型的UNIX标准API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。 | ||
* 其主要特性如下: | * 其主要特性如下: | ||
- | * (1) 支持多网络接口下的IP转发; | + | - 支持多网络接口下的IP转发; |
- | * (2) 支持ICMP协议; | + | - 支持ICMP协议; |
- | * (3) 包括实验性扩展的UDP(用户数据报协议); | + | - 包括实验性扩展的UDP(用户数据报协议); |
- | * (4) 包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议); | + | - 包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议); |
- | * (5) 提供专门的内部回调接口(Raw API),用于提高应用程序性能; | + | - 提供专门的内部回调接口(Raw API),用于提高应用程序性能; |
- | * (6) 可选择的Berkeley接口API (在多线程情况下使用) ; | + | - 可选择的Berkeley接口API (在多线程情况下使用) ; |
- | * (7) 在最新的版本中支持ppp; | + | - 在最新的版本中支持ppp; |
- | * (8) 新版本中增加了的IP fragment的支持; | + | - 新版本中增加了的IP fragment的支持; |
- | * (9) 支持DHCP协议,动态分配ip地址。 | + | - 支持DHCP协议,动态分配ip地址。 |
=== 2、HTTP简介 === | === 2、HTTP简介 === | ||
行 60: | 行 59: | ||
* LAN8720A是低功耗的10/100M以太网PHY层芯片,I/O引脚电压符合IEEE802.3-2005标准,支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/100BASE-TX全双工传输模块,支持10Mbps和100Mbps。 | * LAN8720A是低功耗的10/100M以太网PHY层芯片,I/O引脚电压符合IEEE802.3-2005标准,支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/100BASE-TX全双工传输模块,支持10Mbps和100Mbps。 | ||
* LAN8720A可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持HPAuto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。LAN8720A的主要特点如下: | * LAN8720A可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持HPAuto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。LAN8720A的主要特点如下: | ||
- | * 高性能的10/100M以太网传输模块 | + | * 高性能的10/100M以太网传输模块 |
- | * 支持RMII接口以减少引脚数 | + | * 支持RMII接口以减少引脚数 |
- | * 支持全双工和半双工模式 | + | * 支持全双工和半双工模式 |
- | * 两个状态LED输出 | + | * 两个状态LED输出 |
- | * 可以使用25M晶振以降低成本 | + | * 可以使用25M晶振以降低成本 |
- | * 支持自协商模式 | + | * 支持自协商模式 |
- | * 支持HPAuto-MDIX自动翻转功能 | + | * 支持HPAuto-MDIX自动翻转功能 |
- | * 支持SMI串行管理接口 | + | * 支持SMI串行管理接口 |
- | * 支持MAC接口 | + | * 支持MAC接口 |
- | * LAN8720A功能框图如下图所示: | + | * LAN8720A功能框图如下图所示: |
{{ :icore4:icore4_arm_hal_23_1.png?direct |}} | {{ :icore4:icore4_arm_hal_23_1.png?direct |}} | ||
=== 4、原理图 === | === 4、原理图 === | ||
行 81: | 行 80: | ||
int main(void) | int main(void) | ||
{ | { | ||
- | system_clock.initialize(); //系统时钟初始化 | + | system_clock.initialize(); //系统时钟初始化 |
led.initialize(); //LED初始化 | led.initialize(); //LED初始化 | ||
adc.initialize(); //ADC初始化 | adc.initialize(); //ADC初始化 | ||
- | delay.initialize(216); //延时初始化 | + | delay.initialize(216); //延时初始化 |
- | my_malloc.initialize(SRAMIN); //动态内存初始化 | + | my_malloc.initialize(SRAMIN); //动态内存初始化 |
- | usart6.initialize(115200); //串口波特设置 | + | usart6.initialize(115200); //串口波特设置 |
- | usart6.printf("\033[1;32;40m"); //设置字体终端为绿色 | + | usart6.printf("\033[1;32;40m"); //设置字体终端为绿色 |
usart6.printf("\r\nHello, I am iCore4!\r\n\r\n"); //串口信息输出 | usart6.printf("\r\nHello, I am iCore4!\r\n\r\n"); //串口信息输出 | ||
OSInit(); //UCOS初始化 | OSInit(); //UCOS初始化 | ||
| | ||
- | while(lwip.initialize()) //lwip初始化 | + | while(lwip.initialize()) //lwip初始化 |
{ | { | ||
LED_RED_ON; | LED_RED_ON; | ||
usart6.printf("\r\nETH initialize error!\r\n\r\n");//ETH初始化失败 | usart6.printf("\r\nETH initialize error!\r\n\r\n");//ETH初始化失败 | ||
} | } | ||
- | web.initialize(); //modbus_tcp初始化 | + | web.initialize(); //modbus_tcp初始化 |
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); | OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); | ||
- | OSStart(); //开启UCOS | + | OSStart(); //开启UCOS |
} | } | ||
行 110: | 行 109: | ||
{ | { | ||
mymemset(mallco_dev.memmap[memx],0,memtblsize[memx]*4); //内存状态表数据清零 | mymemset(mallco_dev.memmap[memx],0,memtblsize[memx]*4); //内存状态表数据清零 | ||
- | mallco_dev.memrdy[memx]=1; //内存管理初始化OK | + | mallco_dev.memrdy[memx]=1; //内存管理初始化OK |
} | } | ||
行 125: | 行 124: | ||
OS_CPU_SR cpu_sr; | OS_CPU_SR cpu_sr; | ||
struct netif *Netif_Init_Flag; //调用netif_add()函数时的返回值,用于判断网络初始化是否成功 | struct netif *Netif_Init_Flag; //调用netif_add()函数时的返回值,用于判断网络初始化是否成功 | ||
- | struct ip_addr ipaddr; //ip地址 | + | struct ip_addr ipaddr; //ip地址 |
- | struct ip_addr netmask; //子网掩码 | + | struct ip_addr netmask; //子网掩码 |
- | struct ip_addr gw; //默认网关 | + | struct ip_addr gw; //默认网关 |
- | if(lan8720.memory_malloc())return 1; //内存申请失败 | + | if(lan8720.memory_malloc())return 1;//内存申请失败 |
- | if(lwip_comm_mem_malloc())return 1; //内存申请失败 | + | if(lwip_comm_mem_malloc())return 1; //内存申请失败 |
- | if(lan8720.initialize())return 2; //初始化LAN8720失败 | + | if(lan8720.initialize())return 2; //初始化LAN8720失败 |
- | tcpip_init(NULL,NULL); //初始化tcp ip内核,该函数里面会创建tcpip_thread内核任务 | + | tcpip_init(NULL,NULL); //初始化tcp ip内核,该函数里面会创建tcpip_thread内核任务 |
lwip_comm_default_ip_set(&lwipdev); //设置默认IP等信息 | lwip_comm_default_ip_set(&lwipdev); //设置默认IP等信息 | ||
- | #if LWIP_DHCP //使用动态IP | + | #if LWIP_DHCP //使用动态IP |
ipaddr.addr = 0; | ipaddr.addr = 0; | ||
netmask.addr = 0; | netmask.addr = 0; | ||
行 141: | 行 140: | ||
IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]); | IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]); | ||
IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); | IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); | ||
- | usart6.printf("网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]); | + | usart6.printf("网卡en的MAC地址为:.......%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]); |
- | usart6.printf("静态IP地址........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); | + | usart6.printf("静态IP地址...%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); |
- | usart6.printf("子网掩码..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]); | + | usart6.printf("子网掩码...%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]); |
- | usart6.printf("默认网关..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); | + | usart6.printf("默认网关...%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); |
#endif Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,&tcpip_input);//向网卡列表中添加一个网口 | #endif Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,&tcpip_input);//向网卡列表中添加一个网口 | ||
#if LWIP_DNS | #if LWIP_DNS | ||
行 167: | 行 166: | ||
OS_CPU_SR cpu_sr; | OS_CPU_SR cpu_sr; | ||
| | ||
- | OS_ENTER_CRITICAL(); //关中断 | + | OS_ENTER_CRITICAL(); //关中断 |
- | res = OSTaskCreate(http_server_netconn_thread,(void*)0,(OS_STK*)&WEB_TASK_STK[WEB_STK_SIZE-1],WEB_PRIO); //创建TCP服务器线程 | + | res = OSTaskCreate(http_server_netconn_thread,(void*)0,(OS_STK*)&WEB_TASK_STK[WEB_STK_SIZE-1],WEB_PRIO); //创建TCP服务器线程 |
OS_EXIT_CRITICAL(); //开中断 | OS_EXIT_CRITICAL(); //开中断 | ||
| | ||
行 201: | 行 200: | ||
return; | return; | ||
} | } | ||
- | listen(httpsock, 5); //在socket上进行监听 | + | listen(httpsock, 5); //在socket上进行监听 |
size = sizeof(remotehost); | size = sizeof(remotehost); | ||
while(1) | while(1) | ||
行 208: | 行 207: | ||
| | ||
if(httpconn >= 0){ | if(httpconn >= 0){ | ||
- | http_server_serve(httpconn); //处理连接 | + | http_server_serve(httpconn); //处理连接 |
}else{ | }else{ | ||
close(httpconn); | close(httpconn); | ||
行 226: | 行 225: | ||
unsigned short int send_len = 0; | unsigned short int send_len = 0; | ||
char* name; //获取方法请求文件名 | char* name; //获取方法请求文件名 | ||
- | ret = read(httpcon, recv_buffer, 1500); //提取http数据请求 | + | ret = read(httpcon, recv_buffer, 1500); //提取http数据请求 |
st_http_request *http_request; | st_http_request *http_request; | ||
memset(tx_buf,0x00,MAX_URI_SIZE); | memset(tx_buf,0x00,MAX_URI_SIZE); | ||
行 295: | 行 294: | ||
==== 附录: ==== | ==== 附录: ==== | ||
- | 1、打开控制面板—→网络和Internet—→网络和共享中心—→更改适配器设置—→以太网—→属性 | + | 1、打开控制面板—→网络和Internet—→网络和共享中心—→更改适配器设置—→以太网—→属性。 |
{{ :icore4:icore4_arm_hal_23_4.png?direct |}} | {{ :icore4:icore4_arm_hal_23_4.png?direct |}} | ||
- | 2、Internet协议版本4选择使用下面的IP地址(如下图所示),然后更改IP地址和默认网关 | + | 2、Internet协议版本4选择使用下面的IP地址(如下图所示),然后更改IP地址和默认网关。 |
{{ :icore4:icore4_arm_hal_23_5.png?direct |}} | {{ :icore4:icore4_arm_hal_23_5.png?direct |}} | ||