[STM32F0] 将闪存相关函数放置在 STM32F030K6T6 的 RAM 中

[复制链接]
529|11
石榴大王 发表于 2025-9-21 21:08 | 显示全部楼层 |阅读模式
我正在测试闪存进行写入和读取,同时通过串行 DMA 连接蓝牙。当我在 STM32CubeIDE 中写入闪存时,显示“Target is not responding, retrying...”,而 DMA 串行与蓝牙的通信仍在继续。但有时当我使用蓝牙的其他功能需要再次写入闪存时,一切都会停止运行。在写入之前禁用了中断,这有所改善,但我想按照一些资料中提到的将函数转移到 RAM 中。只是我不知道该怎么做,从哪里获取链接器?需要如何修改链接器?如何修改 RAMfunc?
我正在使用 STM32F030K6T6,我已经读过了关于无中断写入闪存的应用笔记,但不知道如何修改链接器或如何实现 RAMfunc。

公羊子丹 发表于 2025-9-22 07:21 | 显示全部楼层
你遇到的现象很正常,F0 系列在写内部 Flash 的时候 CPU 是会停等的,所以串口 DMA 还能跑,但中断处理不了。
周半梅 发表于 2025-9-22 07:22 | 显示全部楼层
放 RAM 里执行就是在链接文件里单独建个段 .ramfunc,然后在函数前加 __attribute__((section(".ramfunc")))。
帛灿灿 发表于 2025-9-22 07:23 | 显示全部楼层
CubeIDE 的链接脚本在 STM32F030K6TX_FLASH.ld,可以在 RAM 区域下面加一段 MEMORY 和 SECTIONS。
童雨竹 发表于 2025-9-22 07:24 | 显示全部楼层
修改链接器后要注意把 .ramfunc 放在 SRAM 区间,启动代码会负责拷贝到 RAM。
万图 发表于 2025-9-22 07:24 | 显示全部楼层
ST 的例程里有 __RAM_FUNC 宏,你直接用就行,定义在 stm32f0xx_hal_conf.h 里。
Wordsworth 发表于 2025-9-22 07:25 | 显示全部楼层
DMA 串口是外设直接搬数据,所以写 Flash 的时候还能收,但应用停了就是因为中断被屏蔽。
Bblythe 发表于 2025-9-22 07:27 | 显示全部楼层
建议还是在写 Flash 前关中断,写完再开,比 RAMfunc 更容易实现。
Pulitzer 发表于 2025-9-22 07:29 | 显示全部楼层
如果要在写的时候保持通信,就得保证处理函数在 RAM 跑,不然还是会卡。
Uriah 发表于 2025-9-22 07:29 | 显示全部楼层
AN4061 里有写 Flash 的注意事项,特别是关于在运行时写的限制。
Clyde011 发表于 2025-9-22 07:30 | 显示全部楼层
你可以先试个简单函数搬到 RAM,看能不能跑通,再慢慢把 Flash 写入函数迁过去。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部