STM32 Sidekick,官方 AI 开发随身助手
加持快速解决开发问题、获取技术支持
STM32L5入门课程(一) 从Cortex-M33内核认识TrustZone
STM32L5入门课程(三) TrustZone环境下新的用户编程模型
STM32L5入门课程(四) STM32CubeMX:支撑TZ应用
STM32L5 进阶课程系列(八) SRAM、Flash和启动机制的最新安全特性
STM32L5 进阶课程系列(九) Cache,为STM32L5提速助力
STM32L5 进阶课程系列(十) DMA,兼顾传输灵活性和TZ架构下的安全性
STM32L5 进阶课程系列(十一) OTFDEC,无缝扩大代码的安全存储空间
STM32L5 进阶课程系列(十二) PKA, 非对称加解密 加速引擎
我将会和大家分享具体的产品特性,围绕着今年我们新推出的STM32L5,从通用的“高性能、低功耗”角度切入介绍,再以“信息安全”这个重点应用,详细展开,做一个全面分享。
我分享的内容包含三个部分:
第一,L5在高性能和低功耗方面持续保持的优异成绩;
第二,作为ST第一颗基于ARM Cortex-M33 带TrustZone扩展的MCU,“安全” 是它与生俱来特点。L5的安全特性,除了TrustZone,还有更多硬核安全机制。
第三,围绕芯片本身,我们搭建了STM32L5丰富的生态系统,便于在座各位快速上手和使用。
现在我们来探究一下,STM32L5是如何兼顾高性能和低功耗的
STM32L5基于ARM Cortex-M33内核,主频最高跑在110MHz。内核方面,从DMIPS跑分来说,CM33的性能比CM4增强了大约20%。
光看这些数字,有些人可能会心里暗自嘀咕:STM32L低功耗系列产品中,同样基于CM4内核的,L4+主频更高,可以到120MHz;其他厂家同样基于CM33内核的,有些可以主频到150MHz。这样看起来,L5的性能好像也不是那么显著嘛。
那么,我要强调一个概念:高性能,是一个系统的事情,不仅仅是靠主频高低来判断。
L5上集成了8K字节 ICACHE。从它在系统架构图中的位置,我们可以看到,ICACHE能对L5的片上Flash做加速,也可以对片外Flash做加速。而且它的设计集成了各种优化策略,可以在cache miss的情况下,尽量降低失效延迟。进一步讲,即使发生cache miss,我们的片上Flash在CPU运行在110MHz时,也仅需要6个时钟的等待周期。
我们来看一个实际的例子:用数字说话。
柱状图高低代表CoreMark跑分,折线的高低是芯片的运行主频。
前两个深蓝色的柱状图,分别是L5运行在片上Flash和片上SRAM的两种情况。可以看出,性能相当。在ICACHE的帮助下,CoreMark这个基准程序,运行在片上Flash时,性能完全不输运行在片上SRAM。
第三个柱状图是某友商CM33内核产品,也是运行在它的片上Flash上,和L5运行在片上Flash时候跑分相比,低了30%还多,但是它的主频却高达150MHz。
这样一对比,大家就不难理解我刚才强调的那个论点:高性能,不仅仅是看主频。L5有Cache和高速Flash的加持,性能高于同类竞品。
接下来看低功耗。评估一款MCU的低功耗做的好不好,一定不能简单地仅仅去看数据手册中的uA/MHz这个参数。而是有很多指标需要去考虑。
首先最直观的, “内核运行功耗”:不言而喻它和运行频率直接相关,但是并非线性关系。主频高了功耗会上去,但是它很快就可以处理完任务进入睡眠模式,在固定时间段内的平均功耗说不定会比一个运行功耗低但是运行耗时更长的系统,总体来说功耗更低。这就涉及到一个“系统能效”的概念。另外,很多应用会让内核停止工作而让外设继续工作,那么“外设是否可以独立于内核运行“,对系统平均功耗的影响也不容小觑。从一个整体上来讲,系统的低功耗模式越灵活,用户越能针对具体的应用做精确调整,使得最终的平均功耗越低。
任何MCU都是为了完成某项任务,因次我们不能只谈功耗,不谈任务。每个用户的应用不同,代码不同,无法做横向比较。但是通常来讲,都可以抽象为图中的模型:内核运行一段时间后停止工作,外设继续工作,完成任务后整个系统进入休眠,直到被外部事件唤醒或者自动周期性唤醒。基于这样的模型,国际第三方标准评估机构EEMBC制定了一套针对MCU低功耗性能比较的基准运行程序:ULPMark:
CP, core profile:主要考量内核在“休眠” 和“唤醒” 状态间切换产生的功耗。
PP, peripheral profile:主要针对外设运行的功耗评分;
CM:针对CPU性能效率的评分。
在这个抽象运行模型图中,uA/MHz仅仅只能cover到运行功耗一个局部,完全不能代表整个系统的低功耗水平。
在ULPMark评分榜上,L5也是处于名列前茅的位置。
那么L5在低功耗方面都做了哪些优化呢?
供电方面,STM32L5首次推出了内置SMPS的P/N,尾缀为字母Q。高效的电源转换效率,是整个系统低功耗的基础。在刚才的AI演示视频中,可以直观看到当SMPS被关掉后,运行功耗整体就往上抬了。
同样是在L5上首次集成的ICACHE,降低了对慢速Flash设备的访问几率,减少内核等待时间,提高运行效率从而降低功耗。
L5支持多种系统低功耗模式,可供用户根据自己实际应用场景,灵活选择和搭配,这一点继承自STM32L4
像LPTIM、LPUART、BAM模式也都是继承自STM32L4的优秀低功耗基因和特性。
所谓BAM模式,batch acquisition,批量查询,即内核在Sleep或者LP Sleep状态下停止运行了,外设和DMA依然可以工作,收集到指定数量的数据后再唤醒CPU来做一次数据处理,处理完后CPU再次进入休眠模式,如此循环。BAM模式可以应用于多种对功耗有高要求的场合,非常受客户欢迎。
L5与L4的低功耗模式基本类似,用户根据可以接受的唤醒时间和唤醒源,以及SRAM内容是否需要保持等因素来决定使用哪种低功耗模式,整体来说,睡眠得越深,功耗越低,所需要唤醒时间也越长,唤醒源也越少。
其中最常用的是Stop2模式,能够达到较低的功耗,唤醒后可以从进入睡眠的地方继续运行。当系统进入Sleep模式,内核时钟停止,外设继续运行,是BAM模式的基础。
以上,我们从性能和功耗两个通用方面,介绍了L5的优异表现,接下来我们把注意力放到L5的重要安全特性,从整体到局部,从需求到方案,来做详细阐述。
首先,开章明义第一点,这里说的安全,是指信息安全,information security,不是功能安全functional safety。像针对家电应用ClassB、工业应用IEC 61508这些功能安全,STMCU也免费提供全套认证软件库和文档,但不在今天讨论的话题范围。
说到信息安全,很多人一来就会想到加解密。加解密,仅仅是安全应用中的一个环节,或者说一个工具,我们不能管中窥豹只见一斑。在具体展开之前,我要先放出今天我的第三个论点:安全,不仅仅是加密。在设备端,“隔离” 非常重要。
TrustZone架构给我们提供了隔离的硬件基础。并且L5除了TrustZone,还有更多“代码和执行保护” 硬件单元和软件资源,帮助我们实现设备端的信息安全。
以前在做产品的时候,大家可能更多偏重功能设计,对信息安全的考虑比较少。随着iot时代到来,有安全漏洞的联网设备,正面临与日俱增的网络攻击。并且,随着设备功能的日益复杂,所暴露出来的攻击面也更大。即使设备不联网,它们出厂后可能遭遇的克隆和软件IP盗取,也是大家最为关心和亟待解决的痛点。这些都是信息安全能帮助解决的问题。
另外一方面,各国也在陆续出台安全法律法规,对电子设备抗击安全攻击做了要求和规范。这就对我们在设计开发产品时提出了强制性要求。而各个行业认证与标准的推出,也促进了电子设备在信息安全方面的健壮。过了某些行业认证的产品,就代表着一定的抗攻击安全性。
这些都是我们在设计和开发产品时,考虑信息安全的政策和行业背景。
STM32Trust的出现就是为了帮助客户实现产品中的信息安全,它整合了信息安全相关的各种资源,包括芯片、文档、软件工具等,并且提出了一系列安全功能来更好地契合来自客户和安全标准的一些典型安全需求,STM32Trust的资源,覆盖众多的STM32产品系列,在此基础上还可以进一步配合STSAFE安全芯片来实现更高级别的安全防护。
STM32L5也是STM32Trust 生态系统的一部分。接下来,针对一些典型的安全功能,我们结合STM32L5的硬件特性,来介绍如何实现这些安全需求。
针对这众多的安全需求,STM32L5也随之提供了一揽子从软件、硬件、工具、服务等四个维度的安全功能支撑。
左下角是信息安全相关的硬件特性:基于带TrustZone安全扩展的CM33内核,为整个系统提供了硬件隔离机制。丰富的加解密硬件引擎,加速运算密集型的密码学操作。存储与执行保护单元,大家熟悉的读保护、写保护是其中之一,但是L5能提供的还远远不止这些。
左上角是软件库和参考代码。包括X-Cube-Crypto,密码学算法库,支持国际主流标准算法,包括纯软件实现,和基于加解密硬件引擎实现的两种版本。X-CUBE-SBSFU是解决安全启动,安全固件升级问题的参考代码,用户可以免费获得源码,集成到自己应用中。TFM和SBSFU的功能类似,是基于ARM的PSA框架。
右下角是STM32Cube工具家族,作为生态系统的一个重要组成部分,相信大家都已经很熟悉了。
右上角框图里的SFI,是ST给出的解决开发者私有代码在不可信烧录产线如何进行安全烧写这个问题的解决方案。TEE依托trustzone硬件架构基础,搭建出STM32L5上的嵌入式可信执行环境。TEE方案的提供来自我们中国的安全应用合作伙伴。


我们先来看安全需求中的“隔离”。隔离 ,是信息安全的基础。在以往的STM32产品中,我们也有隔离机制,比如MPU,Firewall,PCROP。
现在STM32L5采用了ARMv8-M架构下的TrustZone机制,在同一颗芯片上实现了两个世界,安全世界和非安全世界,它们同时存在于同一颗芯片上,但是物理机制又保证了两个世界有可靠的隔离。这种隔离更加全局化。
在没有使能TrustZone时,这也是STM32L5出厂后的缺省状态,4G空间内的资源,从内核寄存器到存储区域,到各个外设模块,和以往一样。
使能了TrustZone之后,在内核看来,4G空间里的资源,有的是安全的,图中绿色表示;有的是非安全的,图中红色表示。比如,RAM和Flash,有些部分是安全的,有些部分是非安全的;外设,像Timer、UART可以配置成安全或者非安全;
还有些外设,比如DMA或者GPIO,可以配置自己的某些部分,比如某些通道或者引脚是安全的,其他部分又是非安全的。在内核看来,安全状态的时候它可以访问所有资源;在非安全状态时,它只能访问非安全资源。
为了配合内核的TrustZone概念,STM32L5在内核外实现了专有TZ管理模块,来把隔离的概念从内核延伸到了整个片上系统。
一方面是内核看出来的,哪些是它眼中的安全资源,哪些是它眼中的非安全资源。
另外一方面,片上的资源,无论是外设还是片内存储区、片外存储区,都有机制来配置自己的安全属性。
这样子,整个访问链路,我们可以看到,前半程:CPU发出的访问,要先经过CM33内核的访问安全规则检查。通过检查的AHB访问,携带着内核机制判断后给予该访问的Secure或者Non-secure属性来到AHB总线上
后半程:由各个片上资源,做第二级访问安全规则检查。合法的访问才会给与应答。
概念就是这个概念,好像很简单,又好像没那么简单。我们怎么才能把TrustZone给用起来呢?哪些资源应该放在安全世界,哪些资源又放在非安全世界?为什么这样的隔离机制可以提高系统安全性?接下来我们举个简单的例子。


这是一个简单的心跳监测仪,假设它运行在没有TrustZone隔离的系统上。
正常使用的时候,用户发送指令,来读取心跳监测仪的数据;设备通过I2C接口上的无线接收模块收到命令;走SPI接口去读取监测仪数据;读取到数据后,使用存储在芯片里的密钥对数据进行加密,并通过I2C接口回传加密后的数据。
如果有人想对该设备进行攻击:他借发送读取数据的指令,内嵌木马程序,如果应用程序存在软件漏洞,比如没有对函数参数进行检查,攻击者就可以通过缓冲区溢出执行注入到了RAM中的木马程序,比如:读取心跳监测仪,然后直接跳转到步骤5回传数据,跳过数据加密环节。这样,黑客就可以获得心跳监测仪的明文数据了。


如果使用了TrustZone隔离机制,即使应用软件也存在着以上安全漏洞,我们是否可以避免以上的攻击呢?
首先,我们把I2C分配在非安全区域,把SPI接口分配在安全区域。RAM和Flash也划分出安全和非安全区域。把步骤三:从SPI接口读取传感器数据,以及步骤四:加密传感器数据这两个操作都放在安全区域里;把步骤二:接收命令和步骤五:回传数据值放在非安全区域运行。
这样当攻击再次发生,前两步都一样,但是在第三步执行的时候,木马程序试图通过SPI接口访问心跳监测仪,会访问失败,access failed。原因就是木马程序通过运行在非安全世界的第二个步骤,也只能入侵非安全部分的SRAM区域。在那里执行木马程序,内核仍然处于非安全状态,是无法访问处于安全世界的SPI的,从而阻断了对心跳监测仪的数据读取。后面想绕过加密步骤,直接回传心跳数据也就无法得以执行。简而言之,TZ可以通过硬件层面,帮助用户规避应用软件在安全方面因为存在某些漏洞而带来的风险。
通过这样一个简单的例子对比,大家是不是对隔离的作用有了一个初步认识呢?


谈完“隔离”,我们来看安全启动。安全启动以“信任根” 为锚点,通过逐级校验,构建信任链。
要能做“信任根”,必须满足至少三个条件:第一,固定的启动入口,就是只能从这里启动;第二,启动后运行的代码不能被bypass,必须执行;第三,启动代码要执行的构建信任链的任务,不能被修改。安全环境有了,那么信任根代码或者说安全启动代码要做一些什么事情呢?既然是信任链,光它自己一个起点是可信任的,还没用,还得确保下一个运行节点也是可信任的。就要对下一节点的内容做合法性验证,验证通过,才把执行权交给它。
STM32L5通过Bootlock确保启动地址不可更改,通过WRP对启动代码扇区写保护。SBSFU参考软件包实现了认证下一阶段代码的功能,并通过HDP(隐藏保护扇区功能)在跳转到下一阶段用户代码之前,把安全启动代码隐藏起来,实现了和应用代码的进一步隔离。
安全固件更新,能够帮助设备构建一个可以持续演进的系统,在安全可控的前提下进行设备的软件更新,以便针对新的攻击增加对应的安全防护措施、更正原有错误和添加新功能。
在STM32L5上有TFM和SBSFU两套软件的参考实现,可以提供用户对升级固件保密性、完整性、可认证性的需要。支持固件以明文或者密文方式下发升级,对固件的验证支持GCM、RSA、ECDSA等多种算法。
以上各个参考软件里密码学算法的高效执行,得益于STM32L5集成了丰富的加解密硬件引擎,从真随机数产生器、对称加解密、非对称加解密,到签名验签、Hash计算,涵盖了主流国际标准密码学算法。每颗芯片独有的96位设备ID,可以作为密钥派生的输入,实现一机一密。
多说一句,对于没有集成硬件加解密模块的STM32芯片,我们有X-Cube-Crypto提供的纯软件实现。各种算法需要的耗时和存储空间使用,在库文件里都有相应文档说明。
软件IP保护是大家比较看重的问题。软件IP凝聚了客户投入的人力成本和时间成本,是需要重点保护的数字资产。
软件IP保护,不仅仅是产品出厂后,从开发阶段到量产烧录阶段,都有 可能造成泄露的薄弱环节。然而在各个阶段,STM32L5都有相应的保护措施:
开发阶段,尤其是在联合开发模式下,算法提供方可以使用Trustzone的隔离机制,把代码烧写在Secure区域,再设置上RDP 0.5后交给别人继续开发。RDP 0.5设置上以后,别人在non secure世界做代码开发和调试,无法调试secure世界里的关键算法,但是不影响他们使用预先定义好的API调用secure区域里的算法功能。
量产烧录阶段,ST提供了SFI方案,让你们的私有代码在不可信的产线环境烧录时,防止代码被窃取以及过量生产。
产品出厂后,攻击者可以把产品买回去做各种攻击。STM32L5作为MCU,提供的保护不是安全芯片SE级别的物理和开盖攻击。在MCU级别的保护,对外部攻击,我们可通过RDP1或者RDP2阻断来自调试端口的探测。对于预留了通信接口和功能的应用,攻击者可以通过注入恶意代码来进行内部攻击。STM32L5可以使用MPU,TrustZone等多种隔离手段,把敏感代码保护起来。另外,STM32L5继H7之后,也集成了OTFDEC模块,可以让客户把大段用户代码加密后放在外部Flash,从而保护敏感代码的机密性。通过对OTFDEC的正确配置,从外部Flash执行密文代码,对CPU来说就像是执行片上Flash里存储的明文代码一样。这样,代码安全存储和执行的范围,就可以从片上Flash扩展到片外Flash了。如果你担心从外部Flash执行代码的速度,别忘了,我们还有8K字节的ICACHE呢可以对外部Flash进行缓存呢。
这些硬件功能,组合使用,可以极大提高STM32L5对盗取软件IP的防护等级。
对设备固件的保护,刚才说在生产阶段也是一个需要考虑的环节。SFI,全称secure firmware install,它是一整套安全服务,,一方面保护生产程中固件的机密性和完整性,另一方面还能够控制固件烧录的次数,防止过量生产的情况。
这么一套服务,需要芯片端、软件工具、硬件工具三方面的支持。芯片端,全系列STM32L5出厂都预装了secure BL,以及每颗芯片自己的公私钥对。PC软件工具端,ST提供的 Trusted Package Creator负责生成加密签名后的用户固件,并协同ST提供的智能卡形式的HSM,配置固件加解密的对称秘钥,和授权产线烧录的次数。STM32CubeProgrammer可以通过jtag调试接口和uart等通信接口,和L5芯片里的secure BL交互,完成用户固件密文的烧录,和解密密钥的安全下发。
在对外部环境的异常情况监测方面,L5继承了从F2开始就有的tamper入侵检查机制,并继续发扬光大。
一方面,Tamper的内部监测信号范围进一步扩大,另一方面,也是最为出色的提升点在于:外部tamper引脚,从以往的固定电平监测,升级到L5首次支持的随机数序列的电平监测。
简单讲就是,通过在tamper输入和输出引脚之间布上mesh loop电路,并设置输出端发送随机序列,输入端检测随机序列,来对抗开箱板级攻击。当攻击者试图通过钻孔来物理接触 调试或者通信引脚,只要他截断了mesh loop电路,输入端就无法接收到期盼的随机序列,就会触发入侵事件,从而擦除系统的关键信息。
在行业认证方面,基于STM32L5的TFM参考代码实现,已经取得了ARM的PSA level2认证。也是业界较早获得PSA level2认证的MCU。
最后一部分,我们谈一下STM32L5的生态系统。它继承了STM32家族出类拔萃的生态系统基因,从开发板、技术文档、固件例程、软件工具,方案,多角度帮助客户更快上手使用,来开发创新应用。
STM32Cube工具家族,作为STM32生态系统的重要组成部分,从CubeMX、CubeIDE、CubeProgrammer、CubeMonitor,全链路支持STM32L5的开发。
对接STM32L5上的TrustZone新特性,在CubeMX中我们可以对外设模块、存储区域的安全属性做配置;自动生成的TrustZone初始框架工程,CubeIDE里会包含两个工程,一个是给安全应用的,一个是给非安全应用的,并根据用户在CubeMX中的配置生成两个世界的初始化代码。CubeProgrammer支持TZ相关的特殊选项字节配置。还有一个重要功能,L5上的SFI服务,也离不开CubeProgrammer工具的支持。
STM32L5-DK板子上集成了一个功耗测量电路,配合CubeMonitor可以直观看到功耗的动态变化。开篇的L5 demo live show里大家已经看到了。在今天现场的台下,我们有这个L5 demo的展示,欢迎大家在茶歇的时候去体验。
除了以上工具软件,STMCU中国团队在技术资源的本地化方面做了大量工作,除了全球官网上英文技术文档的翻译,我们投入大量资源开发了STM32L5的在线课程视频,从理论到实践,从快速入门到深入理解,由浅入深、面面俱到。除此之外,工程师在客户支持过程中碰到的典型问题,我们也会搜集整理出来,作为工程师笔记和大家来分享。
FAQ、微信关键字搜索,是今年开始建立的另外一种产品特性快速了解的途径。我们拟从点-线-面,不同维度,不同深度,给大家提供全方位的STM32L5设计资源和资讯。
所有这些都可以从STMCU的中文官网免费获得。内容还在不断丰富中,请大家把它放进你浏览器的收藏夹中。
请允许我再次做一个强调和总结:
高性能,不仅仅看主频。STM32L5凭借ICACHE对片内片外Flash的执行加速,以110MHz的主频,在高性能和低功耗之前取得了理想的平衡。
信息安全,不仅仅是加解密,系统上的隔离,做代码和执行的保护,也很重要。这些功能元素,加解密、系统隔离,L5都有硬件和软件的支持。
还有两个网址链接,是和STM32L5以及STM32信息安全相关的资料汇总页面,在大家做安全方面的设计时,可以到此查阅相关资料。