因为H723ZET6是ST目前最新的芯片,对于这个芯片的LWIP配置,官方库极其不友好,而且贼多BUG,踩了好久的坑,历经诸多苦难,终于能够正常PING通和进行TCP/UDP通讯了。而且在国内基本上找不到H723ZET6的LWIP配置教程,所以必须记录一下。
开发环境:
适用CUBE版本:STM32CubeIDE 1.9.0 及以上
stm32芯片型号:H723ZET6
一、配置部分
(一)常规配置,RCC和SYS
RCC启用外部高速时钟
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e4a0e586b4a4862bdb7ea02daad8659b.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b5d46f0a08d10eca3c757a31a2e752b4.png)
(二)串口
串口的配置和代码实现本文不加以说明
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1253400e26f224b879906fa81976ff6c.png)
(三)ETH配置
MAC随意,不必和图中一样
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/000c79cb7f351c5af5f981d48abb4df2.png)
ETH的GPIO配置为高速,不然可能会ping不通
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/85821a4d6ba394022063e305638ca5ef.png)
(四)LWIP(重点来了)
首先是LWIP的常规配置,设置IP,其他默认。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e01ff9878e976350300750984c25b985.png)
排坑一:H723系列不同于H7系列,官方库默认配置是0x30044000,我相信有不少朋友试过:代码编译正常,烧录正常,但是代码一执行就进入Handler。这是因为H723的内存不同于其他H7系列。H723的RAM_D2的地址范围是0x30000000~0x30008000,而其他的H7空间比这个大得多。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/30d5fd3f17765592a12b245a4bf9b909.png)
然后注意LWIP_NETIF_LINK_CALLBACK(检测网线插拔的)要使能就行,其他配置默认
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c74783d0a035fa6cf0aeeb17f4165056.png)
排坑二:你实际用的PHY不一定是LAN8742,但官方配置就是默认且必须选择LAN8742,恶心死我了,所以到时要去修改它源码的PHY地址,后面会说到在哪里改。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f0a3a8401ca9704001fbfa66af235d7b.png)
使能SNTP
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/323abab9f9d5f3a4d2cef9a0d6ec99ba.png)
然后这里也默认就行
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/178006586ab445d6e56fb3f3a711abfc.png)
(五)PHY的复位引脚配置
我看很多教程都没详细写这一步,经常不知道这个复位是哪来的,实际上是必要的,除非硬件上设置了自动复位。设置一个引脚为输出模式,常态高电平。(具体哪个是复位引脚要看你们自己的硬件设计)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e057c2a7561162f5299c600a77ce4ea9.png)
并且常态设置为高电平
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4fad824cbe38a34d3cd209ebdc8dadc4.png)
(六)MPU配置(巨坑来了)
排坑三:H7系列的芯片想用LWIP必须配置MPU,而H723的配置与其他H7系列又有些不同,但哪里不同不需要管了,按我下面配置就完事
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/adb6d5116ce55f57d1e775e494746e49.png)
就这两个
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4b05999f32e6ccc337306e85fb131c8c.png)
(七)时钟树配置
这个没啥好说的,常规操作。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/be9b38bea81c75bc92e5ac66b630b3c0.png)
(八)生成代码
这里可以改大点
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d6cc85769903988b38e62e847d8b39ad.png)
然后勾选划分模块
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a59f12c4eb6c24b239c4f1c958758eda.png)
保存后就可以生成代码了。后面来到代码部分:
二、代码部分
(一)main函数的修改
使能D2SRAM1时钟:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7ae0f80332aca7bb94dfb77af3c6629f.png)
后面再加上这几行,清空DVache和PHY复位
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9277465a9a3f3ce41e7921ab77e7cccf.png)
当然还有MX_LWIP_Process(),加在循环里面
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d4c9c661d1e87761f3a025da67f35a2f.png)
(二) 修改phy地址
因为我用的phy地址是0x1,所以需要修改才能用,在这里修改:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cb82edbca6d84a0adafbb209dbd6a9e5.png)
找到函数LAN8742_Init(lan8742_Object_t *pObj)
在这个位置,强行修改phy的地址为0x1,恶心的官方库,很不好的是如果重新配置了ioc生成代码,又要重新在这里添加修改
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c6d09fef81f635444198270ea6a348f1.png)
(三)修改ld文件(巨坑)
很多人都不知道要改这里,少了这里不管怎么样配置都无法正常使用以太网,巨恶心,就是这个文件:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/32400bae78df6b27e885b52faff67cfb.png)
拉到最下面的这个位置,添加以下代码(目的是将lwip的内存放进RAM_D2里面):
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2aba655610b67b02add53c26a239b277.png)
到这里,所有的配置就完成了,可以编译烧录,尝试ping网络:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c943fdea146fc718e645592fbe1fb7ba.png)
搞定。