英飞凌芯片使用记录:程序运行放在RAM,规避ECC错误,操作Flash注意点

2023-12-14 16:54:00

目录

1、程序放在RAM运行的方法(Tasking)

2、Tc3xx读取PF的时候关闭ECC错误方法

3、看门狗驱动放置在RAM避免总线错误。

4、Debug RAM与Debug Flash的区别

5、Tasking生成的HEX不是按照PFLASH的页大小作为start,或者存在多个程序块需要合并的方式。

6、Tasking的对其方式


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前面可以是-表示半字,+表示双字

文章来源:https://blog.csdn.net/weixin_43580890/article/details/134465797
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。