1.STM32CubeProgrammer使用
使用STM32CubeProgrammer的命令行模式之前,需把STM32_Programmer_CLI.exe的目录添加到环境变量PATH中。
-sl命令:通过添加加载区(段)来修改固件文件,加载区(段)中包含有用户程序计算出的CRC值。
-sl <file_path> <start_address> <end_address> <slice_size>
<file_path>:文件路径(bin、elf、hex或Srec)
<start_address>:闪存起始地址
<end_address>:闪存结束地址
<slice_size>:每个CRC值对应的数据区块大小
闪存程序存储器分为多个slice,对于每个片段分别计算CRC值并将其置于CRC区域中,CRC区位于闪存末尾。CRC区域中的CRC值根据闪存中用户程序的位置依次放置。
IDE的命令行添加后处理命令:STM32_Programmer_CLI.exe -sl "$PROJ_DIR$\Release\Exe\Project.bin" 0x08000000 0x08040000 0x400
CRC区域的地址和大小确定如下:
CRCs_Area_Size = Flash_Size / Slice_Size * 4 bytes, so 0x40000/0x400*4=1 Kbytes
CRCs_Start_Address = Flash_End_Address - CRCs_Area_Size, so 0x08040000-0x400=0x803FC00
执行此命令,先扩充bin至256KB,每1KB计算一个4bytes CRC值,放在0x803FC00开始的地方。
CRC区域内的CRC范围地址计算如下:
@=CRCs_Start_Address+(UserProg_Start_Address-Flash_Start_Address)/Slice_Size*4 bytes
2.X-CUBE-STL self-test libraries
1.ST分别提供了对应的功能安全设计包:
SIL功能安全设计包,针对IEC61508标准,覆盖STM32系列产品。
ASIL功能安全设计包,针对汽车行业的ISO26262标准,支持STM8AF系列MCU。
ClassB功能安全设计包,针对家电应用领域的IEC60335-1/60730-1标准,覆盖STM32和STM8系列产品。
2.使用X-CUBE-STL 自检库,单个STM32最高可以满足SIL2的要求,要达到SIL3系统必须是两颗STM32的1oo2架构,保证当一颗MCU出现故障后,系统还可以正常工作。
3.ST提供的SIL自检库只是实现功能安全所需的安全机制的子集。用户可以将自检库压缩包中的库文件添加到实际工程中,该自检库仅包括对CPU,FLASH和SRAM这些与具体应用无关部分的检测。用户还要再根据实际工程的需要,参考安全手册中列出的安全检测机制,自己通过代码实现其他的检测。比如用到了中断或者I2C,而且跟安全功能相关,就要根据安全手册中这两部分的内容,添加额外检测代码。
4.与终端用户的具体应用无关,与编译器无关,与HAL、STD、LL等库无关,与BSP、CMSIS无关。官方使用HAL库,此测试使用LL库进行。
5.The claimed diagnostic coverages of medium (90%) for CPU and RAM tests and high (99%) for ROM test can be confirmed.
6.终端用户必须满足Table 7. Conditions of use for X-CUBE-STL-F4所有条件,因为任何关于诊断能力的声明都是基于此假设。
3.测试项
3.1 CPU
CPU的测试包括以下内容:
• TM1: implements the test of general purpose register
• TM1L: implements a simplified version for the test of general purpose register
• TM2: implements the test of arithmetic functions
• TM3: implements the test of multiplier functions
• TM4: implements the test of control flow instructions
• TM5: implements the test of load/store unit(s)
• TM6: implements the test of shift and rotate functions
• TM7: implements the test of both stack pointers, MSP and PSP
• TM8: implements the test of pipeline functions
• TM9: implements the test of the Arm Cortex M4 DSP functions.
• TM10: implements the test of the FPU register bank. This TM must not be used by the application unless the FPU is activated.
• TM11: implements the test of the FPU functions. This TM must not be used by the application unless the FPU is activated.
TIM1和TIM1L可以任选一项。
另外有两项测试比较特殊:TM8 and interrupts TM11 and specific FPU interrupt。
3.2 Flash
定义了4种Flash区域类型:
Block,连续的4字节(FLASH_BLOCK_SIZE)区域,在STL中固定写死。
Section,连续的1024字节(FLASH_SECTION_SIZE)区域,与物理扇区无关,在STL中固定写死。
Binary(用户程序),编译器提供的连续的一段代码区,往往从段首(每个1024字节区域的开始)开始,但结尾不一定用完一整段,所以需要32位对齐。
Subset,除CRC数值以外的可用连续区域。用户程序可以定义一个或多个Subset,一个subset必须位于Binary区域内,起始地址以32位对齐。当Subset的最后Section是Binary的最后一部分时,该部分可能不完整,用户应用程序必须将Subset的末尾与Binary区域的结束地址对齐。如果一组完整的section被单独测试,Subset的结束地址必须与最后一个测试section的结尾对齐。
Subset size = K * FLASH_SECTION_SIZE+ L * FLASH_BLOCK_SIZE
– K is an integer ≥ 0
– L is an integer < (FLASH_SECTION_SIZE / FLASH_BLOCK_SIZE) – only when the last section of a binary is incomplete
即子集大小为:0或多个1024字节区域 加 总和小于1024字节的若干个4字节区。
计算Flash的N值要参考map文件,要使得EndAddr正好是用户程序的最后地址,否则测试不通过。
Unused ranges:
From To Size
0x800'8f00 0x803'ffff 0x3'7100
3.3 RAM
定义了3种RAM区域类型:
Block,连续的16字节(RAM_BLOCK_SIZE)区域,与物理扇区无关,在STL中固定写死。
Section,连续的128字节(RAM_SECTION_SIZE)区域,在STL中固定写死。
Subset,32字节整数倍的连续区域,起始地址以32位对齐。Subset的大小不需要是128字节的整数倍,最后一个Subset可以比128字节小。
Subset size = N * RAM_SECTION_SIZE+ 2 * M RAM_BLOCK_SIZE
N is an integer ≥ 0,M is an integer < (RAM_SECTION_SIZE / (2 * RAM_BLOCK_SIZE))
即子集大小为:0或多个128字节区域 加 总和小于128字节的若干个32字节区。
4.诊断时间问题
官方测试条件如下:
Compiled SW configuration with:
– AHB clock set to 80 MHz
– Flash latency set to 4 wait states
– Flash prefetch enabled
– Nucleo STM32L476RG, board MB1136 Rev C
采用硬件CRC的情况下,诊断128KB SRAM 消耗72346μs;诊断17KB Flash消耗550μs;在此基础上再加诊断CPU的部分,共消耗73727μs。这个时间非常之长,因此需要严格控制安全相关的代码ROM和数据RAM容量,尽量缩短诊断间隔时间,以提高响应速度。
移植到STM32L431CC,STM32L431CC共有256KB Flash,64KB SRAM。
测试例程共测试了约64KB RAM和36KB Flash,其他测试条件同上,所有测试耗时38ms,接近官方数据。