STM32

说到复位,我们都不会陌生,系统基本都有一个复位按键。复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。本文探讨的就是在stm32中复位电路如何设计。

STM32介绍

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex®-M0,M0+,M3, M4和M7内核在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。

新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。

stm32复位电路设计

复位电路的作用是为了是系统恢复到初始状态的,单片机的复位方式也是存在好几种的:上电复位,系统复位,备份区域复位

上电复位:其产生的条件是,当系统上电、掉电,以及系统从待机模式返回时,发生电源复位。电源复位能够复位除了备份区域寄存器之外的所有寄存器的状态。

系统复位:以下任一事件发生时,均能产生一个系统复位:

1. NRST引脚上的低电平(外部复位)

2. 窗口看门狗计数终止(WWDG复位)

3. 独立看门狗计数终止(IWDG复位)

4. 软件复位(SW复位)

5. 低功耗管理复位

系统复位能够复位除时钟控制寄存器CRS中的复位标志和备份区域中的寄存器之外的所有寄存器。

备份区域复位:对于备份区域的复位,一种是在软件复位的时候设定备份区域控制寄存器中的对应位产生的;另一种是当电源和电池都掉电又重新上电时产生的。

平常我们常用的复位方式有两种,一种是NRST引脚的低电平复位,通过按键复位电路给这个引脚一个低电平,让系统完成复位,另一种大家都知道,那就是上电复位了,有时候是复位电路莫名失效了,有时是刚启动的时候,虽然用的没有按键复位电路多,不过也算是很常用的一种复位方式了。按键复位电路直接给图了,网上的讲解可能把这电路图都讲烂了,我就不费口舌了。

电容充电时间计算:T = 1.1RC = 1.1 * 10000 * 0.0000001 = 0.0011s = 1.1ms

浅析stm32复位电路方法

STM32 内核复位与系统复位

内核复位与系统复位的区别

本文说的内核是指处理器内核,也就是MPU(Microprocessor Unit)。比如STM32F103,其内核就是Cortex-M3内核。

而这里的系统就是包含内核和外设,也就是MCU(Microcontroller Unit),对于STM32F103来说,就是Cortex-M3内核+各种外设接口。

内核复位:只复位Cortex-M3处理器,而不复位外设如GPIO、TIM、USART、SPI等的寄存器。

系统复位:即复位Cortex-M3处理器,又复位外设寄存器。

因此,我们常说的复位一般指的是系统复位。

内核复位与系统复位的函数源代码

本文以Cortex-M3(STM32F103)为例来说明,其他芯片类似。

编写了4个复位函数,内核复位(C语言)、内核复位(汇编)和系统复位(C语言)、系统复位(汇编):

void NVIC_CoreReset(void); //内核复位(C语言)
void NVIC_CoreReset_a(void); //内核复位(汇编)
void NVIC_SystemReset(void); //系统复位(C语言)
void NVIC_SystemReset_a(void); //系统复位(汇编)

在ST官方库中的core_cm3.h文件中已经提供了NVIC_SystemReset的C语言源代码。

Cortex-M3允许由软件触发复位序列,用于特殊的调试或维护。在Cortex-M3中,有两种方法可以实现自我复位。

第一种方法:置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的 VECTRESET 位(位偏移:0)。

NVIC_CoreReset内核复位

这种复位的作用范围覆盖了整个Cortex-M3处理器,除了调试逻辑之外的所有角落,但是它不会影响到Cortex-M3处理器外部的任何电路,所以STM32上的各片上外设和其它电路都不受影响。

编写的NVIC_CoreReset函数C语言源码:

staTIc __INLINE void NVIC_CoreReset(void)
{
__DSB();
//置位VECTRESET
SCB-》AIRCR = ((0x5FA 《《 SCB_AIRCR_VECTKEY_Pos) |
(SCB-》AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_VECTRESET_Msk);
__DSB();
while(1);
}

汇编版函数源码:

__asm void NVIC_CoreReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0001 //置位VECTRESET
STR R1, [R0]
deadloop_Core
B deadloop_Core
}

内核复位主要注意:SCB_AIRCR_VECTRESET_Msk和LDR R1, =0x05FA0001,这是和系统复位唯一的区别。

第二种方法:置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的 SYSRESETREQ位(位偏移:2)。

NVIC_SysReset系统复位

系统复位是置位同一个寄存器中的SYSRESETREQ位。这种复位则会波及整个芯片上的电路:它会使Cortex-M3处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是Cortex-M3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影响(比如,STM32系列的芯片有后备存储区,该区就被特殊对待)。

大多数情况下,复位发生器在响应 SYSRESETREQ 时,它也会同时把Cortex-M3处理器的系统复位信号(SYSRESETn)置为有效。通常,SYSRESETREQ不应复位调试逻辑。

这里有一个要注意的问题:从SYSRESETREQ被置为有效到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK置位。可以采用下列汇编语句:__disable_fault_irq();。

core_cm3.h中提供的NVIC_SystemReset函数C语言源码:

staTIc __INLINE void NVIC_SystemReset(void)
{
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB(); /* Ensure compleTIon of memory access /
while(1); /* wait unTIl reset */
}

汇编版函数:

__asm void NVIC_SysReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0004
STR R1, [R0]
deadloop_Sys
B deadloop_Sys
}

结语

某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。例子:A系统通过一个IO控制B系统的电源,而这个IO置高时才开启B系统的电源。

正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。

这个时候如果使用常规的复位方式,就会复位IO,不符合要求。如果有一种方式只复位内核而不复位外设就好了。

转自:畅学单片机

围观 6
11

1、简述

下面这张图是一条外部中断线或外部事件线的示意图。图中的蓝色虚线箭头,标出了外部中断信号的传输路径;图中红色虚线箭头,标出了外部事件信号的传输路径。

单片机STM32——中断与事件的区别

图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。

2、概念

事件:是表示检测到某一动作(电平边沿)触发事件发生了。

中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。

中断有可能被更优先的中断屏蔽,事件不会。

事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒)。

事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号 。

事件是中断的触发源,事件可以触发中断,也可以不触发,开放了对应的中断屏蔽位,则事件可以触发相应的中断。 事件还是其它一些操作的触发源,比如DMA,还有TIM中影子寄存器的传递与更新;

简单点就是中断一定要有中断服务函数,但是事件却没有对应的函数。

事件可以在不需要CPU干预的情况下,执行这些操作,但是中断则必须要CPU介入.。

ps:注意把事件与事件驱动区分开。事件驱动相关内容,可以看我的博客上别的文章。

3、中断传输路径

图中的蓝色虚线箭头,标出了外部中断信号的传输路径。首先,外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路。

首先是编号2的边沿检测电路:这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。

接下来,是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1"时,不管外部信号如何,编号3的或门都会输出有效信号。

然后,一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。

外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为"0",则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。

4、事件传输路径

明白了外部中断的请求机制,就很容易理解事件的请求机制了。图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块。

5、区别

从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的。之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果。但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等。

简单举例:外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更快。要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。

6、总结

可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。

——如有不对的地方,非常欢迎给予指导!
——【感谢】资料来源于
http://blog.sina.com.cn/s/blog_4d1854230101dcui.html

围观 25
88

这一部分我们将使用按键作为触发源,在产生中断时,实现控制LED灯的亮灭状态切换。

在具体应用前,我们还需先认识认识EXTI。

EXTI

全称为External interrupt/event controller,即外部中断/事件控制器。其管理了20个中断/事件线,每条线都有对应的一个边沿检测器,用于输入信号上升沿和下降沿的检测。如图6-1为stm32参考手册里的EXTI框图。

stm32中断初识与实践(下)
图6-1

图中有两条走向的线路,蓝色线路用于产生中断,绿色线路产生事件。我们从右往左看图。

查阅按键原理图可知,按键按下时,电平状态由低变高,会在输入线呈现出一个上升沿信号,这个信号到达边沿检测电路后,会被上升沿触发选择寄存器(EXTI_RTSR)检测并触发,输出有效信号1给编号3电路,否则输出无效信号0。如果电平由高变低,则会被下降沿触发选择寄存器(EXTI_FTSR)检测触发。

触发的信号到达编号3电路,这是一个或门电路,它的输入信号除了来源于边沿检测电路,还有来自软件中断事件寄存器(EXTI_SWIER)。无论是来自EXTI_SWIER或边沿检测电路的信号,只要有一个是有效信号1,那么便可以输出有效信号1给编号3电路。编号3电路之后,分为两条线,一条产生中断,一条产生事件。

信号沿着蓝色线路产生中断,编号3输出信号到编号4。编号4是一个与门电路,它的另一个信号来源是中断屏蔽寄存器(EXTI_IMR)。众所周知,与门电路要求输入信号都为1才能输出1,换言之,如果EXTI_IMR置为0,那么编号4电路输出的信号都为0,只有EXTI_IMR置1时,编号4输出的信号才由编号3决定。这样一来我们可以通过EXTI_IMR来控制是否产生中断。随后,编号4电路输出的信号会被保存到挂起寄存器(EXTI_PR)内。最后将EXTI_PR里的值输出到NVIC,实现中断控制。

信号沿着绿色线路产生事件,最终会输出一个脉冲信号。编号3输出信号到编号5,编号5也是一个与门电路,信号来源于编号3电路和事件屏蔽寄存器(EXTI_EMR)。和编号4的与门电路一样,我们可以通过EXTI_EMR来控制是否产生事件。当编号5输出有效信号1时会在脉冲发生器(Pulse generator)输出一个脉冲信号(无效信号不会输出脉冲)。这个脉冲信号可以给其他外设电路使用,如TIM、ADC等等,一般用来触发TIM或ADC开始转换。

EXTI的中断/事件线

EXTI有20条中断/事件线,其中有16条用于GPIO线上的外部中断/事件,占用EXTI0~EXTI15,其他4条用于特定外设的外部中断/事件。如图6-2。

stm32中断初识与实践(下)
图6-2

可以通过操作AFIO的四个外部中断配置寄存器(AFIO_EXTICR1~AFIO_EXTICR4)的EXTIx[3:0]位选择配置PAx、PBx、PCx...PGx等引脚。如图6-3为AFIO_EXTICR1寄存器描述。

stm32中断初识与实践(下)
图6-3

EXTI_InitTypeDef

EXTI_InitTypeDef是EXTI初始化结构体,其定义在stm32f10x.h文件中,如图6-4所示。

stm32中断初识与实践(下)
图6-4

有四个结构体成员,

  •  EXTI_Line:中断/事件线,可选择EXTI0~EXTI19,如图6-2所示;
  •  EXTI_Mode:EXTI模式,可设置产生中断(EXTI_Mode_Interrupt)或产生事件(EXTI_Mode_Event);
  •  EXTI_Trigger:EXTI边沿触发,可选择上升沿触发(EXTI_Trigger_Rising)、下降沿触发(EXTI_Trigger_Falling)或者上升沿下降沿都触发(EXTI_Trigger_Rising_Falling);
  •  EXTI_LineCmd:使能(ENABLE)/失能(DISABLE)EXTI线。

开始实验

按键按下时,产生电平变化,EXTI检测到上升沿信号,触发中断,执行中断服务函数,实现LED灯的亮灭切换。

简要分析下编程要点:

  •  初始化产生中断的外设(GPIO);
  •  配置NVIC;
  •  初始化EXTI;
  •  中断服务函数;
  •  main函数

NVIC配置

我们先对NVIC进行配置,将其封装为函数NVIC_Configuration(),供后续调用。

/**
* @brief NVIC配置
* @param 无
* @retval 无
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 配置优先级分组

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 配置按键中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断寄存器

NVIC_Init(&NVIC_InitStructure);
}
NVIC配置部分,需要配置优先级分组、中断源、抢占优先级、子优先级以及使能中断寄存器等。关于优先级分组配置以及NVIC_InitTypeDef结构体分析,已在
上篇文章里详细说明,读者可点击进入阅读。

EXTI中断配置

/**
* @brief EXTI按键中断配置
* @param 无
* @retval 无
*/
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

/* 调用函数配置NVIC */
NVIC_Configuration();

/* 初始化GPIO */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 初始化EXTI */
// 配置中断线的输入源
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

EXTI_InitStructure.EXTI_Line = EXTI_Line0; // 配置中断线为EXTI0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 配置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;// 上升沿触发中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断
EXTI_Init(&EXTI_InitStructure);
}
这个配置函数里用到了GPIO和EXTI两个初始化结构体,对其分别进行初始化配置,同时调用NVIC_Configuration()函数配置NVIC。

其中,

  •  GPIO_EXTILineConfig()固件函数是对AFIO_EXTICR1的操作,所以我们需要开启AFIO时钟;
  •  需要把GPIO配置为输入模式(浮空输入),由外部电路决定引脚状态;
  •  通过查阅按键原理图可得,按键引脚为PA0,可得GPIO端口源和引脚源,并将其中断线配置为EXTI0;
  •  由按键原理图可得,按键按下时为高电平,所以使用上升沿触发中断。

中断服务函数

上篇文章里已经说明中断服务函数名应在启动文件里找到,并统一写在stm32f10x_it.c文件中。

/**
* @brief EXTI0线中断服务函数
* @param 无
* @retval 无
*/
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 确保产生了EXTI0线中断
{
LED_TOGGLE; // LED灯状态切换
EXTI_ClearITPendingBit(EXTI_Line0);// 清除中断标志位
}
}
需要先确保是否产生了中断,这一步我们直接调用stm32f10x_exti.c文件里的库函数EXTI_GetITStatus(),通过其返回值判断。EXTI_GetITStatus()函数操作的是中断屏蔽寄存器(EXTI_IMR)和挂起寄存器(EXTI_PR),通过两个寄存器的值判断是否产生中断,。由图6-1功能框图可得,如果相应线的EXTI_IMR和EXTI_PR都置1,则返回“SET”,即产生中断。具体的源码实现可查看3.5版本的stm32f10x固件库。

LED_TOGGLE是一个宏,在宏里实现LED状态切换。具体的实现在 专栏(stm32):GPIO输入——按键检测文章里已经有过说明,读者可移步阅读。

中断服务实现后,需要清除该中断线的中断标志位,以免下次程序判断失误。

main函数

int main(void)
{
LED_GPIO_Config(); // LED端口初始化
EXTI_Key_Config(); // EXTI按键中断配置
while(1){} // 等待中断产生
}
当按键按下时,即进入中断,执行中断服务函数,完成实验。

文章转自知乎。

围观 16
152

stm32中断的讲解我分为两部分,即两篇文章,上半部分做一个总结性的概览,有一个初步认识,下半部分会通过一个实例来讲解中断的应用。本文即为上半部分的总结性概览。
所谓“中断”,通俗地讲,就是CPU在遇到一个需要即时处理的情况时,暂时中止当前程序的执行,转而处理新情况。

在stm32参考手册中的中断和异常向量表里可查阅到,其内核的异常响应系统里有10个系统异常(含Reset和HardFault),60个外部中断。具体的定义可在库文件stm32f10x.h头文件的IRQn_Type枚举里查到。如图5-1。

stm32中断初识与实践(上)
图5-1

在进行中断配置前,有两个概念需要先弄清楚——NVIC、优先级定义及分组。

NVIC

NVIC即为嵌套向量中断控制器,控制着整个芯片的中断相关,是Cortex-M3内核里的一个外设。其在库文件core_cm3.h里定义如下:

stm32中断初识与实践(上)
图5-2

其中ISER(中断使能寄存器NVIC_ISERx)、ICER(中断清除寄存器NVIC_ICERx)、IP(8bit中断优先级寄存器NVIC_IPRx)会在配置中断的时候用到。我们可在core_cm3.h库文件里找到相关寄存器操作的函数声明,如操作ISER的NVIC_EnableIRQ()函数,操作ICER的NVIC_DisableIRQ()函数,操作IP的NVIC_SetPriority()函数等。

优先级定义及分组

NVIC里有一个中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级。IPR的宽度为8bit,而ST公司的F103芯片只用了高4bit来配置优先级,即每个外部中断可配置的优先级为0~15。这4bit被分组为抢占优先级(pre-emption priority)和子优先级(subpriority),数值越小,优先级越高。首先会比较抢占优先级,如果相同则比较子优先级,还是相同则继续比较各自的硬件中断编号(编号可在参考手册里的异常向量表查到,编号越小,优先级越高)。

优先级分组由内核外设SCB的AIRCR(应用程序中断及复位控制寄存器)的PRIGROUP[10:8]位决定,在F103里分成了5组。如图5-3。

stm32中断初识与实践(上)
图5-3

上图中的表格里显示了5组的优先级,由于只用了高4位,所以级数最多为16(0~15,有16个级数)。优先级分组配置可调用NVIC_PriorityGroupConfig()函数实现,函数声明和定义分别在库文件misc.h和misc.c中。该函数便是封装了对SCB_AIRCR寄存器的操作。

中断配置编程

经以上了解后,可以开始进入程序环节了。一般中断编程按以下四点来完成:

1. 使能外设中断。具体由相应外设的相关中断使能位控制,如串口收/发完成中断等。

2. 配置中断优先级分组。前文已经说明可以调用NVIC_PriorityGroupConfig()函数实现。

3. 初始化NVIC_InitTypeDef结构体。用于设置抢占优先级和子优先级,及使能中断。

4. 编写中断服务函数。启动文件中已经预先为每个中断定义了一个空的中断服务函数,用于初始化中断向量表。而实际中我们需要重新定义这些函数,可统一定义在stm32f10x_it.c中。
其中,

在第3点,NVIC_InitTypeDef结构体是在库文件misc.h中定义的。如图5-4。

stm32中断初识与实践(上)
图5-4

由图中库函数源码可知,

  •   NVIC_IRQChannel:中断源。每个中断都有其单独的中断源,不能写错,否则会致不响应中断,程序也不会报错。具体配置如图5-1的IRQn_Type枚举类型定义,这个枚举类型包含了所有的中断源。

  •   NVIC_IRQChannelPreemptionPriority:抢占优先级。由前文描述可知,可配置的优先级为0~15,有16个优先级数。

  •   NVIC_IRQChannelSubPriority:子优先级。同抢占优先级。

  •   NVIC_IRQChannelCmd:使能(ENABLE)或失能(DISABLE)中断寄存器。操作的是NVIC_ISER和NVIC_ICER寄存器。

在第4点,需要注意的是,函数名必须和启动文件里设置的一样,否则系统无法在中断向量表里找到中断服务函数入口,便会转而跳到启动文件里的空函数,从而进入死循环。如图5-5为启动文件预先定义的函数。

stm32中断初识与实践(上)
图5-5

至此,对中断已经有了一个大致的认识,第一步算是圆满完成啦。那么接下来的下半部分会开始借用一个实例来帮助巩固实践。

转自:fire909090

围观 6
160

作为意法半导体的STM32 *产品家族最新成员,STM32F7x0和H7x0超值系列(Value Lines) 微控制器(MCU)将为开发人员提供更高的灵活性。该系列产品适用于开发价格亲民、以性能为导向的实时物联网设备应用系统,同时不会影响目标应用的功能或网络安全性。

这些新产品线精简了嵌入式闪存功能,只保留最基本的重要配置,但仍然可以在片上安全运行安全启动代码、敏感代码和实时例程,发挥出嵌入式闪存访存时间比外部闪存快25倍有余的优势(在缓存失效情况下)。在必要时,设计人员可以通过下面两种途径扩展应用系统,第一种方法是增装一个片外串行或并行(最多32位)存储器,发挥片上各种外部接口和就地执行(XiP)功能的优势。第二种方法是把应用代码移植到引脚兼容的STM32F7或STM32H7系列,这两个系列内置最高2Mbyte的闪存和1Mbyte的RAM,支持相同的生态系统和好用的开发工具。

新超值产品线保留了STM32F7和STM32H7的强大功能,例如,最先进的外设、硬件加速器,以及采用超高速内部总线、短中断延迟、快速启动(~1ms)等技术的实时架构。灵活的功耗模式、门控电源域和片上电源管理技术可简化设计,降低物料清单成本,让新微控制器保持高能效。

在一个安全的高能效架构内,新超值微控制器CoreMark®性能测试获得2020分,使其成为医疗、工业、消费等应用领域物联网创新的切入点。由于最高工作结温达到125°C,即使环境温度升高,处理器内核和外设的性能仍能发挥到极致。

入门级的STM32F730集成意法半导体独有的执行闪存内代码零等待周期的ART Accelerator™存储器加速技术,在216MHz运行频率时,CoreMark基准测取得1082分。外设接口包括加密硬件加速器、一个带PHY的USB 2.0高速端口、一个CAN接口。片上存储器包括64KB的闪存;用于高性能访问内部或外部存储器的8KByte指令和8KByte数据缓存;256KB系统RAM;用于执行最关键例程和数据的16kB + 64KB TCM(紧密耦合存储器)。

STM32F750增加一个集成意法半导体独有的Chrom-ART™图形加速器的TFT-LCD显示控制器。片上功能包括哈希算法硬件加速器;两个CAN接口;以太网MAC控制器;摄像头接口;两个带全速PHY的USB 2.0接口;64K字节闪存;4Kbyte指令缓存;4Kbyte数据缓存;320KB系统RAM;6kB + 64KB TCM。

高端的STM32H750在400MHz时CoreMark测试取得2020分,并在TFT控制器和Chrom-ART加速器内增加了硬件JPEG编码器/解码器,以实现更快的GUI图形处理性能。外设接口包括一个CANFD端口;内置时间触发功能和同类最好的运算放大器的附加CANFD端口;运行速率高达3.6Msample / s 的16位ADC。片上存储器包括 128KB闪存、16KB指令缓存、16KB数据缓存、864KB系统RAM和64kB + 128KB TCM,都具有ECC(纠错码)功能,用于安全执行内部或外部存储器内的代码。

STM32F730、STM32F750和STM32H750超值系列微控制器已正式投产,采用64引脚到240引脚的各种LQFP和BGA封装。

详情联系当地经销商或访问 https://www.st.com/en/microcontrollers/stm32f7x0-value-line.htmlhttps://www.st.com/en/microcontrollers/stm32h750-value-line.html

围观 7
293

RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识。但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的基础之一,可以说是M3芯片的心脏。初学者理解是比较困难,但是掌握清晰对于嵌入式操作系统特别是Timer定时器以及通讯领域具有重大意义。

下面进入正题,先上一张RCC模块的结构图:

STM32学习笔记——RCC外设的学习和理解

初看此图是不是感觉太复杂了,事实上我第一次看这张图的时候也是的,完全理不清结构,不过不用担心,下面我就分层带你来理解这幅图。

(1)时钟源(4个晶振源,1个中介源)

HSI(RC):内部高速晶振,~8MHz

HSE(Osc):外部高速晶振(与电路设计时选择有关,25MHz)

LSE(Osc):外部低速晶振(默认为32.768KHZ)

LSI(RC):内部低速晶振,~40KHz

PLLCLK:锁向环倍频输出,最大频率小于72MHz,注:PLLCLK来源HSE,HSE/2,HSI/2

(2)系统时钟源

SYSCLK:系统时钟

来源HSI,PLLCLK,HSE,若CSS(时钟监视系统)检测到HSE失效,SYSCLK = HSI;

(3)主要输出时钟源

HCLK:高性能总线时钟(SYSCLK通过AHB Prescaler,最高72MHZ)

PCLK1:外设1区域时钟(通过APB1 Prescaler,最高36MHZ)

PCLK2:外设2区域时钟(通过APB2 Prescaler,最高72MHZ)

此外APB1,APB2外设时钟除了给对应外设区域提供时钟外,还可通过TIMERX Prescaler分配不同的定时器时钟。

ADCCLK:ADC外设时钟(PCLK2通过ADC Prescaler)

USBCLK:通用串行接口时钟(PLLCLK通过USB Prescaler,等于48MHZ)

RTCCLK:实时时钟,来源LSI,LSE,HSE/128

IWDGCLK:独立看门狗时钟,来源LSI

MCO:输出内部时钟

从上面看,我们前面学到的GPIOD外设还有后面的USART等的时钟都没有提到,为什么,其实它们包含在PCLK1,PCLK2这两个外设区域时钟里,也就是说他们的外设时钟来源于该区域的时钟。下面是STM32Fxxx固件函数库中15.2.22以及15.2.23所提到的图,包含所有外设对应的区域:

PCLK1时钟区域:

STM32学习笔记——RCC外设的学习和理解

STM32学习笔记——RCC外设的学习和理解

PCLK2时钟区域:

STM32学习笔记——RCC外设的学习和理解

通过上诉两张图可以清晰的知晓我在第一章节流水灯时时钟使能如此选择APB2外设的原因,当然我是以stm32f10x为例的,如果你使用不同的芯片就要去查相应的寄存器手册。了解了这些其实已经对系统时钟掌握差不多了,下面我就以寄存器控制方式展现嵌入式时钟的配置(库函数操作对于理解时钟配置过程的帮助并不大,特别只是单纯调用而没有理解每个函数内容的情况下)。

(4)系统时钟配置实例(以使用HSE晶振,最后系统时钟为50MHZ为例)

注:RCC寄存器功能可参考《STM32中文参考手册》6.3(互联型产品)

unsigned char PLL = 4;       //PLL为设定放大的倍数
unsigned char temp = 0;

//1.HSE时钟使能                 //时钟控制寄存器 RCC->CR
RCC->CR &= 1<<16;          //使能HSE 
While(!(RCC-CR)>>17));     //判断HSE就绪标志位

//2.配置PLL,APB2,APB1,AHB     //时钟配置寄存器RCC->CFGR
RCC->CFGR |= 0x00000400; 
PLL-=2;            //AHBCLK = SysTick, APB2CLK = AHBCLK,APB1CLK = AHBCLK/2 RCC->CFGR |= PLL<<18;   //参考寄存器功能表,0010~4倍,依次增加,最大9倍 RCC->CFGR |= 3<<16; //HSE/2作为PLL的输入 
//3.FLASH预存取即时钟配置            //FLASH预存取寄存器FLASH->ACR //注:具体参见《STM32闪存flash编程》,但有一点要注意,系统时钟大于30MHZ后一定需要配置,默认24MHZ后就需要配置
FLASH->ACR |= 0x32;        //开启预存取,2个等待周期
 //4.PLL使能                     //时钟控制寄存器   RCC->CR
RCC->CR |= 1<<24;     //PLL使能
while(!(RCC->CR>>25));     //判断PLL使能标志位

//5.PLL作为系统时钟
RCC->CFGR | = 0x00000002;    //PLL作为系统时钟
while(temp!=0x02)     //PLL成功作为系统时钟,标志位
{
  temp= RCC->CFGR>>2;
  temp&= 0x03;
}

通过上述方式就完成了时钟的一般外设的时钟初始化设置,配置系统时钟50MHZ,APB2外设时钟50MHZ,APB1外设时钟25MHZ,理解了这些,延时时间和通讯速率等通过计算即可精确的知晓,这对于整个stm32的学习以及后续理解嵌入式实时操作系统都具有重要意义。

来源:IT点滴

围观 7
214

一、RCC是什么?

RCC: Reset Clock Control,时钟和复位控制器

二、RCC的主要作用

1、设置系统时钟SYSCLK

2、设置AHB分频因子(决定HCLK等于多少)

3、设置APB2分频因子(决定PCLK2等于多少)

4、设置APB1分频因子(决定PCLK1等于多少)

5、设置各个外设的分频因子

6、控制AHB、APB2和APB1三条总线时钟的开启、控制每个外设时钟的开启。

注意:STM32库函数中时钟的标准配置为PCLK2=HCLK=SYSCLK=PLLCLK=72M,PCLK1=HCLK/2=36M

三、系统时钟库函数

对于系统时钟的配置,在固件库文件system_stm32f10x.c中。如下所示:

static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }

    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
                            RCC_CFGR_PLLMULL9); 
#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);               //12*6=72M
#endif /* STM32F10X_CL */

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
  }
}

四、STM32的HSE时钟

HSE是高速的外部时钟信号,可以由有源晶振或者无源晶振提供。频率为4-16MHz。

HSE最常用的是8M的无源晶振。当外部晶振为8M时,不需要对固件库中的系统时钟配置函数进行修改,但是,如果我们选择的外部晶振不是8M的,则需要对固件库中的系统时钟的配置做一修改。如我们所使用的外部晶振为12M,则需要做如下修改。

1、修改stm32f10x.h文件

打开stm32f10x.h文件,修改如下代码(119行)

#define HSE_VALUE ((uint32_t)8000000) //修改之前

#define HSE_VALUE ((uint32_t)12000000) //修改之后

2、修改system_stm32f10x.c中的系统时钟配置函数

打开system_stm32f10x.c文件,修改如下代码(1056行)

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); //修改之前,HSE=8M,9倍频之后为8*9=72M

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); //修改之后,HSE=12M,6倍频之后为12*6=72M

转自:Tangledice

围观 12
128

1、SysTick的介绍

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。

SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。

2、SysTick寄存器

STM32中的systick,Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:

STK_CSR, 0xE000E010 -- 控制寄存器
STK_LOAD, 0xE000E014 -- 重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB, 0xE000E01C -- 校准值寄存器

(1)STK_CSR控制寄存器

stm32之SysTick的理解(NVIC)

第0位:ENABLE,Systick 使能位(0:关闭Systick功能;1:开启Systick功能)

第1位:TICKINT,Systick 中断使能位(0:关闭Systick中断;1:开启Systick中断)

第2位:CLKSOURCE,Systick时钟源选择(0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)

第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零.

(2) STK_LOAD 重载寄存器

stm32之SysTick的理解(NVIC)

Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。

(3)STK_VAL当前值寄存器

stm32之SysTick的理解(NVIC)

也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

(4)STK_CALRB校准值寄存器

stm32之SysTick的理解(NVIC)

不知到怎么使用,有兴趣的请参考CM3内核参考手册。

3、程序中的理解和使用

RT-Thread系统bsp的stm32F10x中关于Systick的初始化:在启动文件中其实已经一定了SystemInit();其中就已经定义了32的AHB时钟、APB1时钟和APB2时钟的大小。

RTT中

/* Configure the SysTick */  
    SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); //<span style="font-family: Arial, Helvetica, sans-serif;">RT_TICK_PER_SECOND =100</span>  
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)  
{  
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */  
  
     SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;    /* set reload register */  
     NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */  
     SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */  
     SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |  
                   SysTick_CTRL_TICKINT_Msk   |  
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */  
  return (0);                                                  /* Function successful */  
}  

其中写入SysTick->CTRL寄存器的表示使用HCLK作为Systick的时钟也就是72Mhz,Systick中断使能,并启动Systick定时器。

按照这个函数来算的话,写入SysTick->LOAD的值为72000000/100;这样算的话(1/72M)*SysTick->LOAD=10ms;故该RTT系统的最小调度时间就为10ms。

以上资料来自CM3中文参考手册

来源:梦想着破灭一切    
围观 6
165

通过在一个简便的STM32Cube扩展软件包内整合安全启动、安全固件更新和安全引擎服务,意法半导体的X-CUBE-SBSFU v.2.0能帮助产品开发人员充分利用STM32 *微控制器的安全功能保护物联网终端等联网设备的数据安全、管理生命周期。

通过在微控制器上建立可信根,X-CUBE-SBSFU安全启动可使知识产权得到保护,将启动安全检查并激活STM32的内置安全机制,而且每次执行用户应用程序前均会检查代码的真实性和完整性,以防止无效或恶意代码运行。当远程连接网络时,可信设备将按照公认的最佳安全实践参与身份互验。

固件安全更新功能解决了固件的安全加载和编程问题,有助于设备终身管理,并利用修补程序、功能升级和安全更新应对最新的网络威胁。安全加载程序支持多种业界认可的数字签名(ECDSA或AES方法)和密码加密(AES-GCM)算法,可以接收和验证加密的固件映像并解密,以及检查代码的完整性。安全编程功能同时支持单双映像更新与双映像更新。单映像更新可最大限度提高用户要写入的应用代码量。双映像更新能提供更高的更新灵活度,支持固件映像安装和空中下载(OTA)过程中的防回滚功能。

此外,X-CUBE-SBSFU安全引擎服务为密钥等关键数据存储和加密算法执行提供了一个受保护的环境,为物联网和联网设备提供了一套完整的安全服务。

X-CUBE-SBSFU扩展软件包以参考库的形式,向签署软件许可协议的用户免费提供,并附有帮助用户实现同类最佳的保护方法的技术文献,介绍STM32L4和STM32L4 +的最先进的安全功能的使用方法。STM32家族共有800多款产品,为用户提供广泛的性能、存储容量、集成功能、I/O和连接选择。基于意法半导体的STM32Cube软件技术,X-CUBE-SBSFU扩展软件包将简化安全设计在整个STM32家族中的跨系移植过程。X-CUBE-SBSFU软件包今后还将发布更新包,为STM32其它系列提供代码参考。

了解更多信息,免费下载X-CUBE-SBSFU,请访问 www.st.com/x-cube-sbsfu

围观 5
293

  •  业界首款免费的功能安全设计套件,可降低基于STM32的安全关键应用的设计复杂性和IEC 61508安全认证成本

  •  意法半导体原创安全文档和经过第三方认证的X-CUBE-STL软件自检库(STL),提供在STM32上设计并认证达到IEC 61508安全完整性等级(SIL3)的系统所需的全部功能

  •  适用于STM32F0微控制器的初版套件将在2018/2019期间扩充到STM32的其它产品系列

意法半导体针对其已取得巨大成功的STM32*微控制器发布了新的开发软件套件,助力科技公司以更快捷、更经济的方式设计更安全的应用。

工业控制、机器人、传感器、医疗或运输设备必须取得业界认可的安全标准IEC 61508的安全完整性等级(SIL)2级或3级证书。针对这些领域基于STM32的设备设计人员,意法半导体发布了一款能够简化系统开发和认证的STM32 SIL 功能性安全设计套件。

意法半导体微控制器产品市场总监Daniel Colonna表示:“为了帮助客户将经过安全认证的新产品快速、高效地推向市场,我们正在开发这种高附加值的意法半导体原创的多功能软件套件,其中包括经过认证的免费软件,这是业界首创。此外,通过在STM32微控制器产品组合中提供SIL功能安全设计包,意法半导体将为客户提供更高的设计灵活度,帮助他们优化物料成本。”

SIL功能安全设计包的组件包括技术文档和通过IEC 61508 SIL3认证的X-CUBE-STL软件自检库。SIL功能安全设计套件率先配备于STM32F0系列,之后意法半导体将在2018至2019年间陆续推出支持STM32全系产品的SIL功能安全设计包。目前STM32产品家族有800余款产品,为开发人员在价格优化、性能和功能集成度等方面提供独一无二的灵活性。

世界领先的国际标准功能性安全认证机构TÜVRheinland按照功能安全标准IEC 61508:2010给予X-CUBE-STL-F0软件正面评价,该证书的详细信息不久后将发布在www.fs-products.com网站上。

瑞士传感器制造商Contrinex是首个使用意法半导体功能性安全设计套件来认证采用STM32F0微控制器的安全产品的企业。Contrinex嵌入式软件开发项目负责人Nicolas Jouanne表示:“意法半导体微控制器的稳健性久经市场考验,再加上强大的SIL功能安全设计套件,已成为我们开发安全产品的放心之选。”

STM32F0微控制器的功能性安全设计套件可从www.st.com免费下载,用户须与意法半导体签署保密协议(NDA)。适用于STM32其它产品系列的软件包将在2018年和2019年陆续推出。

编者按

意法半导体的STM32 SIL功能性安全设计包含有开发STM32的符合IEC 61508功能安全要求的嵌入式系统所需的完整版技术文档。本文档包含详细介绍所有适用安全要求或使用条件的安全手册,以及说明开发人员根据IEC 61508验证其产品是否达到SIL 2或SIL 3安全等级的实现指南。此外,本文档还含有故障模式影响分析(Failure-Modes Effects Analysis ,简称FMEA )和故障模式影响和诊断分析(Failure-Mode Effects and Diagnostics Analysis ,简称FMEDA)。其中,FMEA 包含详细的微控制器故障模式和相关解决措施;而FMEDA则给出了在微控制器和基本功能层面上计算出的IEC 61508故障率报告静态截图。

X-CUBE-STL软件自检库是一款软件诊断套件,用于检测CPU、SRAM、闪存等STM32安全关键核心元件的随机性硬件故障。诊断覆盖率验证采用意法半导体独有的最先进的故障注入方法(fault injection methodology)。X-CUBE-STL整合在开发者熟悉且经过市场检验的STM32Cube工作流程内,与具体应用无关,从而允许与任何用户应用配合使用,以及提供与编译器中立的对象代码形式。

根据IEC 61508:2010功能安全标准,TÜVRheinland给予X-CUBE-STL-F0正面评测,证明其满足软件系统功能SC3的要求。此外,该机构还验证了诊断覆盖率(DC),使X-CUBE-STL-F0适合集成到SIL2HFT = 0和SIL3 HFT = 1的应用。

围观 4
258

页面

订阅 RSS - STM32