银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-08 | gingko | 初次建立 |
1、主函数
int main(void) { system_clock.initialize(); //系统时钟初始化 led.initialize(); //LED初始化 adc.initialize(); //ADC初始化 delay.initialize(216); //延时初始化和 my_malloc.initialize(SRAMIN); //动态内存初始化 usart6.initialize(115200); //串口波特设置 usart6.printf("\033[1;32;40m"); //设置终端字体为绿色 usart6.printf("\r\nHello, I am iCore4!\r\n\r\n"); //串口信息输出 OSInit(); //UCOS初始化 while(lwip.initialize()) //lwip初始化 { LED_RED_ON; usart6.printf("\r\nETH initialize error!\r\n\r\n");//ETH3初始化失败 } tcp.initialize(); OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); OSStart(); //开启UCOS }
2、start_task函数
void start_task(void *pdata) { OS_CPU_SR cpu_sr; pdata = pdata ; OSStatInit(); //初始化任务统计 OS_ENTER_CRITICAL(); //关中断 #if LWIP_DHCP lwip_comm_dhcp_creat(); //创建DHCP任务 #if LWIP_DNS my_dns.initialize(); //创建DNS任务 #endif #endif //创建LED任务 OSTaskCreate(led_task,(void*)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO); //显示任务 OSTaskCreate(display_task,(void*)0,(OS_STK*)&DISPLAY_TASK_STK[DISPLAY_STK_SIZE-1],DISPLAY_TASK_PRIO); //挂起estart_task任务 OSTaskSuspend(OS_PRIO_SELF); //开中断 OS_EXIT_CRITICAL(); }
3、LwIP初始化
u8 lwip_comm_init(void) { OS_CPU_SR cpu_sr; struct netif *Netif_Init_Flag; //调用netif_add()函数时的返回值,用于判断网络初始化是否成功 struct ip_addr ipaddr; //ip地址 struct ip_addr netmask; //子网掩码 struct ip_addr gw; //默认网关 if(lan8720.memory_malloc())return 1; //内存申请失败 if(lwip_comm_mem_malloc())return 1; //内存申请失败 if(lan8720.initialize())return 2; //初始化LAN8720失败 tcpip_init(NULL,NULL); //初始化tcp ip内核,该函数里面会创建tcpip_thread内核任务 lwip_comm_default_ip_set(&lwipdev); //设置默认IP等信息 #if LWIP_DHCP //使用动态IP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; #else //使用静态IP IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[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]); 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("子网掩码..........%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]); #endif //向网卡列表中添加一个网口 Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,&tcpip_input); #if LWIP_DNS dns_init(); #endif if(Netif_Init_Flag==NULL)return 3; //网卡添加失败 else //网口添加成功后,设置netif为默认值,并且打开netif网口 { netif_set_default(&lwip_netif); //设置netif为默认网口 netif_set_up(&lwip_netif); //打开netif网口 } return 0; //操作OK. }
4、Tcp server初始化
static INT8U tcp_server_init(void)//创建TCP服务器线程 { INT8U res; OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL(); //关中断 //创建TCP服务器线程 res = OSTaskCreate(tcp_server_thread,(void*)0,(OS_STK*)&TCPSERVER_TASK_STK[TCPSERVER_STK_SIZE-1],TCPSERVER_PRIO); OS_EXIT_CRITICAL(); //开中断 return res;//返回值:0 TCP服务器创建成功 }
5、tcp服务器任务
static void tcp_server_thread(void *arg)//tcp服务器任务 { struct netconn *conn, *newconn; err_t err,recv_err; unsigned char remot_addr[4]; ip_addr_t ipaddr; unsigned short port; struct netbuf *recvbuf; LWIP_UNUSED_ARG(arg); conn = netconn_new(NETCONN_TCP); //创建一个TCP链接 netconn_bind(conn,IP_ADDR_ANY,TCP_SERVER_PORT); //绑定端口 60000 号端口 netconn_listen(conn); //进入监听模式 while(1){ err = netconn_accept(conn,&newconn); //接收连接请求 if (err == ERR_OK) //处理新连接的数据 { newconn->recv_timeout = 10; netconn_getaddr(newconn,&ipaddr,&port,0); //获取远端IP地址和端口号 remot_addr[3] = (uint8_t)(ipaddr.addr >> 24); remot_addr[2] = (uint8_t)(ipaddr.addr >> 16); remot_addr[1] = (uint8_t)(ipaddr.addr >> 8); remot_addr[0] = (uint8_t)(ipaddr.addr); usart6.printf("pc ip : %d.%d.%d.%dserver,lacol port:%d\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3],port); while(1) { recv_err = netconn_recv(newconn,&recvbuf); if((recv_err == ERR_OK)||(recvbuf != NULL)) //接收到数据 { //将接受到的数据原封不动的再发出去 recv_err = netconn_write(newconn ,recvbuf->p->payload,recvbuf->p->tot_len,NETCONN_NOCOPY); netbuf_delete(recvbuf); }else if(recv_err == ERR_CLSD){ //关闭连接 netconn_close(newconn); netconn_delete(newconn); usart6.printf("lacol ip :%d.%d.%d.%d close connect\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]); break; }else if(recv_err == ERR_MEM) //memory error, try again later { OSTimeDlyHMSM(0,0,0,5); //延时5ms }else OSTimeDlyHMSM(0,0,0,5); //延时5ms } }else OSTimeDlyHMSM(0,0,0,5); //延时5ms } }