娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月29日(星期四)

2018年05月29日 | 基于STM32F4移植W5500官方驅動庫ioLibrary_Driver

發布者:colchery 來源: eefocus關鍵字:STM32F4  移植W5500  ioLibrary_Driver 手機看文章 掃描二維碼
隨時隨地手機看文章

1.關于 ioLibrary_Driver

1.1. ioLibrary 概述

The ioLibrary means “Internet Offload Library” for WIZnet chip. It includes drivers and application protocols. The driver (ioLibrary) can be used for the application design of WIZnet TCP/IP chips as W5500, W5300, W5200 and W5100.

更多信息參考ioLibrary的 wiki : http://wizwiki.net/wiki/doku.php?id=products:w5500:driver

1.2. ioLibrary 下載

從 github ( https://github.com/Wiznet/ioLibrary_Driver ) 下載驅動庫

2. ioLibrary 移植STM32F4

2.1. 準備工作

首先,下載庫源碼,解壓,文件目錄如下所示:


然后,準備一個基本的STM32F4的工程,將 ioLibrary_Driver 放到工程目錄下。


2.2. 移植過程

步驟一、將用到 ioLibrary_Driver\Ethernet 下面的文件,將這些文件加入到自己的工程中。


步驟二、添加對應的頭文件目錄到工程中。



然后編譯,出現如下錯誤,將問題行注釋掉。



若編譯出現類似于如下錯誤

..\User\Ethernet\wizchip_conf.c(113): error:  #29: expected an expression

        .id                  = _WIZCHIP_ID_,

..\User\Ethernet\wizchip_conf.c(114): error:  #29: expected an expression

        .if_mode             = _WIZCHIP_IO_MODE_,

..\User\Ethernet\wizchip_conf.c(115): error:  #29: expected an expression

        .CRIS._enter         = wizchip_cris_enter,

..\User\Ethernet\wizchip_conf.c(116): error:  #29: expected an expression

        .CRIS._exit          = wizchip_cris_exit,

..\User\Ethernet\wizchip_conf.c(117): error:  #29: expected an expression

        .CS._select          = wizchip_cs_select,

..\User\Ethernet\wizchip_conf.c(118): error:  #29: expected an expression

        .CS._deselect        = wizchip_cs_deselect,

..\User\Ethernet\wizchip_conf.c(119): error:  #29: expected an expression

        .IF.BUS._read_byte   = wizchip_bus_readbyte,

..\User\Ethernet\wizchip_conf.c(120): error:  #29: expected an expression

        .IF.BUS._write_byte  = wizchip_bus_writebyte

..\User\Ethernet\wizchip_conf.c(123): warning:  #12-D: parsing restarts here after previous syntax error

        };

..\User\Ethernet\wizchip_conf.c: 1 warning, 8 errors

主要原因是Keil MDK默認設置不支持按照結構體名稱初始化結構體的原因導致。則需要根據自己的編譯器做下設置,keil MDK設置如下所示:



直到編譯全部通過,編譯器無錯誤,無警告提示。

步驟三、W5500和STM32F4是通過SPI接口通信的,所以要配置底層SPI管腳功能及SPI工作模式。

/**

 * @brief  : WIZ_SPI_Init

 * @note   : SPI接口初始化

 * 硬件連接: PA3 -> W5500_RST      

 *           PA4 -> W5500_SCS      

 *           PA5 -> W5500_SCK    

 *           PA6 -> W5500_MISO    

 *           PA7 -> W5500_MOSI  

 *           PA8 -> W5500_INT

 * @param  :

 * @retval :

 */

static void W5500_SPI_Init(void)

{

 GPIO_InitTypeDef  GPIO_InitStructure;

 SPI_InitTypeDef  SPI_InitStructure;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   //使能GPIOA時鐘

 /* W5500_RST引腳初始化配置(PA2) */

 GPIO_InitStructure.GPIO_Pin  = W5500_RST;

 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;           //普通輸出模式

 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;          //推挽輸出

 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;            //上拉

 GPIO_Init(W5500_RST_PORT, &GPIO_InitStructure);

 GPIO_SetBits(W5500_RST_PORT, W5500_RST);                // 設置高電平,W5500不會進入復位模式

 /* 初始化CS引腳 */

 GPIO_InitStructure.GPIO_Pin = W5500_SCS;

 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

 GPIO_Init(W5500_SCS_PORT, &GPIO_InitStructure);

 GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);

 // Enable SPI and GPIO clocks

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);        

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

 

 //SPI口初始化 Set PA5,6,7 as Output push-pull - SCK, MISO and MOSI

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

 GPIO_Init(GPIOA, &GPIO_InitStructure);

 

 SPI_I2S_DeInit(SPI1);

 //初始化SPI結構體

 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI設置為兩線全雙工

 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   //SPI發送接收8位幀結構

 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                          //串行時鐘在不操作時,時鐘為低電平

 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                        //第一個時鐘沿開始采樣數據

 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                           //NSS信號由軟件(使用SSI位)管理

 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  //SPI波特率預分頻值為 2

 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                  //數據傳輸從MSB位開始

 SPI_InitStructure.SPI_CRCPolynomial = 7;                            //CRC值計算的多項式

 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //設置SPI為主模式

 SPI_Init(SPI1, &SPI_InitStructure);                              //根據SPI_InitStruct中指定的參數初始化外設SPI1寄存器

 SPI_Cmd(SPI1, DISABLE);

 

 /* Enable SPI1  */                                                  //使能SPI外設  

 SPI_Cmd(SPI1, ENABLE);                                              //啟動傳輸

}

步驟四、在 wizchip_conf.h 文件中,有以下幾個功能回調注冊函數:

void reg_wizchip_cris_cbfunc(void(*cris_en)(void), void(*cris_ex)(void));

void reg_wizchip_cs_cbfunc(void(*cs_sel)(void), void(*cs_desel)(void));

void reg_wizchip_bus_cbfunc(iodata_t (*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, iodata_t wb));

void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb));

void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), void (*spi_wb)(uint8_t* pBuf, uint16_t len));

根據以上幾個接口設定的函數接口,添加如下代碼

/**

 * @brief : WIZ_CS

 * @note : 選擇W5500

 * @param :

 * @retval :

 */

static void W5500_CS_Select(void)

{

 GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平

}

/**

 * @brief : SPI_CS_Deselect

 * @note : 去選擇W5500

 * @param :

 * @retval :

 */

static void W5500_CS_Deselect(void)

{

 GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平

}

/**

 * @brief : W5500_WriteByte

 * @note : W5500 寫

 * @param :

 * @retval :

 */

static void W5500_WriteByte(uint8_t byte)

{

 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);  

 SPI_I2S_SendData(SPI1, byte);

 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);  

 SPI_I2S_ReceiveData(SPI1);

}

/**

 * @brief  : W5500_ReadByte

 * @note   : W5500 讀

 * @param  :

 * @retval :

 */

static uint8_t W5500_ReadByte(void)

{

 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);  

 SPI_I2S_SendData(SPI1, 0xFF);

 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);  

 return (SPI_I2S_ReceiveData(SPI1));

}

步驟五、W5500正常工作還需配置MAC地址,IP地址,子網掩碼等網絡配置信息。

/**

 * @brief : W5500_Network_Init

 * @note : W5500 網絡初始化

 * @param :

 * @retval :

 */

static void W5500_Network_Init(void)

{

 uint8_t chipid[6];

 wiz_NetInfo gWIZNETINFO;

 uint8_t mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};  ///< Source Mac Address

 uint8_t ip[4]={192,168,100,150};                   ///< Source IP Address

 uint8_t sn[4]={255,255,255,0};                   ///< Subnet Mask

 uint8_t gw[4]={192,168,100,1};                     ///< Gateway IP Address

 uint8_t dns[4]={8,8,8,8};                        ///< DNS server IP Address

 memcpy(gWIZNETINFO.ip, ip, 4);

 memcpy(gWIZNETINFO.sn, sn, 4);

 memcpy(gWIZNETINFO.gw,  gw, 4);

 memcpy(gWIZNETINFO.mac, mac,6);

 memcpy(gWIZNETINFO.dns,dns,4);

 gWIZNETINFO.dhcp = NETINFO_STATIC; //< 1 - Static, 2 - DHCP

 ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);

 ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);

 // Display Network Information

 ctlwizchip(CW_GET_ID,(void*)chipid);

 printf("\r\n=== %s NET CONF ===\r\n",(char*)chipid);

 printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],

 gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);

 printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);

 printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);

 printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);

 printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);

 printf("======================\r\n");

 wizchip_init(NULL, NULL);

 wiz_NetTimeout w_NetTimeout;

 w_NetTimeout.retry_cnt = 50;

 w_NetTimeout.time_100us = 1000;

 wizchip_settimeout(&w_NetTimeout);

}

步驟六、初始化W5500相關設定。

/**

 * @brief : W5500_Init

 * @note : 初始化

 * @param :

 * @retval :

 */

void W5500_Init(void)

{

 W5500_SPI_Init();

 for(int i=0x5FFF; i>0; i--); // 短暫延時,不然導致初始化失敗

 reg_wizchip_cris_cbfunc(NULL, NULL); // 注冊臨界區函數

 reg_wizchip_cs_cbfunc(W5500_CS_Select, W5500_CS_Deselect);// 注冊片選函數

 reg_wizchip_spi_cbfunc(W5500_ReadByte, W5500_WriteByte); // 注冊讀寫函數

 W5500_Network_Init();

}

步驟七、到這里,移植基本上完成。編譯工程保證無錯誤,無警告輸出。

3. 基于ioLibrary的應用

3.1. 功能測試

步驟一、將用到 ioLibrary_Driver\Application 的文件添加到工程



步驟二、包含對應頭文件路徑。



步驟三、添加應用代碼到主流程中。

/**

 * @brief  Main program

 * @param  None

 * @retval None

 */

int main(void)

{

 uint8_t dest_ip[4] = {192, 168, 10, 13};

 uint16_t dest_port = 8080;

 uint8_t dataBuffer[DATA_BUF_SIZE]={0x0};

 RCC_ClocksTypeDef RCC_Clocks;

 /* SysTick end of count event each 10ms */

 RCC_GetClocksFreq(&RCC_Clocks);

 SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);

 /* Add your application code here */

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 USART1_NVIC_Config(0,1);

 LED_Init();

 USART1_Init();

 

 W5500_Init();

 /* Infinite loop */

 while (1)

 {

   loopback_tcpc(0x0, dataBuffer, dest_ip, dest_port);

   LEDA_ON;LEDB_OFF;

   Delay(50);

   LEDA_OFF;LEDB_ON;

   Delay(50);

 }

}

步驟四、調整工程堆棧配置(根據功能需要,自定大小)。



步驟五、啟動網絡調試助手,適當配置。



步驟六、編譯程序,燒寫到單片機中,重啟。查看連接對象中是否出現,TCP-Client,選擇點擊發送按鈕,能收到回文,代表測試成功。



3.2. ping 測試

我們ping下程序里面的IP試試,能ping通,看來沒什么大問題了。



4、測試代碼

CSDN下載鏈接:https://download.csdn.net/download/xiayufeng520/10293822


關鍵字:STM32F4  移植W5500  ioLibrary_Driver 引用地址:基于STM32F4移植W5500官方驅動庫ioLibrary_Driver

上一篇:STM32F407之模擬I2C(二)之24C128
下一篇:STM32內存使用及分配

推薦閱讀

  自Apple iPhone X問世以來,手機行業卷起人臉識別的巨大浪潮。除Apple將2018年底3支新機皆導入Face ID外,Android陣營更是汲汲營營的跟上風潮,深怕一不小心便被競爭對手拋在后頭。下面就隨手機便攜小編一起來了解一下相關內容吧。  就在vivo以屏下指紋機種獲得廣大消費者青睞的同時,與其競合關系最深遠的OPPO也對外發布3D感測技術的布局,并直...
近日,火河科技&果加舉辦了以「致敬精英 解鎖新生活」為主題的品牌升級戰略發布會。發布會上火河科技宣布雙品牌運營戰略,以“火河”品牌持續深耕商用大居住綜合解決方案市場,以“果加”品牌進軍家用智能門鎖市場。火河科技CEO段方華在演講時多次強調,果加智能門鎖將堅持“品質看得見”的原則,以「匠心」打磨產品,為用戶提供品質過硬、設計精良的智能...
作為汽車產業變革的主要方向,“自動駕駛”熱度不斷提升。在國內外市場,越來越多的自動駕駛初創企業誕生,有的取得了成功,有的遭遇了挫折。在這種情況下,許多初創企業都成為了一些業內巨頭眼中的“利器”,紛紛以合作、收購、投資等方式為己所用。此前一直有消息稱,自動駕駛初創公司Zoox正打算“賣身”。近日,據外媒報道,亞馬遜和Zoox已經展開了深入...

史海拾趣

問答坊 | AI 解惑

手機上WAP網站收發郵件,真正的移動電郵.

手機上WAP網站收發郵件,真正的移動電郵.最近玩了幾個手機上網發郵件的WAP站。將自己的經驗和大家共享一下.有好的東西希望回帖頂下!1.中國移動的WAP郵.性能非常穩定,功能也不錯,有短信提示功能等.但是,最大的問題是收費!呵呵,這個是個 ...…

查看全部問答∨

PROFIBUS和AS-i接口在汽車上的應用

介紹了PROFIBUS和AS-i兩種現場總線的熱點應用,特點等…

查看全部問答∨

多重化主電路實現的大功率有源電力濾波器

摘要:為解決大容量有源電力濾波器面臨的大容量和開關頻率之間的矛盾,本文介紹一種采用多重化主電路的大容量有源電力濾波器,給出系統的主電路結構和系統的控制方法。實驗表明該系統有效地解決了有源電力濾波器容量與開關頻率的矛盾,取得了滿意的 ...…

查看全部問答∨

頻率源綜述

簡單分析頻率源的類型和它們的基本原理,重要技術指標以及優缺點。并對頻率源的重要性,技術難點和設計中的要點作了闡述。…

查看全部問答∨

2007全民奮斗史---eeworld獻給堅守崗位辛勤耕耘的各位高工

工作學習了又一年,累了吧? 坐下來,品品茶,歇歇腳,看看我們為您準備了什么? 放松心態,或許沉思,或許微笑,來到這里,來到這真正的工程師歡樂的家園。 …

查看全部問答∨

嵌入式CC++語言精華文章集錦

嵌入式CC++語言精華文章集錦…

查看全部問答∨

紅外發射功率太小

紅外發射功率太小,接受端接收很弱.我在原電路的基礎上又加了一個9018放大發射電流.. 結果收到了,可是有輕微失真,請問怎么解決?…

查看全部問答∨

文件不是有效windows CE安裝文件

我是用C#進行開發的,直接部署到設備上運行沒有問題,但是生成cab安裝文件,在設備上安裝失敗,提示“文件不是有效windows CE安裝文件”。系統是wince 5.0…

查看全部問答∨

我是學軟件的,想學單機片,不知道從哪開始下手,請高手指點小弟一下。

我是學軟件的,想學單機片,不知道從哪開始下手,請高手指點小弟一下。…

查看全部問答∨

WINCE6.0動態加載驅動問題

出現如下錯誤 BUILD: [00:0000000026:PROGC ] Building LIB Pass in D:\\WINCE600\\PLATFORM\\LPC32XX\\src\\drivers\\GPIO\\ directory. BUILD: [01:0000000036:PROGC ] Linking D:\\WINCE600\\platform\\LPC32XX\\lib\\ARMV4I\\debug\\GPIO.li ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 江达县| 秀山| 巫溪县| 光山县| 侯马市| 永泰县| 黔江区| 霸州市| 义乌市| 农安县| 衢州市| 佳木斯市| 黔江区| 宜昌市| 忻城县| 赤水市| 丁青县| 大足县| 肇庆市| 桃源县| 信宜市| 宁远县| 卢氏县| 章丘市| 滁州市| 桂东县| 克山县| 孝义市| 阜康市| 祥云县| 奉节县| 临沂市| 安庆市| 勃利县| 镇安县| 永德县| 桂阳县| 余姚市| 大同县| 娄烦县| 武宣县|