STM32H723ZGT6移植LWIP协议栈
创作时间:
作者:
@小白创作中心
STM32H723ZGT6移植LWIP协议栈
引用
CSDN
1.
https://m.blog.csdn.net/weixin_42554470/article/details/141088133
本文详细记录了在STM32H723芯片上移植LWIP协议栈的具体步骤,包括RMII引脚配置、数据缓存使能、LWIP配置、MPU配置、D2区域时钟使能、PHY芯片复位、PHY芯片地址修改等,并提供了相应的代码示例。
前言
本次使用最新的STM32H723芯片,在这块板子上移植LWIP协议栈,记录相关的操作步骤,以便后续进行学习和方便查看。
一、操作步骤
1.根据我们的底板原理图配置相关的RMII引脚
我们使用STM32CUBEIDE来进行配置相关的引脚。
2.使能数据缓存和指令缓存
3.打开LWIP的配置
然后配置地址
PHY芯片选择,这里只有一个选项,我们可以配置成默认的即可,然后在后面生成的代码中去修改一些参数即可。
同时需要配置MPU
配置完成之后在STM32H723ZGTX_FLASH.ld文件中添加这几行语句
.lwip_sec (NOLOAD):
{
. = ABSOLUTE(0X30000000);
*(.RxDecripSection)
. = ABSOLUTE(0X30000200);
*(.TxDecripSection)
. = ABSOLUTE(0X30004000);
*(.Rx_PoolSection)
} >RAM_D2
4.然后使能D2区域的时钟
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MPU Configuration--------------------------------------------------------*/
MPU_Config();
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
__HAL_RCC_D2SRAM1_CLK_ENABLE();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_LWIP_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
MX_LWIP_Process();
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_0);
HAL_Delay(500);
}
/* USER CODE END 3 */
}
5.将PHY芯片进行复位
void MX_LWIP_Init(void)
{
/* IP addresses initialization */
IP_ADDRESS[0] = 192;
IP_ADDRESS[1] = 168;
IP_ADDRESS[2] = 13;
IP_ADDRESS[3] = 15;
NETMASK_ADDRESS[0] = 255;
NETMASK_ADDRESS[1] = 255;
NETMASK_ADDRESS[2] = 255;
NETMASK_ADDRESS[3] = 0;
GATEWAY_ADDRESS[0] = 192;
GATEWAY_ADDRESS[1] = 168;
GATEWAY_ADDRESS[2] = 13;
GATEWAY_ADDRESS[3] = 1;
/* USER CODE BEGIN IP_ADDRESSES */
HAL_GPIO_WritePin(GPIOF,11,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOF,11,GPIO_PIN_SET);
HAL_Delay(100);
/* USER CODE END IP_ADDRESSES */
/* Initilialize the LwIP stack without RTOS */
lwip_init();
/* IP addresses initialization without DHCP (IPv4) */
IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);
/* add the network interface (IPv4/IPv6) without RTOS */
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
/* Registers the default network interface */
netif_set_default(&gnetif);
if (netif_is_link_up(&gnetif))
{
/* When the netif is fully configured this function must be called */
netif_set_up(&gnetif);
}
else
{
/* When the netif link is down this function must be called */
netif_set_down(&gnetif);
}
/* Set the link callback function, this function is called on change of link status*/
netif_set_link_callback(&gnetif, ethernet_link_status_updated);
/* Create the Ethernet link handler thread */
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
}
6.修改PHY芯片的地址
代码如下(示例):
int32_t LAN8742_Init(lan8742_Object_t *pObj)
{
uint32_t regvalue = 0, addr = 0;
int32_t status = LAN8742_STATUS_OK;
if(pObj->Is_Initialized == 0)
{
if(pObj->IO.Init != 0)
{
/* GPIO and Clocks initialization */
pObj->IO.Init();
}
/* for later check */
pObj->DevAddr = LAN8742_MAX_DEV_ADDR + 1;
/* Get the device address from special mode register */
for(addr = 0; addr <= LAN8742_MAX_DEV_ADDR; addr ++)
{
if(pObj->IO.ReadReg(addr, LAN8742_SMR, ®value) < 0)
{
status = LAN8742_STATUS_READ_ERROR;
/* Can't read from this device address
continue with next address */
continue;
}
if((regvalue & LAN8742_SMR_PHY_ADDR) == addr)
{
pObj->DevAddr = addr;
status = LAN8742_STATUS_OK;
break;
}
}
if(pObj->DevAddr > LAN8742_MAX_DEV_ADDR)
{
status = LAN8742_STATUS_ADDRESS_ERROR;
}
/* if device address is matched */
if(status == LAN8742_STATUS_OK)
{
pObj->Is_Initialized = 1;
}
}
return status;
}
7.生成代码和编译代码
8.连接网线验证能够正常ping通数据
总结
本次通过STM32官方提供的STM32CUBEIDE来进行配置工程和生成代码,将LWIP协议栈成功融入
工程代码中。
热门推荐
运动改善睡眠,你做对了吗?
中医怎么看过敏性鼻炎?从肺脾肾三脏功能失调说起
公孙瓒与刘备是何关系?他最后的下场如何?
公孙瓒与刘备是何关系?他最后的下场如何?
AC米兰主场迎战拉齐奥:欧战席位之争一触即发
中传一战总分410+分,专业课260+上岸北京大学应用心理考研347
大三学生如何准备考研:一份详尽的复习指南
2025内蒙古高考改革新方案3+1+2解读:赋分规则及对照表
马竞1-0双杀毕尔巴鄂!重返西甲榜首,阿尔瓦雷斯破门,40场21球
股权转让协议:如何明确责任和约定违约责任
千年古镇协税社火:巴蜀秦陇文化的艺术瑰宝
农作物的种植科普,农作物种植时间表及收成表
红细胞平均体积偏低是什么原因
腰椎骨折需要减肥,应该如何进行
【提醒】马上停止这样洗菜!当心越洗越脏,还丢了营养
安卓手机如何快速连接数位板(图文详解)
中国美协陶艺带头人白明图解景德镇制瓷工艺
云南芒市:海拔2890米的神秘边陲之城
养殖污水处理设备物联网远程监控系统方案
Science:象海豹在开阔的海洋中进行极限短暂睡眠
戒指尺寸测量方法有哪些,戒指尺寸测量怎么测最准?
戒指圈口尺寸对照表(含测量方法)
环境影响评价与项目决策科学化
情绪管理的艺术:从自我调节到人际和谐
【执行小贴士】了解执行程序 保护自身权益
2024年全国电力部直属大学排名最新(含录取分数线及位次)
解析痘痘肌内调的重要性以及具体的内调方法
狂犬病在哪个时期具有传染性?
云南蒙自 :壮家土八碗传承食文化
聚餐完发现同桌有乙肝,会中招吗?