1、概述
在通过RTD的SDK也好MCAL也好,始终存在一个问题,生成的代码除了看门狗模块,默认都是放在flash里面,按照正常逻辑来看没啥大的问题,思考一个问题:Flash放在0x100的位置,但是此时我们要操作0x100怎么办?那肯定不允许啊,但是将flash的驱动放在RAM里面就可以避免这个问题的产生。
Flash的特性:PF0能操作PF1,当然PF1也能操作PF0的,以此类推,只要不操作自身,想怎么玩都可以。这也是一个物理特性吧。
2、默认flash存放位置展示
查看flash驱动放在哪里,最方便的方式就是查看链接文件,如下默认的flash在S32K3中是在PF0的。
0x00400000是PF的开始物理地址。
3、通过默认的链接文件将flash放置到RAM
将CODE变为RAMCODE就行了,代码的开头一个结尾一个,这个不要搞错了!
修改后代码存放位置如下
使用时出现的问题:有时候代码量上去了发现这种方式不是特别好使用了,暂时没查出来原因。
4、通过修改启动与链接文件将flash放在RAM
前面先将FLs驱动分配一下
Fls_Drv_Flash : ORIGIN = 0x00498000, LENGTH = 0x00002000 /* 8K*/
int_fls_driver : ORIGIN = 0x00000000, LENGTH = 0x00001000 /* 4KB */
.acfls_code_ram :
{
. = ALIGN(4);
acfls_code_ram_start = .;
. = ALIGN(4);
*(.acfls_code_ram)
. = ALIGN(4);
acfls_code_ram_stop = .;
} > int_fls_driver AT>Fls_Drv_Flash
启动文件修改如下
然后就是将flash驱动包含进去就行了,最好时需要什么包含什么,将所有的Flash驱动包含进去也行的。
结果显示如下
其实S32K3来说将flash驱动放在RAM相对来讲比较简单。
5、RAM热复位数据不丢失
将RAM的某一部分留出来,在APP跳转Boot的时候,这个过程牵涉到软件复位,置位重编程标志位,因为在Boot里面需要判断重编程,所有不能在复位的时候丢失,所以才会用到这个操作。
链接文件使用如下:
int_stack_dtcm : ORIGIN = 0x2000E000, LENGTH = 0x00001000 /* 4KB */
int_flash_con : ORIGIN = 0x2000F000, LENGTH = 0x00001000 /* 4KB */
留出来4K不让其复位丢失,但是一旦这样子操作就会进ECC,所以启动文件还是要操作的。
启动文件定义寄存器地址
设置RAM地址清零范围
初始化ECC
这样子就可以避免ECC错误了,与此同时不会再热夫为丢失了。