我使用 Nucleo-H7S3L8 开发板,这两天一直被HAL_ERROR折磨。 SWR 位正常情况下软件复位成功后,该位会自动清除;但执行软件复位之后,这个 SWR 位始终无法自行清零。
具体现象:
HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth)
{
uint32_t tickstart;
if (heth == NULL)
{
return HAL_ERROR;
}
if (heth->gState == HAL_ETH_STATE_RESET)
{
heth->gState = HAL_ETH_STATE_BUSY;
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
ETH_InitCallbacksToDefault(heth);
if (heth->MspInitCallback == NULL)
{
heth->MspInitCallback = HAL_ETH_MspInit;
}
/* Init the low level hardware */
heth->MspInitCallback(heth);
#else
/* Init the low level hardware : GPIO, CLOCK, NVIC. */
HAL_ETH_MspInit(heth);
#endif /* (USE_HAL_ETH_REGISTER_CALLBACKS) */
}
__HAL_RCC_SBS_CLK_ENABLE();
if (heth->Init.MediaInterface == HAL_ETH_MII_MODE)
{
HAL_SBS_ConfigEthernetPHY(SBS_ETHERNET_PHY_GMII_OR_MII);
}
else
{
HAL_SBS_ConfigEthernetPHY(SBS_ETHERNET_PHY_RMII);
}
/* Dummy read to sync with ETH */
(void)SBS->PMCR;
/* Ethernet Software reset */
/* Set the SWR bit: resets all MAC subsystem internal registers and logic */
/* After reset all the registers holds their respective reset values */
SET_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR);
/* Get tick */
tickstart = HAL_GetTick();
/* Wait for software reset */
while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
{
if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
{
/* Set Error Code */
heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
/* Set State as Error */
heth->gState = HAL_ETH_STATE_ERROR;
/* Return Error */
return HAL_ERROR;
}
}
我已经排查了很多内容:RCC、以太网控制寄存器等等,但不知道为什么 SWR 位无法清零。
我也按照网上流传的手册修改了ethernetif.c与lwip.c。我的工程不是只跑以太网,还同时启用多个外设,所以引脚分配和官方示例、Github 工程并不相同。
请嵌入式大神帮忙,
|
|