英飞凌芯片使用记录:程序运行放在RAM,规避ECC错误,操作Flash注意点
目录
5、Tasking生成的HEX不是按照PFLASH的页大小作为start,或者存在多个程序块需要合并的方式。
1、程序放在RAM运行的方法(Tasking)
? ? ? ? 在程序里面调用PF驱动的时候,假设程序放置在PF0,那么可以操作PF1,放置在PF1可以操作PF0,也可以放置在RAM,这样PF0与PF1均可以操作了。
? ? ? ? 通过Tasking将代码放置在RAM的方式,注意点,RAM分为PSRAM与DSRAM,运行的程序需要放置在PSRAM里面。玩玩不可以放在DSPR里面的,一旦放置在了DSPR里面,那么就无法执行了。
? ? ? ? 1、链接文件
memory psram0 // Program Scratch Pad Ram
{
mau = 8;
size = 64k;
type = ram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xc0000000, size=64k, priority=8);
map (dest=bus:sri, dest_offset=0x70100000, size=64k);
}
/* PSRAM Code selections*/
section_layout :vtc:linear
{
/*Code Sections, selectable with patterns and user defined sections*/
group
{
/*Program Scratchpad Sections*/
group
{
group code_psram0 (ordered, attributes=rwx, copy, run_addr=mem:psram0)
{
select "(.text.cpu0_psram|.text.cpu0_psram.*)";
select "(.text.psram_text_cpu0|.text.psram_text_cpu0.*)";
}
group code_psram1 (ordered, attributes=rwx, copy, run_addr=mem:psram1)
{
select "(.text.cpu1_psram|.text.cpu1_psram.*)";
select "(.text.psram_text_cpu1|.text.psram_text_cpu1.*)";
}
group code_psram2 (ordered, attributes=rwx, copy, run_addr=mem:psram2)
{
select "(.text.cpu2_psram|.text.cpu2_psram.*)";
select "(.text.psram_text_cpu2|.text.psram_text_cpu2.*)";
}
}
}
}
2、代码部分执行
#pragma section code "psram_text_cpu0"
void Function(void);
#pragma section code restore
这样就可以将对应函数放置在RAM? PSPR区域内了。
? ? ?2、Tc3xx读取PF的时候关闭ECC错误方法
????????? 当然,这样子还不行,这样子读取PF会报ECC错误的,这个时候就要关闭ECC错误,主要的寄存器如下。
关闭ECC的代码如下
uint16 cpuWdtPsw = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
uint16 safetyWdtPsw = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_clearCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// clears the endinit protection
MODULE_CPU0.FLASHCON1.U = 0x00010000;
Ifx_Ssw_setCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// sets the endinit protection back on
Ifx_Ssw_disableSafetyWatchdog(safetyWdtPsw);
开启ECC的代码如下
uint16 cpuWdtPsw = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
uint16 safetyWdtPsw = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_clearCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// clears the endinit protection
MODULE_CPU0.FLASHCON1.U = 0x02020000;
Ifx_Ssw_setCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// sets the endinit protection back on
Ifx_Ssw_disableSafetyWatchdog(safetyWdtPsw);
3、看门狗驱动放置在RAM避免总线错误。
? ? ? ? 在调试PF擦除的时候,发现利用tc3xx本身的WDG模块调试,一旦调用写入或者擦除函数,就会进异常,感觉很奇怪,后来,通过屏蔽代码的方式查看错误源,一旦不使能看门狗就能正常,想着将WDG放置在PSPR RAM尝试下,可以实现功效。所以,部分时候当出现总线错误的时候,不妨将代码放置在PSPR RAM尝试一下。
4、Debug RAM与Debug Flash的区别
? Debug RAM
链接所有的应用程序到RAM存储器,下载代码到RAM存储器。这可以加快代码的运行速度。
? Debug Flash
普通内置闪存,没有一些优化和其他调试选项。该配置用于调试项目。
????????通过选择根文件夹更改目标配置,然后右键单击,单击Build Configurations >> Set
Active >> <your_build_config>
????????要构建项目,请选择您的文件夹并单击工具栏中的构建图标。(您可以选择哪个目标编译)
5、Tasking生成的HEX不是按照PFLASH的页大小作为start,或者存在多个程序块需要合并的方式。
合并后如下
????????还有一种情况是,例如Block 1的Start at 0x8006B821,不能被32整除,那么烧录时候,flash无法正常烧录,为了规避这种情况,只需要在Tasking编译器里面设置如下操作即可。
--concatenate-sections
6、Tasking的对其方式
? ? ? ? 部分时候,假设ASW与BSW通过不同的编译器实现,例如OEM特有的CodeSys,会遇到一个问题,字节对齐问题,在Tasking里面uint16与uint32分别占用2与4字节,假设结构体里面CodeSys认为uint16的数据也是4字节对齐,占用4个字节,但是TASKING对uint16只占用2字节,当代码集成在一起的时候,举个例子吧
codesys? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tasking
uint16? a ;? ? ?0x0000? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??uint16? a ;? ? ?0x0000? ? ?
uint32? b;? ? ? 0x 0004? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?uint32? b ;? ? ?0x0002? ? ?
此时b的地址信息是冲突的,对codesys来说,导致a的值是错误的,b的值也是错误的。
通过tasking属性更改可以解决此问题。
--eabi=-half-word-align
half前面可以是-表示半字,+表示双字
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!