Uip + Stm32移植問題總結
阿新 • • 發佈:2019-02-15
#include "stm32f10x.h" #include "stdio.h" #include "string.h" #include "uip.h" #include "uip_arp.h" #include "tapdev.h" #include "timer.h" #include "ENC28J60.h" #include "SPI.h" #define PRINTF_ON 1 #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) #ifndef NULL #define NULL (void *)0 #endif /* NULL */ static unsigned char mymac[6] = {0x04,0x02,0x35,0x00,0x00,0x01}; void RCC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); int main(void) { int i; uip_ipaddr_t ipaddr; struct timer periodic_timer, arp_timer; RCC_Configuration(); GPIO_Configuration(); USART_Configuration(); SPInet_Init(); timer_set(&periodic_timer, CLOCK_SECOND / 2); timer_set(&arp_timer, CLOCK_SECOND * 10); SysTick_Config(72000); //配置滴答計時器 //乙太網控制器驅動初始化 tapdev_init(mymac); //Uip 協議棧初始化 uip_init(); uip_ipaddr(ipaddr, 192, 168, 1, 15); //配置Ip uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, 192, 168, 1, 1); //配置閘道器 uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, 255, 255, 255, 0); //配置子網掩碼 uip_setnetmask(ipaddr); while(1){ uip_len = tapdev_read(); //從網絡卡讀取資料 if(uip_len > 0) { //如果資料存在則按協議處理 if(BUF->type == htons(UIP_ETHTYPE_IP)) { //如果收到的是IP資料,呼叫uip_input()處理 uip_arp_ipin(); uip_input(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); tapdev_send(); } }else if(BUF->type == htons(UIP_ETHTYPE_ARP)){ //如果收到的是ARP資料,呼叫uip_arp_arpin處理 uip_arp_arpin(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { tapdev_send(); } } }else if(timer_expired(&periodic_timer)){ //檢視0.5s是否到了,呼叫uip_periodic處理TCP超時程式 timer_reset(&periodic_timer); for(i = 0; i < UIP_CONNS; i++) { uip_periodic(i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); tapdev_send(); } } for(i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic(i); //處理udp超時程式 /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); tapdev_send(); } } /* Call the ARP timer function every 10 seconds. */ //10s到了就處理ARP if(timer_expired(&arp_timer)) { timer_reset(&arp_timer); uip_arp_timer(); } } } } /*******************************Stm32 Set***************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); } void RCC_Configuration(void) { /* 定義列舉型別變數 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 復位系統時鐘設定*/ RCC_DeInit(); /* 開啟HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振並穩定*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判斷HSE起是否振成功,是則進入if()內部 */ if(HSEStartUpStatus == SUCCESS) { /* 選擇HCLK(AHB)時鐘源為SYSCLK 1分頻 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 選擇PCLK2時鐘源為 HCLK(AHB) 1分頻 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 選擇PCLK1時鐘源為 HCLK(AHB) 2分頻 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 設定FLASH延時週期數為2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能FLASH預取快取 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 選擇鎖相環(PLL)時鐘源為HSE 1分頻,倍頻數為9,則PLL輸出頻率為 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL輸出穩定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 選擇SYSCLK時鐘源為PLL */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成為SYSCLK時鐘源 */ while(RCC_GetSYSCLKSource() != 0x08); } /* 開啟APB2總線上的GPIOA時鐘*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE); } void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_ClockInitTypeDef USART_ClockInitStructure; USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART1 , &USART_ClockInitStructure); 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_Rx|USART_Mode_Tx; USART_Init(USART1,&USART_InitStructure); USART_Cmd(USART1,ENABLE); } #if PRINTF_ON int fputc(int ch,FILE *f) { USART_SendData(USART1,(u8) ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); return ch; } #endif