STM32F10X系列基于标准库——CLASSB库移植

        最近公司在弄一些软件上认证工作,刚好需要到了ST的一个自检库,CLASSB库。就是对MCU的一个自检,启动时、运行时,对MCU的寄存器、RAM\ROM等进行自检,如果不通过,则进入故障函数。在移植CLASSB时,遇到了几个问题,在这里记录一下哈哈~

        是基于STM32F103VC标准库 移植的CLASSB。移植的第一步,先去ST官网下载相关的例程以及相关的说明文档CLASSB - 工具与软件 - Search STMicrocontrollers,我用的是STM32-CLASSB-SPL:

        下载完成后,解压后,安装F1的驱动,自动生成一个例程文件夹,里面有官方提供的一个自测库STM32F10x_SelfTestLib,只需要移植这个库到我们的实际工程即可。

         把这个文件夹的.c文件全部添加到实际工程中:

  1、加载文件的修改

  添加完成后,把例程中的加载文件也加载到实际工程中,并按照实际工程程序的地址进行修改 :

  1. 按照实际工程的程序开始地址与大小进行修改。
  2. 将存放FLASH 32CRC检验值的CHECKSUM存放在程序末尾,*.o (CHECKSUM, +Last)。
  3. 将ST CLASSB库例程中的相关bat中设置的移植过来

2、 CPU启动测试文件修改

         一开始,按照例程中的来运行,发生在Stack pointer (Register R13)这个步骤,会进入FailSafePOR,后面看了一下F4的例程,运行没问题,就直接把F4检测Stack pointer (Register R13)这个步骤的检测代码直接复制过来,神奇的事情发生了,竟然检测通过!!!!!!!这个步骤检测的是MSP指针,其实也可以参考上一个检测PSP来修改。另一种方式就是我上图注释掉的那种方式,把MOVS指令,换成MOV指令,也可以测试通过。具体什么原因MOVS指令不行,我也不清楚,百度了好久都查不出什么原因。。。。。。。。

3 、系统启动文件修改

        根据实际工程需要的启动文件,移植例程相对应的启动文件,我的工程用到的是hd.s,直接移植整个文件即可。

4 、SysTick_Handler()函数修改

 

将例程中SysTick_Handler()的内容全部复制到实际工程的SysTick_Handler()函数中使用。

 5 、调试相关代码修改

        实际工程中没有使用到屏幕,以及串口,将上图所述代码屏蔽掉。

 6 、RAM自检相关代码修改

        这部分自检,需要把RAM的数据全部清0,所以需要先把RAM的数据备份,自检完成后,重新写入。F1的RAM自检运行时,有点问题,后面参考了F4的RAM自检部分代码,下面是RAM自检第一个步骤的代码,其他步骤原理一样:

ErrorStatus STL_FullRamMarchC(void)
{
 ErrorStatus Result = SUCCESS;
uint32_t *p;       /* RAM pointer */
 uint32_t j;        /* Index for RAM physical addressing */
 uint32_t RAM_Val = 0;
/* ---------------------------- STEP 1 ----------------------------------- */
/* Write background with addresses increasing */
for (p = RAM_START; p <= RAM_END; p++)
   {
 /* Scrambling not important when there's no consecutive verify and write */
            RAM_Val = *p;
			*p = BCKGRND;
               if ( *p != BCKGRND )
       {
          Result = ERROR;
       } 
 *p = RAM_Val;
   }
/* ---------------------------- STEP 2 ----------------------------------- */
//
/* ---------------------------- STEP 3----------------------------------- */
......
}

7 、STL_StartUp()函数修改

        将开始main函数之前控制流检测的第二个判断条件屏蔽掉,如上图位置。

8 、main函数修改

        在实际的工程main函数中添加上图两个函数,进行自检相关初始化以及运行中对相关寄存器、FLSAH等相关的检测。

9、 FLASH 校验相关代码修改

1、 程序开始地址修改

         根据实际工程程序开始地址做相对应的修改偏移。

2 、添加相关驱动文件

 下载srecord相关,在工程添加脚本,在每次编译时生成带CRC检验的.hex,脚本内容如下,

 关于脚步内容解析:成功实现MDK自动生成hex文件的crc值并附加到hex文件末尾(bin也支持),然后跟STM32的硬件CRC计算值做比较_wx6319913926827的技术博客_51CTO博客

 其中0x08004000是我程序开始的地址,0x08013e40是FLASH 32CRC检验值的CHECKSUM的存放地址,也就是程序结束地址。

3、添加驱动文件.ini :

 .ini内容如下,把生成带有CRC校验的.HEX的路径添加进去即可:

LOAD .\BMMU_RELEASE\BMU-M-APP-CRC32.hex INCREMENTAL

(\BMMU_RELEASE\BMU-M-APP-CRC32.hex 是我存放M-APP-CRC32.hex的路径)

 10 、STL_InitRunTimeChecks()函数修改

如果main函数中已经有喂狗,这个地方不再需要喂狗,注释掉。 

 到此,移植工作全部完成!具体的检测要求,需按照具体的认证要求进行仿真运行检测。