找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4320|回復(fù): 3
收起左側(cè)

STM32 uIP1.0網(wǎng)絡(luò)例程源碼

[復(fù)制鏈接]
ID:295864 發(fā)表于 2018-5-12 19:25 | 顯示全部樓層 |閱讀模式
STM野火版學(xué)習(xí)資料

單片機(jī)源程序如下:
  1. /****************************************************************************
  2. * Copyright (C), 2010 奮斗嵌入式工作室
  3. * 本例程在奮斗版STM32開(kāi)發(fā)板V3上調(diào)試通過(guò)           
  4. * 文件名: main.c
  5. * 內(nèi)容簡(jiǎn)述:
  6. *                本例程移植uIP-1.0協(xié)議棧,演示開(kāi)發(fā)板和PC間的TCP通信。自定義了一個(gè)簡(jiǎn)單的應(yīng)用層
  7. *        通信協(xié)議。本例程實(shí)現(xiàn)的功能有:
  8. *                (1)通過(guò)PC機(jī)控制板子上的LED;
  9. *                (2)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Web服務(wù)器。
  10. *            奮斗版STM32開(kāi)發(fā)板選用的網(wǎng)卡芯片ENC28J60,10M帶寬。
  11. *                本例程設(shè)置的缺省IP地址是 192.168.1.15,默認(rèn)的TCP服務(wù)器監(jiān)聽(tīng)端口是1200, WEB服務(wù)器監(jiān)聽(tīng)端口80,
  12.             UDP服務(wù)器監(jiān)聽(tīng)端口2000。
  13. *                開(kāi)發(fā)板工作在TCP服務(wù)器模式。PC機(jī)工作在TCP客戶端模式。
  14. *                 PC機(jī)上需要運(yùn)行網(wǎng)絡(luò)調(diào)試助手軟件。
  15. *        用戶可以做如下測(cè)試:
  16. *        (1)ping 試驗(yàn) (ICMP)
  17. *                點(diǎn)擊windows 開(kāi)始-運(yùn)行,執(zhí)行cmd命令,然后在dos窗口輸入 ping 192.168.1.15
  18. *                應(yīng)該看到如下結(jié)果:
  19. *                        Reply from 192.168.1.15: bytes=32 time<1ms TTL=128
  20. *                        Reply from 192.168.1.15: bytes=32 time<1ms TTL=128
  21. *                        Reply from 192.168.1.15: bytes=32 time<1ms TTL=128
  22. *                        Reply from 192.168.1.15: bytes=32 time<1ms TTL=128
  23. *
  24. *        (2)PC機(jī)的TCP客戶端控制開(kāi)發(fā)板上的LED試驗(yàn)  (TCP服務(wù)器)
  25. *                運(yùn)行網(wǎng)絡(luò)調(diào)試助手軟件,端口選擇1200,服務(wù)器IP地址選擇192.168.1.15, 協(xié)議類型選擇TCP客戶端,
  26.     點(diǎn)擊連接按鈕,在命令輸入窗口輸入控制LED的命令字符串,然后點(diǎn)擊發(fā)送,開(kāi)發(fā)板上對(duì)應(yīng)的LED燈會(huì)發(fā)生
  27.         變化。
  28. *                命令代碼如下: (末尾無(wú)0x00和回車字符)
  29. *                ledon 1     ----- 點(diǎn)亮LED1
  30. *                ledoff 1    ----- 關(guān)閉LED1
  31. *                ledon 2     ----- 點(diǎn)亮LED2
  32. *                ledoff 2    ----- 關(guān)閉LED2
  33. *                ledon 3     ----- 點(diǎn)亮LED3
  34. *                ledoff 3    ----- 關(guān)閉LED3
  35. *
  36.     (3)WEB網(wǎng)頁(yè)控制開(kāi)發(fā)板上的LED試驗(yàn)  (WEB服務(wù)器)
  37.                  打開(kāi)IE瀏覽器,在地址欄輸入http://192.168.1.15  可以看到基于uIP的Web測(cè)試頁(yè)面
  38.              在對(duì)話框輸入1-3,點(diǎn)確定按鈕,可以控制相應(yīng)的LED點(diǎn)亮。
  39.                  網(wǎng)頁(yè)保存在httpd-fsdata.c的data_index_html數(shù)組里, 是通過(guò)amo的編程小工具集合轉(zhuǎn)換的,可以在奮斗論壇下載到。
  40.         (4)UDP服務(wù)器實(shí)驗(yàn)
  41.                  本地UDP端口默認(rèn)是2000, 遠(yuǎn)端UDP可以直接連接本地端口,并進(jìn)行通信
  42.                  命令代碼如下: (末尾無(wú)0x00和回車字符)
  43.                  getname     ------返回板子的信息
  44. *                 ledon 1     ----- 點(diǎn)亮LED1
  45. *                 ledoff 1    ----- 關(guān)閉LED1
  46. *                 ledon 2     ----- 點(diǎn)亮LED2
  47. *                 ledoff 2    ----- 關(guān)閉LED2
  48. *                 ledon 3     ----- 點(diǎn)亮LED3
  49. *                 ledoff 3    ----- 關(guān)閉LED3
  50. *
  51. * 文件歷史:
  52. * 版本號(hào)  日期       作者    說(shuō)明
  53. *
  54. */

  55. #include "stm32f10x.h"
  56. #include "stm32f10x_usart.h"
  57. #include "stm32f10x_exti.h"
  58. #include "misc.h"
  59. #include <stdio.h>         
  60. #include "systick.h"


  61. #include "uip.h"
  62. #include "uip_arp.h"
  63. #include "tapdev.h"
  64. #include "timer.h"
  65. #include "enc28j60.h"       
  66. #include  <stdarg.h>
  67. #define BUF ((struct uip_eth_hdr *)&uip_buf[0])       
  68. #define ETH_rec_f GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)          //ENC28J60接收幀完成中斷腳


  69. void InitNet(void);       
  70. void UipPro(void);
  71. void Delay(vu32 nCount);
  72. void GPIO_Configuration(void);
  73. void RCC_Configuration(void);
  74. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
  75. char *itoa(int value, char *string, int radix);
  76. void eth_poll(void);

  77. unsigned short net_time05=0;
  78. unsigned short net_time10=0;
  79. unsigned char net_timeover05=0;
  80. unsigned char net_timeover10=0;
  81. unsigned char ETH_INT=0;


  82. extern void SPI1_Init(void);
  83. /****************************************************************************
  84. * 名    稱:void NVIC_Configuration(void)
  85. * 功    能:中斷源配置
  86. * 入口參數(shù):無(wú)
  87. * 出口參數(shù):無(wú)
  88. * 說(shuō)    明:
  89. * 調(diào)用方法:無(wú)
  90. ****************************************************************************/
  91. void NVIC_Configuration(void)
  92. {
  93.   NVIC_InitTypeDef NVIC_InitStructure;
  94.   EXTI_InitTypeDef EXTI_InitStructure;
  95.   /* Configure one bit for preemption priority */
  96.   /* 優(yōu)先級(jí)組 說(shuō)明了搶占優(yōu)先級(jí)所用的位數(shù),和子優(yōu)先級(jí)所用的位數(shù)   在這里是1, 7 */   
  97.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  98.   
  99.   /* Enable the EXTI2 Interrupt */
  100.   NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                                 //外部中斷2
  101.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;             //搶占優(yōu)先級(jí) 0
  102.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         //子優(yōu)先級(jí)0  
  103.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                 //使能
  104.   NVIC_Init(&NVIC_InitStructure);

  105.   //用于配置AFIO外部中斷配置寄存器AFIO_EXTICR1,用于選擇EXTI2外部中斷的輸入源是PE2。
  106.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);     //外部中斷配置AFIO--ETXI2

  107.   EXTI_InitStructure.EXTI_Line = EXTI_Line1;                                          //PE2 作為鍵盤的行線。檢測(cè)狀態(tài)
  108.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                          //中斷模式
  109.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                  //下降沿觸發(fā)
  110.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  111.   EXTI_Init(&EXTI_InitStructure);
  112. }
  113. /****************************************************************************
  114. * 名    稱:void Usart1_Init(void)
  115. * 功    能:串口1初始化函數(shù)
  116. * 入口參數(shù):無(wú)
  117. * 出口參數(shù):無(wú)
  118. * 說(shuō)    明:
  119. * 調(diào)用方法:無(wú)
  120. ****************************************************************************/
  121. void Usart1_Init(void)
  122. {
  123.   GPIO_InitTypeDef GPIO_InitStructure;
  124.   USART_InitTypeDef USART_InitStructure;

  125.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 , ENABLE);                         //使能串口1時(shí)鐘

  126.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                                  //USART1 TX
  127.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  128.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                     //復(fù)用推挽輸出
  129.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                                     //A端口

  130.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                          //USART1 RX
  131.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                            //復(fù)用開(kāi)漏輸入
  132.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                                  //A端口

  133.   USART_InitStructure.USART_BaudRate = 115200;                                                //速率115200bps
  134.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //數(shù)據(jù)位8位
  135.   USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
  136.   USART_InitStructure.USART_Parity = USART_Parity_No;                                //無(wú)校驗(yàn)位
  137.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //無(wú)硬件流控
  138.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                                        //收發(fā)模式

  139.   /* Configure USART1 */
  140.   USART_Init(USART1, &USART_InitStructure);                                                        //配置串口參數(shù)函數(shù)   
  141.    /* Enable the USART1 */
  142.   USART_Cmd(USART1, ENABLE);       
  143.   
  144. }

  145. /****************************************************************************
  146. * 名    稱:void RCC_Configuration(void)
  147. * 功    能:系統(tǒng)時(shí)鐘配置為72MHZ, 外設(shè)時(shí)鐘配置
  148. * 入口參數(shù):無(wú)
  149. * 出口參數(shù):無(wú)
  150. * 說(shuō)    明:
  151. * 調(diào)用方法:無(wú)
  152. ****************************************************************************/
  153. void RCC_Configuration(void)
  154. {
  155.    SystemInit();
  156.    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO  , ENABLE);  

  157. }
  158. /****************************************************************************
  159. * 名    稱:int main(void)
  160. * 功    能:程序入口
  161. * 入口參數(shù):無(wú)
  162. * 出口參數(shù):無(wú)
  163. * 說(shuō)    明:
  164. * 調(diào)用方法:無(wú)
  165. ****************************************************************************/
  166. int main(void)
  167. {
  168.         RCC_Configuration();                                 //系統(tǒng)時(shí)鐘設(shè)置
  169.         NVIC_Configuration();
  170.         GPIO_Configuration();                //IO口初始化
  171.         Usart1_Init();                       //串口1初始化

  172.         /* 配置systic作為1ms中斷 */
  173.         if (SysTick_Config(72000))                     //時(shí)鐘節(jié)拍中斷時(shí)1ms一次  用于定時(shí)
  174.    {
  175.     /* Capture error */
  176.      while (1);
  177.    }                  
  178.         /* 顯示例程Logo */
  179.     USART_OUT(USART1,"**** (C) COPYRIGHT 2011 奮斗嵌入式開(kāi)發(fā)工作室 *******\r\n");              //向串口1發(fā)送開(kāi)機(jī)字符。
  180.     USART_OUT(USART1,"*                                                 *\r\n");           
  181.     USART_OUT(USART1,"*     奮斗版STM32開(kāi)發(fā)板基于uIP1.0的以太網(wǎng)實(shí)驗(yàn)     *\r\n");  
  182.     USART_OUT(USART1,"*                                                 *\r\n");                     
  183.     USART_OUT(USART1,"*     MCU平臺(tái):STM32F103VET6                       *\r\n");           
  184.     USART_OUT(USART1,"*     以太網(wǎng)硬件:ENC28J60                         *\r\n");                     
  185.     USART_OUT(USART1,"*     固件庫(kù):3.5                                 *\r\n");           
  186.     USART_OUT(USART1,"*     例程版本: 0.2                               *\r\n");  
  187.     USART_OUT(USART1,"*     奮斗STM32店鋪:ourstm.taobao.com            *\r\n");               
  188.     USART_OUT(USART1,"*     奮斗STM32論壇:www.ourstm.net  QQ:9191274  *\r\n");   
  189.     USART_OUT(USART1,"*                                                 *\r\n");                    
  190.     USART_OUT(USART1,"***************************************************\r\n");         
  191.                                
  192.         SPI1_Init();
  193.    
  194.         InitNet();                /* 初始化網(wǎng)絡(luò)設(shè)備以及UIP協(xié)議棧,配置IP地址 */

  195.         /* 創(chuàng)建一個(gè)TCP監(jiān)聽(tīng)端口和http監(jiān)聽(tīng)端口,端口號(hào)為1200,80 */
  196.         uip_listen(HTONS(1200));
  197.         uip_listen(HTONS(80));         
  198.         while (1)
  199.         {       
  200.                 /* 處理uip事件,必須插入到用戶程序的循環(huán)體中 */
  201.                 UipPro();                          //中斷觸發(fā)讀取網(wǎng)絡(luò)接收緩存
  202.                 eth_poll();           //定時(shí)查詢TCP及UDP連接收發(fā)狀態(tài)        ARP表更新, 并響應(yīng)
  203.         }
  204. }
  205. /****************************************************************************
  206. * 名    稱:void eth_poll(void)
  207. * 功    能:定時(shí)查詢TCP連接收發(fā)狀態(tài)        ARP表更新, 并響應(yīng)
  208. * 入口參數(shù):無(wú)
  209. * 出口參數(shù):無(wú)
  210. * 說(shuō)    明:
  211. * 調(diào)用方法:無(wú)
  212. ****************************************************************************/
  213. void eth_poll(void){
  214.         unsigned char i=0;
  215.         if(net_timeover05==1)                        /* 0.5秒定時(shí)器超時(shí) */
  216.         {
  217.                 net_time05=0;
  218.                 net_timeover05=0;                        /* 復(fù)位0.5秒定時(shí)器 */

  219.                 /* 輪流處理每個(gè)TCP連接, UIP_CONNS缺省是10個(gè) */
  220.                 for(i = 0; i < UIP_CONNS; i++)
  221.                 {
  222.                         uip_periodic(i);                /* 處理TCP通信事件 */
  223.                         /*
  224.                                 當(dāng)上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量 uip_len > 0
  225.                                 需要發(fā)送的數(shù)據(jù)在uip_buf, 長(zhǎng)度是uip_len  (這是2個(gè)全局變量)
  226.                         */
  227.                         if(uip_len > 0)
  228.                         {
  229.                                 uip_arp_out();                //加以太網(wǎng)頭結(jié)構(gòu),在主動(dòng)連接時(shí)可能要構(gòu)造ARP請(qǐng)求
  230.                                 tapdev_send();                //發(fā)送數(shù)據(jù)到以太網(wǎng)(設(shè)備驅(qū)動(dòng)程序)
  231.                         }
  232.                 }

  233.         #if UIP_UDP
  234.                 /* 輪流處理每個(gè)UDP連接, UIP_UDP_CONNS缺省是10個(gè) */
  235.                 for(i = 0; i < UIP_UDP_CONNS; i++)
  236.                 {
  237.                         uip_udp_periodic(i);        /*處理UDP通信事件 */
  238.                         /* 如果上面的函數(shù)調(diào)用導(dǎo)致數(shù)據(jù)應(yīng)該被發(fā)送出去,全局變量uip_len設(shè)定值> 0 */
  239.                         if(uip_len > 0)
  240.                         {
  241.                                 uip_arp_out();                //加以太網(wǎng)頭結(jié)構(gòu),在主動(dòng)連接時(shí)可能要構(gòu)造ARP請(qǐng)求
  242.                                 tapdev_send();                //發(fā)送數(shù)據(jù)到以太網(wǎng)(設(shè)備驅(qū)動(dòng)程序)
  243.                         }
  244.                 }
  245.         #endif /* UIP_UDP */

  246.                 /* 每隔10秒調(diào)用1次ARP定時(shí)器函數(shù) 用于定期ARP處理,ARP表10秒更新一次,舊的條目會(huì)被拋棄*/
  247.                 if (net_timeover10==1)
  248.                 {
  249.                         net_time10=0;
  250.                         net_timeover10=0;                /* 復(fù)位10秒定時(shí)器 */
  251.                         uip_arp_timer();
  252.                 }
  253.         }
  254. }
  255. /*******************************************************************************
  256. *        函數(shù)名:UipPro
  257. *        輸  入:
  258. *        輸  出:
  259. *        功能說(shuō)明:中斷觸發(fā)讀取網(wǎng)絡(luò)接收緩存
  260. ********************************************************************/
  261. void UipPro(void)
  262. {
  263.         if(ETH_INT==1){                                        //當(dāng)網(wǎng)絡(luò)接收到數(shù)據(jù)時(shí),會(huì)產(chǎn)生中斷
  264.                 rep:;
  265.                 ETH_INT=0;
  266.                 uip_len = tapdev_read();        //從網(wǎng)絡(luò)設(shè)備讀取一個(gè)IP包,返回?cái)?shù)據(jù)長(zhǎng)度
  267.                 if(uip_len > 0)                            //收到數(shù)據(jù)
  268.                 {
  269.                         /* 處理IP數(shù)據(jù)包(只有校驗(yàn)通過(guò)的IP包才會(huì)被接收) */
  270.                         if(BUF->type == htons(UIP_ETHTYPE_IP))   //是IP包嗎?
  271.                         {
  272.                                 uip_arp_ipin();                   //去除以太網(wǎng)頭結(jié)構(gòu),更新ARP表
  273.                                 uip_input();                   //IP包處理
  274.                                 /*
  275.                                         當(dāng)上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量 uip_len > 0
  276.                                         需要發(fā)送的數(shù)據(jù)在uip_buf, 長(zhǎng)度是uip_len  (這是2個(gè)全局變量)
  277.                                 */
  278.                                 if (uip_len > 0)                //有帶外回應(yīng)數(shù)據(jù)
  279.                                 {
  280.                                         uip_arp_out();                //加以太網(wǎng)頭結(jié)構(gòu),在主動(dòng)連接時(shí)可能要構(gòu)造ARP請(qǐng)求
  281.                                         tapdev_send();                //發(fā)送數(shù)據(jù)到以太網(wǎng)(設(shè)備驅(qū)動(dòng)程序)
  282.                                 }
  283.                         }
  284.                         /* 處理arp報(bào)文 */
  285.                         else if (BUF->type == htons(UIP_ETHTYPE_ARP))        //是ARP請(qǐng)求包
  286.                         {
  287.                                 uip_arp_arpin();                //如是是ARP回應(yīng),更新ARP表;如果是請(qǐng)求,構(gòu)造回應(yīng)數(shù)據(jù)包
  288.                                 /*
  289.                                         當(dāng)上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量 uip_len > 0
  290.                                         需要發(fā)送的數(shù)據(jù)在uip_buf, 長(zhǎng)度是uip_len  (這是2個(gè)全局變量)
  291.                                 */
  292.                                 if (uip_len > 0)                //是ARP請(qǐng)求,要發(fā)送回應(yīng)
  293.                                 {
  294.                                         tapdev_send();                //發(fā)ARP回應(yīng)到以太網(wǎng)上
  295.                                 }
  296.                         }
  297.                 }
  298.           }
  299.           else{                           //防止大包造成接收死機(jī),當(dāng)沒(méi)有產(chǎn)生中斷,而ENC28J60中斷信號(hào)始終為低說(shuō)明接收死機(jī)
  300.             if(ETH_rec_f==0) goto rep;        
  301.           }
  302. }
  303. /*******************************************************************************
  304. *        函數(shù)名:InitNet
  305. *        輸  入:
  306. *        輸  出:
  307. *        功能說(shuō)明:初始化網(wǎng)絡(luò)硬件、UIP協(xié)議棧、配置本機(jī)IP地址
  308. ************************************************************/
  309. void InitNet(void)
  310. {
  311.         uip_ipaddr_t ipaddr;
  312.         tapdev_init();                                      //ENC28J60初始化
  313.        
  314.         USART_OUT(USART1,"uip_init\n\r");
  315.         uip_init();                                                                 //UIP協(xié)議棧初始化

  316.         USART_OUT(USART1,"uip ip address : 192,168,1,15\r\n");
  317.         uip_ipaddr(ipaddr, 192,168,1,15);                 //設(shè)置IP地址
  318.         uip_sethostaddr(ipaddr);

  319.         USART_OUT(USART1,"uip route address : 192,168,1,1\r\n");
  320.         uip_ipaddr(ipaddr, 192,168,1,1);                 //設(shè)置默認(rèn)路由器IP地址
  321.         uip_setdraddr(ipaddr);

  322.         USART_OUT(USART1,"uip net mask : 255,255,255,0\r\n");
  323.         uip_ipaddr(ipaddr, 255,255,255,0);                 //設(shè)置網(wǎng)絡(luò)掩碼
  324.         uip_setnetmask(ipaddr);

  325. }
  326. /****************************************************************************
  327. * 名    稱:void GPIO_Configuration(void)
  328. * 功    能:通用IO口配置
  329. * 入口參數(shù):無(wú)
  330. * 出口參數(shù):無(wú)
  331. * 說(shuō)    明:
  332. * 調(diào)用方法:
  333. ****************************************************************************/  
  334. void GPIO_Configuration(void)
  335. {
  336.   
  337.   GPIO_InitTypeDef GPIO_InitStructure;
  338.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
  339.                          RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
  340.                          RCC_APB2Periph_GPIOE, ENABLE);
  341.          
  342.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                     //LED1控制
  343.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  344.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  345.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                         

  346.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;                 //LED2, LED3控制
  347.   GPIO_Init(GPIOD, &GPIO_InitStructure);

  348.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                         //SST25VF016B SPI片選
  349.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  350.   
  351.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_7;                 //PB12---VS1003 SPI片選(V2.1)
  352.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //PB7---觸摸屏芯片XPT2046 SPI 片選
  353.   
  354.   /* 禁止SPI1總線上的其他設(shè)備 */
  355.   GPIO_SetBits(GPIOB, GPIO_Pin_7);                                                     //觸摸屏芯片XPT2046 SPI 片選禁止  
  356.   GPIO_SetBits(GPIOB, GPIO_Pin_12);                                                     //VS1003 SPI片選(V2.1)禁止
  357.   GPIO_SetBits(GPIOC, GPIO_Pin_4);                                                     //SST25VF016B SPI片選禁止  

  358.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                  //ENC28J60接收完成中斷引腳
  359.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                            //內(nèi)部上拉輸入
  360.   GPIO_Init(GPIOA, &GPIO_InitStructure);                 


  361. //  GPIO_ResetBits(GPIOE, GPIO_Pin_1);                                                 //復(fù)位ENC28J60
  362. //  Delay(0xAFFF);                                          
  363. //  GPIO_SetBits(GPIOE, GPIO_Pin_1 );                                               
  364. //  Delay(0xAFFF);       
  365. }


  366. void Delay(vu32 nCount) {
  367.   for(; nCount != 0; nCount--);
  368. }

  369. /****************************************************************************
  370. * 名    稱:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
  371. * 功    能:格式化串口輸出函數(shù)
  372. * 入口參數(shù):USARTx:  指定串口
  373.                         Data:   發(fā)送數(shù)組
  374.                         ...:     不定參數(shù)
  375. * 出口參數(shù):無(wú)
  376. * 說(shuō)    明:格式化串口輸出函數(shù)
  377.                 "\r"        回車符           USART_OUT(USART1, "abcdefg\r")   
  378.                         "\n"        換行符           USART_OUT(USART1, "abcdefg\r\n")
  379.                         "%s"        字符串           USART_OUT(USART1, "字符串是:%s","abcdefg")
  380.                         "%d"        十進(jìn)制           USART_OUT(USART1, "a=%d",10)
  381. * 調(diào)用方法:無(wú)
  382. ****************************************************************************/
  383. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
  384.         const char *s;
  385.     int d;
  386.     char buf[16];
  387.     va_list ap;
  388.     va_start(ap, Data);

  389.         while(*Data!=0){                                                          //判斷是否到達(dá)字符串結(jié)束符
  390.                 if(*Data==0x5c){                                                                          //'\'
  391.                         switch (*++Data){
  392.                                 case 'r':                                                                  //回車符
  393.                                         USART_SendData(USARTx, 0x0d);          

  394.                                         Data++;
  395.                                         break;
  396.                                 case 'n':                                                                  //換行符
  397.                                         USART_SendData(USARTx, 0x0a);       
  398.                                         Data++;
  399.                                         break;
  400.                                
  401.                                 default:
  402.                                         Data++;
  403.                                     break;
  404.                         }
  405.                        
  406.                          
  407.                 }
  408.                 else if(*Data=='%'){                                                                          //
  409.                         switch (*++Data){                               
  410.                                 case 's':                                                                                  //字符串
  411.                         s = va_arg(ap, const char *);
  412.                         for ( ; *s; s++) {
  413.                             USART_SendData(USARTx,*s);
  414.                                                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
  415.                         }
  416.                                         Data++;
  417.                         break;
  418.                     case 'd':                                                                                  //十進(jìn)制
  419.                         d = va_arg(ap, int);
  420.                         itoa(d, buf, 10);
  421.                         for (s = buf; *s; s++) {
  422.                             USART_SendData(USARTx,*s);
  423.                                                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
  424.                         }
  425.                                         Data++;
  426.                         break;
  427.                                 default:
  428.                                         Data++;
  429.                                     break;
  430.                         }                 
  431.                 }
  432.                 else USART_SendData(USARTx, *Data++);
  433.                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
  434.         }
  435. }

  436. /******************************************************
  437.                 整形數(shù)據(jù)轉(zhuǎn)字符串函數(shù)
  438.         char *itoa(int value, char *string, int radix)
  439.                 radix=10 標(biāo)示是10進(jìn)制        非十進(jìn)制,轉(zhuǎn)換結(jié)果為0;  
  440. ……………………

  441. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
STM32-奮斗板-uIP1.0網(wǎng)絡(luò)例程.rar (1.38 MB, 下載次數(shù): 77)


回復(fù)

使用道具 舉報(bào)

ID:87631 發(fā)表于 2020-1-3 19:48 | 顯示全部樓層
請(qǐng)問(wèn)怎么設(shè)置在路由器中顯示的設(shè)備名稱
回復(fù)

使用道具 舉報(bào)

ID:254411 發(fā)表于 2020-3-28 15:06 | 顯示全部樓層
文件不全咋用啊,大家不要下載
回復(fù)

使用道具 舉報(bào)

ID:254411 發(fā)表于 2020-3-28 15:24 | 顯示全部樓層
文件不全咋用啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表