汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

浅谈嵌入式MCU软件开发之startup过程详解

0
阅读(115) 评论(0)

浅谈嵌入式MCU软件开发之startup过程详解(在CodeWarrior 5.1 中实现RAM自定义初始化)

结合之前的两篇分享--浅谈嵌入式 MCU 软件开发之应用工程的堆与栈浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作),今天趁热打铁,基于S12G128这颗业界广泛使用的汽车级MCU,给大家介绍具体如何在CodeWarrior 5.1 中实现RAM自定义初始化

      RAM自定义初始化目标将S12G128的RAM地址0x3F00~0x3FFF的256个字节作为用户自定义区域进行保护,只在每次MCU POR上电复位时才初始化,其他复位发生时,保持其值为复位之前不变;

 

        首先我们来看一下,S12G系列MCU的片上存储器资源地址映射情况:

2.jpg

        从其中可以看到S12G128的RAM地址空间为0x2000~0x3FFF的8KB空间;要对其最后256个字节进行保护,我们需要进行如下操作:


        1.  对其进行分区,将其单独划分出来,并将其命名为USR_RAM,地址范围是0x3F00到0x3FFF(当然这些工程默认RAM就少了256字节,地址范围相应的需要修改为0x2000到0x3EFF,以避免重叠),并将其属性定义为NO_INIT,告诉链接器,在启动结构体—startupData中不收集其初始化信息,即在默认startup过程中,初始化RAM时,不对其进行初始化;其实现过程是在工程prm链接文件的SECTIONS…END段定义中加入如何分区语句:

        USER_RAM      = NO_INIT       0x3F00 TO   0x3FFF;


        2.  将用户定义段PROTECTED_RAM放置到上面的分区USR_RAM中,其实现过程是在工程prm链接文件的PLACEMENT…END放置定义中加入如何分区语句:

        PROTECTED_RAM       INTO   USER_RAM;

        以上两步完成后工程的prm链接文件(关于prm文件的详解,请关注后续文章--CodeWarriorIDE使用tips之prm链接文件详解)如下:


3.jpg

        3.  在用户程序中,通过关键词#pragma DATA_SEG定义需要保护的数据(此处为一个256字节的用户数组)到该用户自定义段

#pragma DATA_SEGPROTECTED_RAM /*declare theuser data segment*/

byteProtected_RAM[256];

#pragma DATA_SEG DEFAULT /*restore to the default segment*/


        4. 利用MCU标志寄存器的POR上电复位标志位(PORF)对该保护RAM区域进行自定义初始化:

 

 

        PORF只有上电复位时才会置1,对其写1清除。不受其他系统复位源(低电压复位、外部RESET管脚复位、非法地址复位、时钟丢失复位和COP看门狗复位)的影响:

5.jpg

 

具体实现C代码语句为:

if(CPMUFLG_PORF==1)       /*if the POR flag is set due to MCU PORreset*/

     {

          Protected_RAM_Init();   /* call to initialise the user protectedRAM*/

          CPMUFLG =CPMUFLG_PORF_MASK;/*clean the POR reset flag by write 1*/

         }

 


6.jpg

        相应的工程的链接结果map文件如下,从中可以看到,用户自定义数据Protected_RAM[256]已经被链接到我们指定的RAM地址空间了,并且该段空间属性为无初始化(N/I):


7.jpg

        注意:这里容易犯的一个逻辑错误是:在if语句判断CPMUFLG_PORF之后,先将其写1清除,然后在初始化需要保护的RAM:由于初始化保护的RAM需要一定的时间,如果这个过程中由于外部干扰或者其他原因出现了POR之外的其他系统复位,则下复位后MCU运行至该if语句时就不会执行该分支,继续完成对保护区域RAM的初始化,从而会出现保护区域RAM全部或者部分未初始化的风险:因此,正确可靠的逻辑应该是先完成对保护区域RAM的初始化,再清除POR上电复位标志。

 

        以上就是跟大家分享的如何在CodeWarrior 5.1 中实现RAM自定义初始化的全部内容。

        虽然本文将介绍的是CodeWarrior 5.1 IDE中RAM自定义初始化的实现方法,但其同样适用于使用prm链接文件的CodeWarrior 6.xCodeWarrior 10.6/7 MagniVS12Z工程。

        本文对应的CodeWarrior 5.1 demo工程可以通过以下百度网盘分享链接下载,以供大家参考学习:

        链接:http://pan.baidu.com/s/1o8Lp9uq

        密码:yly2


胡恩伟

NXP汽车电子FAE


若对本文观点有任何意见和建议欢迎留言指出。

如果喜欢,可以关注本人公众号,阅读更多精彩内容。

1-1.jpg