|
将一款产品从停产的旧单片机迁移到STM32中,原项目使用外部 EEPROM 存储大量配置参数,能有几百 KB。这些参数以每页 1KB 的形式存储,且每页的格式都不相同。 移植到STM32时必须保持完全相同的存储格式来保存这些配置。 举个例子:页 0 偏移地址 0 存储一个 uint8_t 类型的产品类型;偏移地址 1 存储一个 uint16_t 类型的产品子类型;偏移地址 3 存储另一个 uint16_t 变量,以此类推。 我们必须为每个变量指定绝对固定的存储位置,因为系统会在开机时从 EEPROM 加载配置到 RAM,关机时再从 RAM 写回 EEPROM。同时还有一个上位机软件用于修改这些配置:软件会直接告知单片机,我要读取页 0 偏移地址 1 的 uint16_t 变量,或者向这个地址写入数值 2。 所以,要让整套系统正常工作,所有变量的地址都必须提前定义且绝对固定不变。 在旧单片机上,我们可以直接这样写: uint8_t product @0; uint16_t product_subtype @1; uint16_t product_subtype_2 @3; 之后我们只需要一个简单的 for 循环,就能在 RAM 和 EEPROM 之间批量读写整个配置区,上位机也是同样的逻辑。 在stm32上如何实现这样的寻址,之前的编译器 / 链接器不需要修改任何 .ld 链接脚本就能实现这个功能。 |
局部变量初始化时未赋值会导致什么后果
在 STM32CubeIDE 中使用 RTOS 代理
ST TOF问题请教
STM32F407 USB 发送数据 上位机接受不到
请问我的CubeMX为什么初始界面没有ai选项,进去之后也没有addnetwork?
ST Motor Control Workbench卡在如图界面,生成不了代码
SDIO 标致位 没有变
程序卡死在USB_EPStartXfer这里
SDIO 初始化 死在 __HAL_RCC_SDIO_CLK_ENABLE语句上
我现在使用STM32F446ZET6芯片,外挂了16m的片外SDRAM。想把程序在SDRAM中运行,一直尝试没有成功,希望得到帮助,是否有相关的例子或参考的文档
微信公众号
手机版
这是标准化的问题,但跟所用编译器又有点关系。
你可以就你的IDE环境跟AI交流交流,相信你可以找到答案。
1.从数据手册上看,FLASH的改写需要先擦除一个 sector (16k 或 64K)全部为FF后才能写入新的数据。且次数有限制。它不像外置EEPROM那样之间对指定地址写而不影响周边数据。
2.单纯定义成常量,像程序一样烧录进去是可以的,通过命名读取也是能行的通的(通过修改 ld 文件以及相关初值定义)。
所以目前看来,存有可能达到你的期望,写从物理结构上是不可行的。所以还是采用外部EEPROM 才方便一些,并且次数可以达到4百万次以上(以ST的EEPROM 手册参数参考)。
看你的应该是 使用的IAR,使用MDK AC5就是:
// 将一个数组定位到RAM地址0x20001000 uint8_t buffer[1024] attribute((at(0x20001000)));
AC6是这样:
int myVariable attribute((section(".ARM.__at_0x20001000")));