风过空庭,字句正徐来。
关于关于本站关于我给我点钱
更多时间线友链文件服务wiki
联系写留言发邮件GitHub
© 2024-2026 yono. | RSS 订阅 | 站点地图 | | Stay hungry. Stay foolish.
Powered by Mix Space&
白い
.
| 粤 ICP 备2024284785号-1 |
正在被0人看爆
#55

2026年7月10日周五

旧的背景故事

之前有过 GD32H7 打开网络功能的尝试,因为没有在最终工程产品中用到该芯片,仅作评估后封存。

当时的现象是,完全采用与官方例程一模一样的库、外设配置、调用顺序、操作方法,只是我将官方的 keil 例程改为 cmake-gcc 工程。问题是官方例程编译烧录后一切正常,而我的工程编译后无论如何都无法 ping 通。

我对 lwip 这个网络库、ETH 外设这块的了解实在有限,GD 支持也无法找到原因所在。

原因

总的来说,GD32H7 芯片需要以类似这样的配置方法,将 0x0000 开始的整个寻址区域,都设置 MPU 保护,作为背景设置,然后后续的 MPU 配置块再做实际配置。

mpu_region_init_struct mpu_init_struct;
/* disable MPU */
ARM_MPU_Disable();
   
mpu_init_struct.region_number       = MPU_REGION_NUMBER0;
mpu_init_struct.region_base_address = 0x00000000U;
mpu_init_struct.instruction_exec    = MPU_INSTRUCTION_EXEC_NOT_PERMIT;
mpu_init_struct.access_permission   = MPU_AP_NO_ACCESS;
mpu_init_struct.tex_type            = MPU_TEX_TYPE0;
mpu_init_struct.access_shareable    = MPU_ACCESS_SHAREABLE;
mpu_init_struct.access_cacheable    = MPU_ACCESS_NON_CACHEABLE;
mpu_init_struct.access_bufferable   = MPU_ACCESS_NON_BUFFERABLE;
mpu_init_struct.subregion_disable   = 0x87;
mpu_init_struct.region_size         = MPU_REGION_SIZE_4GB;  
   
mpu_region_config(&mpu_init_struct);
mpu_region_enable();
/* enable MPU */
ARM_MPU_Enable(MPU_MODE_PRIV_DEFAULT);

问题是如何产生的

在 GD32H7 手册1.3 存储器映射上可见

0x0000 0000~0x0007 FFFF 划归为 ITCM RAM(来自共享 RAM),但是这个区域又被划归为代码区域。我暂时不太理解其意图。总之就是在内核运行的过程中将该区域认为是 RAM 区,所以有读写可能。

依据参考材料的说法,GD 官方勘误表或任何手册都没有描述这一点。当然官方例程很多时候也没有做到这一点,否则我此前改为 gcc 编译应当是一切正常。只有 ST 官方的甚至 touchgfx 这个图形库手册而非芯片手册中有这样的描述。

M7处理器上,必须防止对外部存储器的推测性访问,否则可能引发高延迟或系统错误。 对于STM32H7R/S,这将影响访问内存的AXI主设备,并显著降低图形性能。 MPU可通过控制可访问的地址范围来防止推测性读取访问。 最简单的方法是使用包含整个内存区域的背景区域,通过将其设置为“强排序,永不执行”来限制访问。 背景区域应定义在默认区域ID-1中,因为所有其他区域的优先级都将高于此区域。 然后,应为需要访问的内存区域定义具有相应设置的其他MPU区域。 在STM32H7R/S上最多可定义16个区域。

也就是这是一个 M7 内核原设计就有的缺陷,而我使用 stm32H7 只是 ST 官方做成芯片时使用某种手段规避了问题,或者甚至只是恰巧没有碰到。

参考资料备查

GD32H7移植NEXTDUO问题

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=125782&extra=

GD32H757ZMT6 仅因 Flash/Load image 布局变化,程序运行稳定性就出现明显差异

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=131926&extra=

更早的手记
2026
DIARY
22
四月
周三
4/22周三

C2000 的特殊内存排布

#54

C2000 DSP 采用16位字节(CHAR_BIT=16),与通常8位系统内存布局不同。U32值0x87654321在C2000中按4321 8765排列,而通常小端为21 43 65 87。浮点123.456对应内存E979 42F6(C2000)与79 E9 F6 42(通常)。此外,C2000要求32位数据按2字节对齐。

15
四月
周三
4/15周三

gitea 的 mail 配置

#53

部署gitea后无法自动发送通知邮件,通过国外论坛帖子而非官方文档找到解决方案。关键配置包括使用SMTP时PROTOCOL设为smtps,QQ邮箱的SMTP_PORT为465而非587,若测试报EOF错误则设置ENABLE_HELO为false。

13
四月
周一
4/13周一

netxduo 包长一致性问题

#52
残片纸堆

在移植ST fork的netxduo进行ping测试时,偶发ETH外设DMA错误导致ping不通。原因是发送包时append指针偶尔小于prepend指针,使包长计算为负,引发DMA错误。临时解决方案是在驱动函数中同步prepend和append指针,并处理零长包以避免问题。

21
一月
周三
1/21周三

SPI 外设的线时钟产生

#51
残片纸堆

作者分享STM32 SPI使用经验:作为主机时,接收API无效,必须使用收发API,因为时钟仅在发送时产生。这意味着即使仅接收数据,也需发送数据以生成时钟。接收API仅适用于从机模式或外部时钟。SPI适合双向通信,单向读取可能浪费缓冲区。文中提及与Copilot讨论时钟生成配置。

10
一月
周六
1/10周六

一个零开销宏做浮点定点分辨率统一管理

#50
残片纸堆

在浮点转定点的应用中,分辨率转换很麻烦。提供了一种宏方法,其对应关系如2-0.01-100,能处理倍乘和倍除。此外,使用辅助函数可以解决四舍五入的小问题。

2025
DIARY
30
十二月
周二
12/30周二

st hal 库的 HAL_Delay

#49
残片纸堆

ST HAL库的HAL_Delay函数以毫秒为单位延迟,但实际延迟比传入参数多1毫秒。已有示例处理此问题,作者记录以备未来使用。

12
十二月
周五
12/12周五

2025·无人的角落自在生活

#48

今年在技术方面,作者研究了HIL设备并实现原型算法,但非兴趣所在且未落地产品;尝试其他项目如parasoft和QEMU但被打断无成果;开源库modbusX收到捐款。旅行方面,去了云南和游轮,享受轻松时光但懒惰未写博客。生活上,工作轻松,经常请假,更喜欢独处,放弃自律。未来迷茫,可能考虑AI+量化交易。

21
十一月
周五
11/21周五

同事向我提问必须掌握的技巧

#47

这篇文章强调清晰沟通的重要性,批评不良提问方式浪费双方时间。提倡提问时详细描述问题现场、操作过程和排查尝试,避免假设他人知晓所有情况。建议一次性编辑完整问题,不分段发送;聚焦目标而非过程;去掉无意义问句;问题解决后给予反馈。核心是高效沟通,避免被标签为不善沟通者,以节省时间并有效解决问题。

15
十月
周三
10/15周三
基米天堂!

基米天堂!

#46
关爱唐氏

基米天堂是一个开源社区,专注于发现和分享哈基米音乐。它提供全端兼容的音乐播放器应用,体验舒适且作者持续更新。但只能播放社区上传的音乐,不支持作为本地播放器使用。

← 更近的手记第 1 页
阅读全文 →
Letter
Post
GD32H7 的 MPU 备查——关于 0x0000 寻址区的配置