Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LWIP
STM32H7
STM32H7的LWIP移植,基于RT-Thread Studio
发布于 2020-07-16 18:14:40 浏览:7269
订阅该版
[tocm] 1.创建一个新工程,选择STM32H7,串口1,本人板子是自己做的,stm32h750,Y版本,其实相当于stm32h743,请根据自己的板子选择芯片。 ![1.png](/uploads/20200716/d2e2b0258b3727ddf3e91c80575334c9.png) 2.根据官方文档(https://www.rt-thread.org/doYcument/site/rtthread-studio/drivers/eth/rtthread-studio-eth/) ### 定义ETH相关宏 Board.h中,297行 ```c #define BSP_USING_ETH #ifdef BSP_USING_ETH #define PHY_USING_LAN8720A /*#define PHY_USING_DM9161CEP*/ /*#define PHY_USING_DP83848C*/ #endif ``` 将注释取消掉,根据自己的板子选择控制芯片。 + 初始化引脚和时钟,借助STM32CubeMX生成的初始化代码。这一块可以参考原子,例如MPU的初始化,将其放入void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)之中。 + 打开HAL库对ETH的支持,修改stm32h7xx_hal_conf.h文件,打开HAL_ETH_MODULE_ENABLED宏。 + 实现phy_reset函数,这个根据自己板子修改,不同的 PHY 芯片复位方式不同,需要根据具体自己板卡的实际情况进行实现。 + 配置LWIP协议栈,先根据文章描述打开,后续再进行修改。别忘了要先保存再编译。 + 开始编译,此时会出现大量错误,因为工程中的drv_eth.c文件,是根据F4的HAL库制作的,放到H7上肯定编译不过……实际上F1的也编译不过,似乎只有根据F4的HAL库制作的drv_eth.c文件,所以下一步就是根据H7的库修改驱动文件。 3.具体细节不讲了,参考原子的H7例程和STM32CubeMX生成的例程,由于我本身对RTT和LWIP不是十分熟悉,前面只是常用RTT NANO,而且用KEIL居多,所以移植的可能有些简陋。重点讲下几个细节,对跟我差不多的新入坑的小伙伴可能会比较有用。 + 将提供的drv_eth.c复制到工程中覆盖原文件,再次编译后,会出现一个错误一个警告: ```c arm-none-eabi-gcc "../drivers/drv_eth.c" ../drivers/drv_eth.c:60:20: error: array type has incomplete element type 'struct pbuf_custom' struct pbuf_custom rx_pbuf[ETH_RX_DESC_CNT]; ^ ../drivers/drv_eth.c: In function 'rt_stm32_eth_rx': ../drivers/drv_eth.c:224:15: warning: implicit declaration of function 'pbuf_alloced_custom' [-Wimplicit-function-declaration] p=pbuf_alloced_custom(PBUF_RAW,framelength,PBUF_POOL,&rx_pbuf[current_pbuf_idx],RxBuff.buffer, framelength); ^ make: *** [drivers/subdir.mk:66: drivers/drv_eth.o] Error 1 ``` + 实际这俩是一个错误,对应的是LWIP库文件中,pbuf.h中的LWIP_SUPPORT_CUSTOM_PBUF宏,该宏的完整定义 ```c #define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)) ``` + 根据原子和CubeMX的代码,除了IP_FRAG为1外,其他的都是一样的,所以我们只需要把IP_FRAG设定为1即可,该宏定义位置为,lwipopts.h的413行。 + 修改后再次编译,已经可以完整通过了,但实际是不可以使用的,因为H7配置好后默认是使用dma的,但eth的dma变量使用时必须定义到0x30040000的位置,查看map文件,可以发现此时的几个变量是定义在0x20000000开始的内存,所以需要修改DMARxDscrTab、DMATxDscrTab、Rx_Buff这3个数组在RAM中的位置。由于对arm-gcc不熟悉,在这里我调试了很久,总是莫名其妙就变成在flash中的位置了,bin文件变的无比巨大,600多M!最后好不容易凑合好了,不知道写的合不合规矩,但至少是好用了。 ### 具体修改方法: + 将工程中link.lds文件,用txt打开,在MEMORY一栏,添加 ```c SRAM3_1 (rw) : ORIGIN =0x30040000,LENGTH =32k SRAM3_2 (rw) : ORIGIN =0x30040060,LENGTH =32k SRAM3_3 (rw) : ORIGIN =0x30040200,LENGTH =32k ``` + 然后在下面SECTIONS中,添加 ```c .SRAM3_1 (NOLOAD) : ALIGN(4) { . = ALIGN(4); *(.SRAM3_1) *(.SRAM3_1.*) . = ALIGN(4); __SRAM3_1_free__ = .; } > SRAM3_1 .SRAM3_2 (NOLOAD) : ALIGN(4) { . = ALIGN(4); *(.SRAM3_2) *(.SRAM3_2.*) . = ALIGN(4); __SRAM3_2_free__ = .; } > SRAM3_2 .SRAM3_3 (NOLOAD) : ALIGN(4) { . = ALIGN(4); *(.SRAM3_3) *(.SRAM3_3.*) . = ALIGN(4); __SRAM3_3_free__ = .; } > SRAM3_3 ``` + 修改完成后,在工程中双击该文件,会显示为: ![2.png](/uploads/20200716/a0ed3ccdcbd99d929a45eb00d6bc4bc6.png) + 然后在drv_eth.c中,在DMARxDscrTab、DMATxDscrTab、Rx_Buff这三个数组定义前面加上 ```c __attribute__((section(".SRAM3_1"))) __attribute__((section(".SRAM3_2"))) __attribute__((section(".SRAM3_3"))) ``` + 再次编译后,查看map文件,会发现这三个数组已经定义到指定位置的内存了。 ![3.png](/uploads/20200716/77ff2ef163e2161c99a41737f1fee082.png) + 至于为何要专门定义到这三个位置……不知道,STM32CubeMX定义的,只能说可能是为了32位对齐。 + 我习惯使用0x24000000开始的512K的AXI SRAM,所以修改RAM为0x24000000,长度512K,最终修改后的lds文件在工程中打开如下 ![4.png](/uploads/20200716/8bbe7d797c993a0407a95cf4e4ea9b92.png) + 由于修改了RAM的起始地址,所以别忘了在board.h中,把RAM_START这个宏的值从0x20000000改为0x24000000,RAM_SIZE修改为512。 4.再次编译后通过编译,我这边取消了LWIP中的DHCP功能,并使能了几个命令: ![5.png](/uploads/20200716/f3983d178c08b7a00776dec02bfc05b7.png) 别忘了把main函数中的Hello RT-Thread!注释掉,要不然会不断的在终端中打印。也可以自己加入一个led闪烁。 5.点下载完成后即可在终端中看到信息: ![6.png](/uploads/20200716/e22ecbd3de89b1822da2186f05c6221c.png) 按下tab可以看到rtt支持的所有命令: ![7.png](/uploads/20200716/fd5a21d7d1358d8c89b719d053485bc3.png) 输入ifconfig可以看到: ![8.png](/uploads/20200716/874c728763661957da03efe5a08dbf9f.png) 说明网卡启动成功,因为设定的静态IP,所以IP直接就有,但如果这时候你ping自己是ping不通的: ![9.png](/uploads/20200716/56601314177514549f7d50a72e066ddc.png) 我在这里捣鼓了好久,后来才发现,ping自己需要在LWIP中启动 ![10.png](/uploads/20200716/09f814c503ef7bdc9c220b2591eaedc4.png) 是自己对LWIP不熟悉导致。 ping PC: ![11.png](/uploads/20200716/ebd7e66fd5437da2dd5e21c92d7c42f9.png) 6.至此,整个移植结束,可以顺便加入rtt源码中的example中的tcpclient.c和tcpserver.c测试下,这两个文件需要在RT-Thread Setting中的Network下,打开这两项: ![12.png](/uploads/20200716/a3d406ae90b4516033954d110f8c4b8f.png) 编译完成后,bin文件为233KB(233……),下载后终端输出: ![13.png](/uploads/20200716/e2660c9c16ab2a9c2af7ba80f7e9251f.png) 同时,按下tab后增加了两个命令: ![14.png](/uploads/20200716/767af4c8e2dbb37587402d34bff0e715.png) 怎么用就自己查看help吧,我这边上几张图片: Tcp Server测试: ![15.png](/uploads/20200716/e692f9b9d985992b472bc412476b3dc3.png) Tcp Client测试: ![16.png](/uploads/20200716/1e185f17ad7aba5b8a24c702a38eaf45.png) 加上DHCP后,需要接到路由器上,我已经测试成功,可以自己获取到ip,并ping通www.baidu.com。 ## 虽然调通了,但还是有几个疑问: + lds前面修改了好多次,总是变成flash的地址,造成bin文件无比巨大,现在的写法应该也是不规范的,希望有大神修改下。 + sram3的时钟到底需不需要使能,我这边没有使能,但却可以正常使用,库函数中有使能语句,说明应该是需要的,但为何我的代码没出问题…… 我毕竟是个半新手,之前没用过studio和lwip,肯定有移植的不好的地方,希望大家一起努力,rtt真是个好系统啊! 我修改的drv_eth.c和lds文件,修改了下名字防止混乱。 - [rtt_h7_lwip_drv文件.rar](/uploads/20200716/c2f7f2fdd8f2f02d99fa7e18fb08e825.rar) 我共享下studio的工程,方便需要的人使用(上传不上去,我用百度网盘) STM32H7_LWIP_DEMO-studio.rar 链接: https://pan.baidu.com/s/1LF-c5EWw2aZrjFI-sgXVAQ 提取码: n3dj
27
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
cuphead
这家伙很懒,什么也没写!
文章
1
回答
2
被采纳
1
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
{lwip}使能RT_LWIP_DHCP时可以获取到ip
3
stm32f103 LWIP 2.0.2 TCP收发问题
4
lwip2.1不重启修改IP
5
关于网络协议栈的测试
6
可否将LWIP升级到2.1.2 和 2.0.3?
7
socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
8
tcpclient 插拔网线问题?
9
两个tcpclient同时通讯可以吗?
10
SO_BINDTODEVICE 未定义该如何解决
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
4
次点赞
用RTT跑流水灯
1
篇文章
2
次点赞
catcatbing
1
篇文章
2
次点赞
YZRD
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部