工程师笔记 | STM32内置硬件功能安全属性

发布者:EtherealGlow最新更新时间:2023-02-06 来源: zhihu关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

概览

对于功能安全,ST MCU从芯片内置的硬件安全属性,经过认证的软件自检库和完备的安全文档三个层面来支持STM32用户在系统级进行开发,达到要求的功能安全等级。


下表中列出了STM32MCU内置的一些主要硬件安全属性。下面我们一起来看看这些属性在功能安全中的用处。




看门狗:独立看门狗和窗口看门狗

看门狗是我们常用到的针对CPU运行状态监测的手段之一。它本质上就是一个定时器,启动之后,需要不断的去刷新(我们通常把这个动作叫做“喂狗”),否则当看门狗的定时器减到规定的值后,就会引起系统复位。我们可以利用它来检测程序是否跑飞,并通过芯片复位,来让系统恢复到正常状态。


STM32 MCU提供两个看门狗,独立看门狗和窗口看门狗。


从独立看门狗的名字可以看出,它的特点是拥有独立于系统时钟的时钟。独立看门狗使用LSI时钟,这样使得它与系统时钟分离开,即使系统时钟出现故障,独立看门狗也能正常工作。


独立看门狗还支持“硬件看门狗”功能,通过选项字使能该功能后,MCU只要一上电,就会启动运行,开启对系统的保护。


窗口看门狗使用的是系统时钟,它的特点是必须在一个窗口时间内完成“喂狗”的动作,否则就会引起系统复位,所以窗口看门狗对“喂狗”的要求更精确了。


窗口看门狗还有一个EWI(early wakeup interrupt)的功能, 这个功能使能后,可以在窗口看门狗引起系统复位之前,先产生一个EWI中断,在这个中断里,给了系统软件一个机会去完成一些必要的安全动作或者数据保存的工作。


部分MCU系列的窗口看门狗也支持“硬件看门狗”的功能。


独立看门狗和窗口看门狗都支持在调试模式下“冻结”计数,以及在低功耗模式下继续工作的功能。


看门狗可以用在内核检测,时钟检测和电源检测中。


电源监测

关于电源检测,STM32MCU的可编程电压监测(PVD),模拟电压监测(AVD)和电池电压监测等功能可以用来检测VDD,VDDA和电池电压是否在正常的电压范围内。


时钟安全系统CSS

关于时钟的检测,MCU内部的时钟安全系统(CSS)可以用来检测外部高速时钟(HSE)和外部低速时钟(LSE)是否丢失。


当检测到HSE时钟丢失后,CSS可以触发定时器的“刹车”功能和系统中断,并自动切换到内部高速时钟,软件可以根据这些触发的事件,制定相应的保护措施。

LSE是RTC的时钟源,当检测到LSE丢失后,RTC不能再使用LSE时钟源,并产生CSS中断,在中断中需要将RTC切换到其他时钟源。


CSS只能检测时钟是否丢失。对于时钟存在但发生偏移的情况,可以通过下图所示的时钟交叉测试来进行检测。




该测试利用了MCU的TIMER模块的输入捕获功能,LSI时钟内部连接到TIMER的一个输入捕获通道,当分别使用HSE或者HSI作为计数时钟时,通过检测LSI的频率是否在正常范围内,从而间接的检测了HSE/HSI的频率。


不同STM32系列用到TIMER模块不一样,具体请查看相应的参考手册。


SRAM奇偶校验位

部分STM32系列支持带奇偶校验的SRAM。


奇偶校验可以用来检测SRAM的瞬时和永久性故障。比如由于电磁干扰导致的SRAM中的数据错误。由于奇偶校验的检测原理,使得它只能检测出奇数个的比特位错误,并且也不能对错误数据进行纠正。


STM32 MCU带奇偶校验的SRAM每个字节增加了一位奇偶校验位,所以SRAM的数据总线是36位。在对SRAM进行写操作时,硬件自动计算并存储奇偶校验;当进行读操作时,硬件自动进行校验。



如果检测到错误,会立刻产生不可屏蔽中断(NMI),并且可以配置成可以触发定时器的“刹车”功能。


硬件ECC

ECC全称Error Checking and Correcting,是一种错误检查和纠正的技术。跟奇偶校验一样,它也需要额外的空间来存储校验码。比奇偶校验更强的是,ECC可以做到单比特位错误校正和双比特位错误检测。对于由于电磁干扰等原因造成的内存瞬时故障或者永久性故障,ECC都可以检测。


ECC检测在读操作时进行,当检测到一个比特位的错误时,读出来的数据就是已经纠正后的数据,当检测到两个比特位的错误时,ECC无法纠正,但是可以告诉应用程序该位置的数据有错。


STM32部分MCU系列(STM32H7/L4/G0/G4/L5)支持Flash ECC,现在只有H7支持SRAM ECC和Cache ECC。


当检测到单比特/双比特ECC错误时,出错地址会被自动保存到寄存器中(需要使能该功能),并且可以通过寄存器配置产生对应的错误中断。


检测到双比特错误时,还将触发NMI中断,并可以将出错信号连接到TIMER的“刹车”功能。


请参考AN5342了解更多关于ECC的操作细节。


硬件CRC

在Flash自检的程序中会用到CRC来检测Flash内容的完整性。其检测思路一般是:在程序编译完成后,计算整个程序的CRC值(第一次计算CRC值),然后将这个CRC值添加到可执行文件末尾。再将带有CRC校验值的可执行文件烧录到MCU中。在程序启动后,由程序中的自检代码重新根据当前Flash里内容(不包括预存的CRC校验值)计算一次CRC值(第二次计算CRC值),再与之前预先计算并烧录到Flash中的CRC校验值(第一次计算的值)进行比较,如果一致就通过检测。

第二次计算CRC值的时候是由运行在MCU中的自检程序完成的,这部分工作可以利用软件代码完成,也可以利用MCU的硬件CRC完成。STM32的全系列都提供了硬件CRC的功能,默认使用CRC32多项式0x4C11DB7。


请参考AN4187了解更多关于CRC的使用细节。


存储器保护单元MPU

存储器保护单元MPU是Cortex-M内部的组件。Cortex-M0不支持MPU,所以除了基于Cortex-M0内核的STM32F0以外,其他STM32产品都支持存储器保护单元 (MPU)。


MPU可以用来设置部分数据只能被一些特权任务访问或者是只读;可以将SRAM空间定义为“不可执行代码”,从而防止注入攻击代码;可以用来检测堆栈溢出和数组越界;还可以通过MPU设置存储器的缓冲,缓存,共享等属性。


在功能安全的应用中,我们可以利用MPU来对安全相关的关键数据进行隔离,从而防止其被其他程序意外修改。


关于MPU的使用细节,请参考AN4838。


其他

除了前面介绍的这些硬件的功能外,还有: GPIO,Timer,比较器等外设的寄存器锁定功能,可以配置参数不会被软件意外修改;定时器PWM输出的“刹车”功能,它的目的是保护由PWM信号驱动的功率开关,就是当系统出现故障时,可以触发该功能,关闭PWM输出,保证系统处于安全状态。而触发“刹车”功能的输入信号,既可以是来自MCU内部的系统级故障(比如CSS检测到的时钟失效,SRAM的奇偶校验错误等),也可以是连接到特定引脚的外部信号。不同的STM32系列支持的输入信号来源不同,具体使用请见相应的参考手册。



部分STM32系列还支持“内核进入lockup状态”作为“刹车”功能的触发源。关于“内核进入lockup状态”是指,当MCU已经因为出错进入fault中断后,在fault中断服务程序中又触犯了fault条件,这时就会进入lockup状态。


还有一些外设比如串口,I2C,CAN等,也内置有协议错误检测,CRC校验等功能,可以用于该外设使用过程中的安全检测。


STM32内置安全属性还很多,这里就不一一列举了。


请参考各个STM32系列的安全手册,来获取详细的信息。


关键字:STM32 引用地址:工程师笔记 | STM32内置硬件功能安全属性

上一篇:工程师笔记 | STM32H7 RAMECC功能及应用
下一篇:工程师笔记 | 驱动 8 位 8080 接口 LCD 时的字节序问题

推荐阅读最新更新时间:2024-11-08 07:35

STM32代码远程升级之IAP编程
IAP是什么 有时项目上需要远程升级单片机程序,此时需要接触到IAP编程。 IAP即为In Application Programming,解释为在应用中编程,用户自己的程序在运行过程中对User Flash的部分区域进行烧写。即是一种对单片机Flash擦写的一种编程方案。 通常情况下,一片STM32单片机的Flash只有一个用户程序,而IAP编程则是将单片机的Flash分成至少两大区域,一部分叫做bootloader区,一部分叫做app用户代码区,还可留出一部分区域为代码备份区。 IAP的应用场所 通常情况下我们给STM32单片机烧录更新程序时是通过SWD、J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的
[单片机]
<font color='red'>STM32</font>代码远程升级之IAP编程
STM32的DMA控制器
  DMA(直接存储器存取)用来提供在外设和存储器之间或者存储器与存储器之间的高速数据传输。无须CPU干预,这就可以节省CPU的资源来做其它操作。   两个DMA控制器有12个通道(DMA1有7通道,DMA2有5通道),还有一个仲裁器协调各个DMA请求的估先权。   有关DMA控制器的特性、框图、寄存器地址及含义等参考STN32资料手册,在此就不多说了,只讲述具体的设置应用。   结构体(DMA_InitTypeDef)说明:   PeripheralBaseAddr:外设地址 CPAR   MemoryBaseAddr: 存储器地址 CMAR   DIR:        传输方向(从外设读/从存储器读)   Buffe
[单片机]
J-link在MKD5下在线调试STM32
一、手动安装匹配的装置包 装上MDK5后,是和之前的版本不冲突的,之前的KEIL4 for C51和forARM都可以留着不必卸载。可以另外建立一个安装目录,两者相安无事。 在MDK5新建工程,和之前的版本有很大不同。如果第一次用,之前选择目标型号的那个对话框里,只有ARM内核可选,没有具体的单片机型号。估计是因为发展到现在单片机不同厂商的不同产品已经太多了,如果囊括所有的device,会是开发环境变得非常庞大,而且平时搞开发,可能很长一段时间里用的就那么一两款。 新建工程后需要安装和目标单片机相匹配的device(如果是将MDK4建立的工程导入到MDK5中,也许要下载这个东西)。 选择合适的devic
[单片机]
J-link在MKD5下在线调试<font color='red'>STM32</font>
STM32基础之SPI
SPI简介 SPI协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。 SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200。 SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。SPI接口的读写操作,都是由主设备
[单片机]
<font color='red'>STM32</font>基础之SPI
STM32踩坑记录(1):编写代码时遇到STM32无法进入外部中断的原因及解决方法
@STM32踩坑记录(1) 使用的软件及硬件: 硬件平台:RoboMaster C板(STM32F407IGT6)、Jlink仿真调试器 软件平台:keil5 使用的是标准库+freertos。 ##遇到问题时的场景 在编写RoboMaster C板上的IMU(BMI088)温度闭环控制程序时 ,需要配置外部中断引脚 INT1_ACCEL_Pin(PC4),然后在中断服务函数中给温度控制任务发通知(也就是信号量),温度控制任务就会读取BMI088数据寄存器中的陀螺仪、加速度、温度的值,将温度的值传递给PID控制器,进行PID闭环控温程序。 ##:遇到的问题: 因为板载的BMI088上有两个外部中断引脚,分别为INT1
[单片机]
<font color='red'>STM32</font>踩坑记录(1):编写代码时遇到<font color='red'>STM32</font>无法进入外部中断的原因及解决方法
STM32 APB1总线时钟配置问题
调试载波通信系统的时候遇到这样一个问题:两台设备分别为A何B,他们都使用了定时器2~4来进行通讯,A设备的PCLK1配置为HCLK,而B设备的PCLK1配置为1/2HCLK,通讯过程发现A,B两个设备偶尔能通讯偶尔不能通讯,表现出通讯部稳定。理论上应该完全不能通讯才是,深入研究STM32F101C8T6的数据手册发现问题所在,截图如下: 图1 STM32功能框图 图2 STM32 时钟系统 从图1可以看到APB1总线挂接了TIM2~4,UART2~2...WWD等设备。然后从图2中可以看到只有外设直接使用了APB1的时钟作为实际时钟,而TIM2~4根据APB1的时钟进行了调整。因此当设备B的PCLK1配置为1/2HCL
[单片机]
<font color='red'>STM32</font> APB1总线时钟配置问题
stm32 系统时钟配置
HSE:72M,HSE:64M,HSI:64M 代码实现: // 时钟设置 //#define MAINCLOCK_72M // HSE,外部时钟 //#define MAINCLOCK_64M_EXTERN // HSE #define MAINCLOCK_64M_INTERAL // HSI /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OSCInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Init
[单片机]
STM32操作系统系列使用C语言的教程
C语言,相对于汇编有更好的可读性,便于维护等优点。下面实验将使用C语言实现点亮LED灯。C语言与硬件是紧密连在一起的,结合芯片中的flash和sram,简单了解C语言。 步骤: FLASH,就是存放.bin文件的地方。SRAM,用于存放程序的堆栈,全局变量。 MEMORY,用于定义存储器范围。 AT rom,表示将对应的SECTION放置到rom中,即Flash中。 _data_start / _data_end,用于说明data段在flash中的位置,方便程序将data段从flash中复制到sram中。 _ram_data_start,表示data段将复制到sram中的什么位置。 ADDR(),表示获得SECTION
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved