---
title: "【STM32CubeMX】STM32H7-RTOS-SPI-W5500"
url: "https://maker.wiznet.io/chen/projects/STM32CubeMXSTM32H7RTOSSPIW5500/"
markdown_url: "https://maker.wiznet.io/chen/projects/STM32CubeMXSTM32H7RTOSSPIW5500/md"
type: "UCC: User Created Content"
author: "chen"
author_url: "https://maker.wiznet.io/chen/"
original_author: "chen"
original_url: "https://blog.csdn.net/Roger_717/article/details/112481165?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165391385716781483715540%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165391385716781483715540&biz_id"
published: "2022-08-01"
language: "en"
hardware: ["CubeMx"]
likes: 0
views: 878
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# 【STM32CubeMX】STM32H7-RTOS-SPI-W5500

> 【STM32CubeMX】STM32H7-RTOS-SPI-W5500

Original author: chen (source: https://blog.csdn.net/Roger_717/article/details/112481165?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165391385716781483715540%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165391385716781483715540&biz_id)

## Components

- **CubeMx** x 1

## Article

目? 1. 移植W5500步? 2. Cobemx配置步? 2.1 ??配置Clock Configuration 2.2 Trace and Debug配置 2.3 使能CPU ICache?DCache 2.4 USART配置 2.5 硬件SPI配置 2.6 GPIO的LED配置 2.7 ??程序?注意 2.8 FREERTOS配置 2.9 下?程序后不能?行 2.10 提升??速度 2.11 下?完程序自??? 3. W5500硬件?接 3.1 初始化SPI 3.2 初始化GPIO 4. W5500程序移植 4.1 修改wizchip_conf.h文件 5. 我?要??的函?bsp_spi_w5500.c 5.1 W5500芯片?位 5.2 ?SPI函??行?W5500?行注? 5.3 收??存?置 5.4 ?取芯片ID 5.5 ?置??配置 5.6 ?取??配置 5.7 配置超? 5.8 打印配置信息 6. ???象 1. 移植W5500步? 初始化SPI引脚 初始化SCS引脚（片?） 下?官方?文件 添加官方?到工程目? ??SPI接口和?文件的?接 ?用官方?提供的函????接 2. Cobemx配置步? 2.1 ??配置Clock Configuration 所使用的?片机是正点原子的阿波?底板STM32H743IIT6。 我?看原理?是再29.30引脚接的25MHz的无源晶振。 ![](https://img-blog.csdnimg.cn/20210720103329536.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) RCC 配置界面。以外部???例，STM32CubeMX中外部??配置可??型? Disable BYPASS Clock Source（旁路??源） Crystal/Ceramic Resonator（石英/陶瓷 晶振） 三??型，?考手?也??接?路展示出?了，我??里用的是无源晶振，故??第三?方案。 ![](https://img-blog.csdnimg.cn/20210720103953608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) H743?借外部晶振的加持，最高主?可以?到480MHz。 ![](https://img-blog.csdnimg.cn/20210720103355130.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ??我?就通?配置???使H743??出?最佳??。 ![](https://img-blog.csdnimg.cn/20210720151815755.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210720151941839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) STM32H7 主?在 400~480MHz 下，SPI1，SPI2 和 SPI3 的最高??是 200MHz，而 SPI4,5,6 是 100MHz。?里特?注意一点，SPI 工作?最少??二分?，也就是? SPI1,2,3 ??通信??是100MHz 2.2 Trace and Debug配置 ![](https://img-blog.csdnimg.cn/2021072014124142.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 2.3 使能CPU ICache?DCache STM32F7使用CubeMX生?代??，可以在Cortex-M7?置里??是否??ART ACCLERATOR，ICache，DCache等，如下? ![](https://img-blog.csdnimg.cn/20210720114912155.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 2.4 USART配置 配置??串口，?定物理引脚PA10PA9。 ![](https://img-blog.csdnimg.cn/20210720105116561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ??配置完成以后，可以在 Connectivity ???UART功能，USART1可以??的模式有Asynchronous???步通?、synchronous??同步通?、Single Wire（Half-Duplex）????（半?工）通?，此?配置??步通?。 ![](https://img-blog.csdnimg.cn/20210720110539259.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 2.5 硬件SPI配置 ![](https://img-blog.csdnimg.cn/20210720150509302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210720150602471.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 2.6 GPIO的LED配置 ![](https://img-blog.csdnimg.cn/20210720160231478.png) PB0和PB1????板LED0和LED1。 2.7 ??程序?注意 ?什?SWD??STM32?BOOT0脚要接高?平，否?SWD下?失?。 ?配置的程序?行????成功。 2.8 FREERTOS配置 ![](https://img-blog.csdnimg.cn/20210721165449677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210729142404907.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210729142404907.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 2.9 下?程序后不能?行 ?行?件??的?候?踪按?需要?行三次程序?能??，每次??程序都停留在： ![](https://img-blog.csdnimg.cn/20210726000252945.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 解??法： ?得?Uis Micro LIB勾?。 ![](https://img-blog.csdnimg.cn/20210725231544728.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 2.10 提升??速度 在CobeMX生成的freertos之后，如果我???V6??器?出??多????，解??法是： 替????文件，替?的路?如下： MiddlewaresThird_PartyFreeRTOSSourceportableRVDSARM_CM4F 替?之后??就不???，而且在Browse information勾?的情?下快速??。 ?接在我提供的程序源文件里面： 2.11 下?完程序自??? ![](https://img-blog.csdnimg.cn/20210729143250511.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 3. W5500硬件?接 10?引脚中，?正使用的也就只有vcc gnd miso mosi sclk scs ???脚，RST和int引脚如果是引用官方的?的?，是不需要的（RST是?位引脚，INT是中???引脚）。我??次也需要用到RST引脚。 ![](https://img-blog.csdnimg.cn/20210728144143563.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210728144200372.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 3.1 初始化SPI 因?W5500模??部自己??了TCP/IP??，在外部只需要通?提供的接口利用SPI把相?的?????去就行了，比如物理地址，本机IP，本机端口，目?端口，目?IP等等。 3.2 初始化GPIO 除去SPI口之外?有一?片?引脚SCS，??引脚?重要，在官方????的4?函?中，起到的???的作用。同?也初始化了?位引脚。 #define CSPin(n) (n? HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET)) #define RSTNPin(n) (n? HAL_GPIO_WritePin(SPI1_RST_GPIO_Port,SPI1_RST_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(SPI1_RST_GPIO_Port,SPI1_RST_Pin,GPIO_PIN_RESET)) 4. W5500程序移植 最新程序下??址如下： https://github.com/Wiznet/ioLibrary_Driver 我?解?后需要下面?? ![](https://img-blog.csdnimg.cn/20210723094009375.png) 下面介?以下主要的功能： application/loopback是一?回???的示例程序。 Internet里?是上?多???的??程序。 socket.c 文件?里面主要是socket的一些函?，比如close connect socket等等函?，??了一些?用?的封? w5500.c 文件主要??的是?W5500模?寄存器的??和操作，包括??那些寄存器，地址是多少等等， wizchip_conf.c 就是一?公共文件主要包括和SPI的?接以及?接W5500??寄存器函?和socket函?。有用?用于注?函?的??api以及配置W5X00的一些??函?。 DHCP.c 主要就是初始化DHCP，??DHCP，?取ip，端口等函? 4.1 修改wizchip_conf.h文件 ![](https://img-blog.csdnimg.cn/20210725151218470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) 5. 我?要??的函?bsp_spi_w5500.c 首先根据提供的???，?我?要定?的??配置信息?行??： static wiz_NetInfo NetConf = { .mac = {0x0c, 0x29, 0xab, 0x7c, 0x04, 0x02}, //mac地址 .ip = {192, 168, 0, 215}, //本机IP地址 .sn = {255, 255, 255, 0}, //子?掩? .gw = {192, 168, 0, 1}, //??地址 .dns = {0, 0, 0, 0}, //DNS服?器地址 .dhcp = NETINFO_STATIC //使用??IP }; ?????存在于wizchip_conf.c，其中NetConf是一?wiz_NetInfo?型的????量，????在wizchip_conf.h中定?，用于?置mac地址、IP地址等????，具?如下： typedef struct wiz_NetInfo_t { uint8_t mac[6]; ///&lt; Source Mac Address uint8_t ip[4]; ///&lt; Source IP Address uint8_t sn[4]; ///&lt; Subnet Mask uint8_t gw[4]; ///&lt; Gateway IP Address uint8_t dns[4]; ///&lt; DNS server IP Address dhcp_mode dhcp; ///&lt; 1 - Static, 2 - DHCP }wiz_NetInfo; 接下?我?就要????初始化的配置函?，先把程序?出?，然后再慢慢分解： void set_w5500_conf(void) { reset();//芯片?位 //注?函?，用?通???SPI注?回?函????WIZCHP reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注??界?函? reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); //注?SPI片?信?函? reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注???函? /***物理?配置*/ //初始化芯片?? ctlwizchip(CW_RESET_WIZCHIP,(void *)0);//?件重置 uint8_t memsize[16] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; uint8_t tmp; //WIZCHIP SOCKET?存?初始化 ctlwizchip(CW_INIT_WIZCHIP, &memsize); //PHY物理??接???? ctlwizchip(CW_GET_PHYLINK, (void*)&tmp); /***?取芯片ID/ uint8_t id[6];//?取芯片ID ctlwizchip(CW_GET_ID,(void*)id);//?取ID /***?置??配置/ ctlnetwork(CN_SET_NETINFO, (void*)&NetConf); /***?取??配置/ wiz_NetInfo conf; ctlnetwork(CN_GET_NETINFO, (void*)&conf); //?取?置???? if(memcmp(&conf,&NetConf,sizeof(wiz_NetInfo)) == 0){ printf("set network parameters success");// 配置成功 }else{ printf("set network parameters fail"); // 配置失? } /***配置超?/ wiz_NetTimeout timeout; timeout.retry_cnt = 8; // 重?次?，默?8次 timeout.time_100us = 2000; // 超???，默?2000*100us = 200ms wizchip_settimeout(&timeout); /***打印配置信息/ printf("w5500 network infomation:rn"); printf("w5500 -mac:%d:%d:%d:%d:%d:%drn", conf.mac[0], conf.mac[1], conf.mac[2], conf.mac[3], conf.mac[4], conf.mac[5]); printf("w5500 -ip:%d.%d.%d.%drn", conf.ip[0], conf.ip[1], conf.ip[2], conf.ip[3]); printf("w5500 -sn:%d.%d.%d.%drn", conf.sn[0], conf.sn[1], conf.sn[2], conf.sn[3]); printf("w5500 -gw:%d.%d.%d.%drn", conf.gw[0], conf.gw[1], conf.gw[2], conf.gw[3]); printf("w5500 -dns:%d.%d.%d.%drn", conf.dns[0], conf.dns[1], conf.dns[2], conf.dns[3]); } 5.1 W5500芯片?位 reset();//芯片?位 void reset() { RSTNPin(0); HAL_Delay(100); RSTNPin(1); HAL_Delay(1500); } 5.2 ?SPI函??行?W5500?行注? //注?函?，用?通???SPI注?回?函????WIZCHP reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注??界?函? reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); //注?SPI片?信?函? reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注???函? 在spi里??一些函?，然后把函?名???wizchip_conf.c里面的一些函?指?，??W5500.c里面的函?????的?候，就能?直接使用SPI接口了，具???的函?有以下6?。 void SPI1_WriteByte(u8 TxData) uint8_t SPI1_ReadByte() void SPI_CrisEnter(void) void SPI_CrisExit(void) void SPI_CS_Select(void) void SPI_CS_Deselect(void) /** * @brief ?1字??据到SPI?? * @param TxData ?到??的?据 * @retval None */ void SPI_WriteByte(uint8_t TxData) { HAL_SPI_Transmit(&SPI_HANDLE, &TxData, 1, 0xFF); } /** * @brief ?SPI???取1字??据 * @retval ?到的?据 */ uint8_t SPI_ReadByte(void) { uint8_t send = 0xff; uint8_t recv; HAL_SPI_TransmitReceive(&SPI_HANDLE, &send, &recv, 1, 0xff); return recv; } /** * @brief ?入?界? * @retval None */ void SPI_CrisEnter(void) { __set_PRIMASK(1); } /** * @brief 退出?界? * @retval None */ void SPI_CrisExit(void) { __set_PRIMASK(0); } /** * @brief 片?信??出低?平 * @retval None */ void SPI_CS_Select(void) { CSPin(0); //低?平有效 } /** * @brief 片?信??出高?平 * @retval None */ void SPI_CS_Deselect(void) { CSPin(1); } ??了???函?之后，需要把他?注?到?函?里面，利用函?指??上述函??行?用。 前面?了?文件wizchip_conf.c 里面就包括了和SPI口的?接??指?函?。例如： void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb)) { while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_SPI_)); if(!spi_rb || !spi_wb) { WIZCHIP.IF.SPI._read_byte = wizchip_spi_readbyte; WIZCHIP.IF.SPI._write_byte = wizchip_spi_writebyte; } else { WIZCHIP.IF.SPI._read_byte = spi_rb; WIZCHIP.IF.SPI._write_byte = spi_wb; } } 5.3 收??存?置 分?指定16?端口上收和????的大小(KB)，收和?分?加起?不能超?16K。默?每?端口的收?端口分??2K。 /***物理?配置*/ //初始化芯片?? ctlwizchip(CW_RESET_WIZCHIP,(void *)0);//?件重置 uint8_t memsize[16] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; uint8_t tmp; //WIZCHIP SOCKET?存?初始化 ctlwizchip(CW_INIT_WIZCHIP, &memsize); //PHY物理??接???? ctlwizchip(CW_GET_PHYLINK, (void*)&tmp); 5.4 ?取芯片ID id里是固定的 “W5500”。 /***?取芯片ID/ uint8_t id[6];//?取芯片ID ctlwizchip(CW_GET_ID,(void*)id);//?取ID 5.5 ?置??配置 /***?置??配置/ ctlnetwork(CN_SET_NETINFO, (void*)&NetConf); 5.6 ?取??配置 /***?取??配置/ wiz_NetInfo conf; ctlnetwork(CN_GET_NETINFO, (void*)&conf); //?取?置???? if(memcmp(&conf,&NetConf,sizeof(wiz_NetInfo)) == 0){ printf("set network parameters success");// 配置成功 }else{ printf("set network parameters fail"); // 配置失? } 配置成功?串口打印 ![](https://img-blog.csdnimg.cn/20210725235755244.png) 5.7 配置超? 如?起tcp?接、?送?据等的?候，如果一段???有答?(?超?超???)，W5500?重?，直到超?重?次???有得到答?，就???超?中?。 /***配置超?/ wiz_NetTimeout timeout; timeout.retry_cnt = 8; // 重?次?，默?8次 timeout.time_100us = 2000; // 超???，默?2000*100us = 200ms wizchip_settimeout(&timeout); 5.8 打印配置信息 加在配置??函??void set_w5500_ip(void)，配置完成?可通?串口?行打印。 /***打印配置信息/ printf("w5500 network infomation:rn"); printf(" -mac:%d:%d:%d:%d:%d:%drn", conf.mac[0], conf.mac[1], conf.mac[2], conf.mac[3], conf.mac[4], conf.mac[5]); printf(" -ip:%d.%d.%d.%drn", conf.ip[0], conf.ip[1], conf.ip[2], conf.ip[3]); printf(" -sn:%d.%d.%d.%drn", conf.sn[0], conf.sn[1], conf.sn[2], conf.sn[3]); printf(" -gw:%d.%d.%d.%drn", conf.gw[0], conf.gw[1], conf.gw[2], conf.gw[3]); printf(" -dns:%d.%d.%d.%drn", conf.dns[0], conf.dns[1], conf.dns[2], conf.dns[3]); 6. ???象 ![](https://img-blog.csdnimg.cn/20210728145347465.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210727142409889.png) ??配置到?里就算完成了，???函??行初始化后就可以ping通了。 ![](https://img-blog.csdnimg.cn/20210726000029951.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvZ2VyXzcxNw==,size_16,color_FFFFFF,t_70) ???????????????? 版??明：本文?CSDN博主「米杰的?音」的原?文章，遵循CC 4.0 BY-SA版???，???附上原文出??接及本?明。 原文?接：https://blog.csdn.net/Roger_717/article/details/112481165

---

Source: https://maker.wiznet.io/chen/projects/STM32CubeMXSTM32H7RTOSSPIW5500/
