硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3177|回复: 29
收起左侧

[以太网] STM32H750以太网调试中遇到时钟使能错误的诡异问题

[复制链接]

2

主题

23

回帖

29

积分

新手上路

积分
29
发表于 2021-7-9 16:09:25 | 显示全部楼层 |阅读模式
本帖最后由 浪里个白条 于 2021-7-9 16:50 编辑

就是以太网MAC时钟使能那一句宏定义:__HAL_RCC_ETH1MAC_CLK_ENABLE();
展开之后是:
do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETH1MACEN);\
                                        /* Delay after an RCC peripheral clock enabling */ \
                                        tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETH1MACEN);\
                                        UNUSED(tmpreg); \
                                       } while(0);
就这一段代码,用在同一块板子上,放在不同的程序,会有不同效果。即使我在main函数第一句就运行它,也有问题。我把它拆到底变成:SET_BIT(((RCC_TypeDef *)0x58024400)->AHB1ENR, (0x1 << 15));来运行,还是有问题。
不同的程序有两种结果,拿一套示例代码运行就正常,这个代码看不出是哪个版本CUBEMX生成的,应该是稍微老一点的。在我自己生成的代码中运行就有问题,我用的MCU包是      STM32CubeH7 Firmware Package V1.9.0 /     12-February-2021,用这个包生成代码无论是否有ETH和LWIP,都有问题。
错误具体如下:
正常结果 下载 (1).png 错误结果 下载.png

寄存器DMAMR不应该出现0x00008000, 后面对MAC DMA寄存器各种赋值也不成功 下载 (2).png





回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-9 17:15:16 | 显示全部楼层
本帖最后由 浪里个白条 于 2021-7-9 17:28 编辑

保存草稿的帖子直接就发出去了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-9 18:17:48 | 显示全部楼层
放在标准位置,正常吗
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: HAL_ETH_MspInit
  4. *        功能说明: 以太网初始化调用的底层回调,用于初始化IO,时钟和中断
  5. *        形    参: ---
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)
  10. {
  11.         GPIO_InitTypeDef GPIO_InitStruct;

  12.         /*
  13.                 PC1     ------> ETH_MDC
  14.                 PA1     ------> ETH_REF_CLK
  15.                 PA2     ------> ETH_MDIO
  16.                 PA7     ------> ETH_CRS_DV
  17.                 PC4     ------> ETH_RXD0
  18.                 PC5     ------> ETH_RXD1
  19.                 PB13    ------> ETH_TXD1
  20.                 PG11    ------> ETH_TX_EN
  21.                 PG13    ------> ETH_TXD0
  22.         */
  23.         if(heth->Instance==ETH)
  24.         {
  25.                 /* 使能外设时钟 */
  26.                 __HAL_RCC_ETH1MAC_CLK_ENABLE();
  27.                 __HAL_RCC_ETH1TX_CLK_ENABLE();
  28.                 __HAL_RCC_ETH1RX_CLK_ENABLE();

  29.                 /* 使能时钟 */
  30.                 __HAL_RCC_GPIOA_CLK_ENABLE();
  31.                 __HAL_RCC_GPIOB_CLK_ENABLE();
  32.                 __HAL_RCC_GPIOC_CLK_ENABLE();
  33.                 __HAL_RCC_GPIOG_CLK_ENABLE();

  34.                
  35.                 /* 配置PA1, PA2 , PA7 */
  36.                 GPIO_InitStruct.Pin =  GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
  37.                 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  38.                 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  39.                 GPIO_InitStruct.Pull = GPIO_NOPULL ;
  40.                 GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  41.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  42.                 /* 配置PB13 */
  43.                 GPIO_InitStruct.Pin = GPIO_PIN_13;
  44.                 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  45.                 /* 配置PC1, PC4和PC5 */
  46.                 GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
  47.                 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);       

  48.                 /* 配置PG11, PG12和PG13 */
  49.                 GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_13;
  50.                 HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  51.                 /* 设置中断优先级 */
  52.                 HAL_NVIC_SetPriority(ETH_IRQn, 3, 0);
  53.                 HAL_NVIC_EnableIRQ(ETH_IRQn);       
  54.         }
  55. }
复制代码


回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-9 18:22:14 | 显示全部楼层
eric2013 发表于 2021-7-9 18:17
放在标准位置,正常吗

之前发现问题的时候就是在MSP里面的,我就想是不是之前配了什么影响的,就放在main第一行了,结果还是有问题。
我刚有用CUBEMX生成了一个只配置了时钟的空工程,在最开始加入了
SET_BIT(((RCC_TypeDef *)0x58024400)->AHB1ENR, (0x1 << 15));
        SET_BIT(((RCC_TypeDef *)0x58024400)->AHB1ENR, (0x1 << 15));
        ETH_HandleTypeDef heth;
        heth.Instance = ETH;
        SET_BIT(heth.Instance->DMAMR, ETH_DMAMR_SWR);
这段运行之后还是错的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-9 18:27:49 | 显示全部楼层
浪里个白条 发表于 2021-7-9 18:22
之前发现问题的时候就是在MSP里面的,我就想是不是之前配了什么影响的,就放在main第一行了,结果还是有 ...

那你当前是那种方式正常。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-9 18:36:56 | 显示全部楼层
eric2013 发表于 2021-7-9 18:27
那你当前是那种方式正常。

正常的就是别人的工程,示例代码,不知道是什么版本的库,只看是COPYRIGHT(c) 2017 STMicroelectronics
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-9 18:51:37 | 显示全部楼层
浪里个白条 发表于 2021-7-9 18:36
正常的就是别人的工程,示例代码,不知道是什么版本的库,只看是COPYRIGHT(c) 2017 STMicroelectronics

那你的应该是MPU没有配置好。还是就是以太网的RAM空间不要使用TCM。

库版本这里看

QQ截图20210709185107.png
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-12 09:51:45 | 显示全部楼层
eric2013 发表于 2021-7-9 18:51
那你的应该是MPU没有配置好。还是就是以太网的RAM空间不要使用TCM。

库版本这里看

都是第一行运行,MPU都没配的,结果却不一样。
TCM我没有指定用,会自动参与到代码运行中吗,怎么查看?
我很疑惑的就是,我都是把这一行放在main第一行运行的,按道理是什么都没配的,难道是不同版本的库默认设置变化了,需要配置回去吗,我的库是1.10.0,示例代码是1.3.0。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-13 00:14:31 | 显示全部楼层
浪里个白条 发表于 2021-7-12 09:51
都是第一行运行,MPU都没配的,结果却不一样。
TCM我没有指定用,会自动参与到代码运行中吗,怎么查看? ...

直接上传你做的工程,我看下。方便的话。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-13 10:22:01 | 显示全部楼层
eric2013 发表于 2021-7-13 00:14
直接上传你做的工程,我看下。方便的话。

直接上传可能有点大啊,我就是用cubemx生成的,我把设置的地方截图,除了截图的,剩下都是默认 屏幕截图 2021-07-13 094930.png 屏幕截图 2021-07-13 094621.png 屏幕截图 2021-07-13 095020.png 屏幕截图 2021-07-13 094734.png 屏幕截图 2021-07-13 095927.png 屏幕截图 2021-07-13 095126.png 屏幕截图 2021-07-13 095154.png
初始化就是调用MX_LWIP_Init();      里面跑到HAL_ETH_Init(&heth),    有一步是调用HAL_ETH_MspInit(heth);     走到__HAL_RCC_ETH1MAC_CLK_ENABLE();就出现寄存器错误了
所有都是官方代码,是用的8742,我接的是8720,寄存器好像都差不多,而且不管phy是否一样,phy初始化会影响mac寄存器吗?
我还做了个实验,把__HAL_RCC_ETH1MAC_CLK_ENABLE()放到systeminit里面运行,也是一个结果。我还把1.3.0库的syseminit完全替代到我这个里面,还是有错误。
我现在总结情况,基本上就是打开MAC时钟时候MAC寄存器的问题,不管在哪个位置运行,1.3.0的库开时钟寄存器正常,1.10.0开时钟寄存器就出错。不知道两个库到底是哪不同导致的问题。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-13 10:31:19 | 显示全部楼层
浪里个白条 发表于 2021-7-13 10:22
直接上传可能有点大啊,我就是用cubemx生成的,我把设置的地方截图,除了截图的,剩下都是默认
初始化就 ...

看这个看不出什么问题来。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-13 10:40:38 | 显示全部楼层
eric2013 发表于 2021-7-13 10:31
看这个看不出什么问题来。

链接:https://pan.baidu.com/s/11Z5701Tr1Pg75VIXcqBvSw
提取码:hu9s


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 01:36:32 | 显示全部楼层
浪里个白条 发表于 2021-7-13 10:40
链接:https://pan.baidu.com/s/11Z5701Tr1Pg75VIXcqBvSw
提取码:hu9s

好的,白天给你看了回复你
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-14 09:38:08 | 显示全部楼层
eric2013 发表于 2021-7-14 01:36
好的,白天给你看了回复你

我发现个问题,在KEIL里面的device选成H743VITx就好了,选我板上的750VBTx就不对,但是我的片子真的是750,至少看上去是的………KEIL的软件包版本是Keil.STM32H7xx_DFP.2.7.0,好像是最新的。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-14 10:25:46 | 显示全部楼层
eric2013 发表于 2021-7-14 01:36
好的,白天给你看了回复你

试了两个批次的H750,KEIL里面的device选成H750都有问题,是不是keil的包有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 10:34:43 | 显示全部楼层
浪里个白条 发表于 2021-7-14 10:25
试了两个批次的H750,KEIL里面的device选成H750都有问题,是不是keil的包有问题

大概率你的工程代码容量超了,H750只有128KB的Flash

你编译下,看看map文件
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-14 11:09:51 | 显示全部楼层
eric2013 发表于 2021-7-14 10:34
大概率你的工程代码容量超了,H750只有128KB的Flash

你编译下,看看map文件

Program Size: Code=64512 RO-data=1424 RW-data=244 ZI-data=23148  

没超啊,说来惭愧还没写过那么多代码量,超了是不是build时候就有提示,超了还能下进去吗?
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-14 11:12:39 | 显示全部楼层
eric2013 发表于 2021-7-14 10:34
大概率你的工程代码容量超了,H750只有128KB的Flash

你编译下,看看map文件

我是在keil device里换成h743,编译的代码量会变吗?芯片还是h750,keil换成743但实际用还是750的容量啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 11:21:13 | 显示全部楼层
1、前面跟你强调过的,当前测试不要使用TCM做主RAM, 你这里是TCM做主RAM,然后使用的AXI SRAM。

如果TCM做主RAM,以太网的DMA不支持访问这个空间,容易出问题。

QQ截图20210714111356.png

2、可以考虑修改下你的优化等级试试

2.png

3、使用AXI SRAM主RAM,建议你设置MPU关闭Cache来测试,成功了再考虑开Cache。


此贴就帮你这么多吧,还有其它问题的话,自己再找找吧
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-14 11:56:42 | 显示全部楼层
eric2013 发表于 2021-7-14 11:21
1、前面跟你强调过的,当前测试不要使用TCM做主RAM, 你这里是TCM做主RAM,然后使用的AXI SRAM。

如果TCM ...

谢谢了,已经帮了我很多了
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-14 17:49:24 | 显示全部楼层
这特么绝对是KEIL的BUG,IAR里跑就没问题,浪费我好几天,巴嘎
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-15 08:16:02 | 显示全部楼层
浪里个白条 发表于 2021-7-14 17:49
这特么绝对是KEIL的BUG,IAR里跑就没问题,浪费我好几天,巴嘎

那程序里面应该还有隐形的bug。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-15 09:16:11 | 显示全部楼层
eric2013 发表于 2021-7-15 08:16
那程序里面应该还有隐形的bug。

我查了,keil的h750软件包里,调试文件部分寄存器复位值有问题。我现在的工程,减法到极限了,cubemx配个时钟就输出了,我改的就是加一行给mac时钟,IAR和TrueSTUDIO都没问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-15 09:19:26 | 显示全部楼层
浪里个白条 发表于 2021-7-15 09:16
我查了,keil的h750软件包里,调试文件部分寄存器复位值有问题。我现在的工程,减法到极限了,cubemx配个 ...

我试了我们这个lwip的例子,在h750 MDK,随意设置你说的东西,都正常

LwIP网络教程开始更新,使用MDK的RTE环境开发,配套RTX5和FreeRTOS两个版本,更新至第7章(2020-05-03)
http://www.armbbs.cn/forum.php?m ... 5874&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-15 09:33:59 | 显示全部楼层
本帖最后由 浪里个白条 于 2021-7-15 09:59 编辑
eric2013 发表于 2021-7-15 09:19
我试了我们这个lwip的例子,在h750 MDK,随意设置你说的东西,都正常

LwIP网络教程开始更新,使用MDK ...

2、编译例子前请安装指定的软件包,都已经上传好,放在百度云:
     http://www.armbbs.cn/forum.php?mod=viewthread&tid=95609
这个例子用的2.3.1,我试了2.7和2.5的软件包,都有问题,看来只能用2.3.1了
QQ拼音截图未命名1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-15 10:01:23 | 显示全部楼层
浪里个白条 发表于 2021-7-15 09:33
2、编译例子前请安装指定的软件包,都已经上传好,放在百度云:
     http://www.armbbs.cn/forum.php?m ...

这个都是早期的软件包,那个时候新版还没有发布。

我给你测试的是用的最新的MDK5.35 + H7软件包2.7.0 + xxxx 全部最新版。

MDK RTE方式,无需升级例子,如果你安装了新版,例子会自动替换为最新版。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-7-15 12:02:59 | 显示全部楼层
eric2013 发表于 2021-7-15 10:01
这个都是早期的软件包,那个时候新版还没有发布。

我给你测试的是用的最新的MDK5.35 + H7软件包2.7.0  ...

你查看寄存器了?是正常值?因为包里STM32H750x.svd里面定义的DMAMR和好多寄存器复位值都是错的,我感觉至少显示是有问题的。如果MAC功能是正常的,也许只是显示问题,不影响功能。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-16 09:39:29 | 显示全部楼层
浪里个白条 发表于 2021-7-15 12:02
你查看寄存器了?是正常值?因为包里STM32H750x.svd里面定义的DMAMR和好多寄存器复位值都是错的,我感觉 ...

我这里运行都正常。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 06:23 , Processed in 0.306915 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表