IAR FOR ARM 关于运行时修改FLASH数据的问题
论坛的各位大神么,请教个问题。我在程序初始化时,在FLASH 定义一个数组,
在.ICF中定义
place at address mem:0x08002000 { ro section .ImageTest };
在主函数里
__root const unsigned char vSetRate_pre @".ImageTest" =
{
1,2,3
};
我想在运行时改变 vSetRate_pre数组内容并保存到FLASH中,掉电后开机,就是改变后的数组内容。
怎么能实现这个功能,请高手指教!
~~~
先谢谢大伙了!~
难道这个问题很难?
或者是我的思路错了? IAP先到sram中,然后写入一个page 我补充一下。
你可以在片内flash中高地址划出一段空间做数据保存,例如片内flash对应地址0x00000000-0x00007FFF这样有32k如果你的程序代码是20k,那你还有高12k可以用。对这12k操作,建议如果你需要5k那你可以高地址中选一段。最简单的是用memcpy()这个C函数,怎么用你去查C的标准库里有,可直接对地址操作,即把某地址开始的一段数据整个半到某地址开始处,所以就是在arm上电重映射后你要看手册他个外设内部flash,sram等对应的地址,在程序中假如你通过串口收到数据在RAM中,那取这段数据首地址和长度把它用memcpy()存到flash之前说的那5k的首地址开始往后该长度存放。记住重映射后对应的地址,不同处理器有不一样。
还有一种方法我不会,在启动代码里划分flash,这是一种最根本的方法,难度是要研究启动代码,这需要非常熟悉开发环境如ADS,IAR的手册对启动代码的配置,和对目标处理器的启动的熟悉。
我不会再启动代码中划分flash,我用的是IAR FOR ARM .有用过的高人请不吝赐教。在此先谢了。 回复【2楼】kekele
我补充一下。
你可以在片内flash中高地址划出一段空间做数据保存,例如片内flash对应地址0x00000000-0x00007fff这样有32k如果你的程序代码是20k,那你还有高12k可以用。对这12k操作,建议如果你需要5k那你可以高地址中选一段。最简单的是用memcpy()这个c函数,怎么用你去查c的标准库里有,可直接对地址操作,即把某地址开始的一段数据整个半到某地址开始处,所以就是在arm上电重映射后你要看手册他个外设内部flash,sram等对应的地址,在程序中假如你通过串口收到数据在ram中,那取这段数据首地址和长度把它用memcpy()存到flash之前说的那5k的首地址开始往后该长度存放。记住重映射后对应的地址,不同处理器有不一样。
还有一种方法我不会,在启动代码里划分flash,这是一种最根本的方法,难度是要研究启动代码,这需要非常熟悉开发环境如ads,iar的手册对......
-----------------------------------------------------------------------
我回答一下。
在STM32F103xE片上FLASH中划分SECTION的代码示例如下:
define region PIC_region = mem:; // 将FLASH 512kB空间中最后的307200个字节的空间用来存放一张480x320的图片
place in PIC_region { section DemoPic}; // 定义划分段
为防止发生错误,前面由IAR生成的定义量应该修改
define symbol __ICFEDIT_region_ROM_end__ = 0x08034FFFF; // 0x807FFFF; // 为避免IAR编译时将程序段放到末尾307200字节中,将程序ROM段地址与图片存储空间重合的部分去掉。 回复【3楼】Austin_Hsu
-----------------------------------------------------------------------
我想再问下
请问如何在IAR上的Debug或Release处设置成 Flash 或 RAM等格式啊?本来想截下图的,可是不知为什么传不上去,所以只能这么讲了。如哪位好心人想帮我但不明白的 请加我QQ :1634779959我详细说明下! 在此, 小生,先谢过了! 我用怎么报错。Error: "mem" must be either a memory name or a region name
页:
[1]