目 录CONTENT

文章目录

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

moke
2024-07-11 / 0 评论 / 0 点赞 / 70 阅读 / 0 字

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 ;     0x0004                                 uint32  b ;     0x0002

此时b的地址信息是冲突的,对codesys来说,导致a的值是错误的,b的值也是错误的。

通过tasking属性更改可以解决此问题。

--eabi=-half-word-align

half前面可以是-表示半字,+表示双字。

博主关闭了所有页面的评论