STM32

STM32是STMicroelectronics(意法半导体)推出的一系列基于ARM Cortex-M内核的32位微控制器(MCU)产品。这些微控制器提供了广泛的产品系列,覆盖了多种不同的性能和功能需求,适用于各种应用领域,包括工业控制、汽车电子、消费类电子、医疗设备等。

STM32系列微控制器以其高性能、低功耗、丰富的外设接口和灵活的开发工具而闻名。它们通常具有丰富的存储器、多种通信接口(如UART、SPI、I2C、CAN等)、模拟数字转换器(ADC)、定时器、PWM输出等功能,以满足不同应用场景下的需求。

STM32微控制器通常使用标准的ARM Cortex-M内核,包括Cortex-M0、M0+、M3、M4和M7等,这些内核具有不同的性能和功耗特性,可根据具体应用的需求进行选择。此外,STM32系列还提供了多种封装和引脚配置,以满足不同尺寸和集成度的要求。

STMicroelectronics为STM32系列提供了丰富的开发工具和支持资源,包括基于ARM开发环境的集成开发环境(IDE)、调试器、评估板和参考设计等。这些工具和资源有助于开发人员快速开发和部署他们的应用,并提供了全面的技术支持和文档资料,帮助用户充分发挥STM32微控制器的性能和功能优势。

意法半导体发布了三款功能安全软件包,简化基于STM32和STM8微控制器和微处理器的安全至关重要的工业、医疗、消费和汽车产品的开发。

这些软件包可免费下载使用,其中包含满足适用的IEC和ISO规范所需的资源。意法半导体拥有1000多款STM32微控制器,以及包括STM8AF汽车级认证产品在内的STM8系列微控制器,为开发者提供广泛的产品选型和亲民的价格,而价格昂贵的专用安全MCU通常是无法做到这两点的。

工业用功能安全软件包X-CUBE-STL通过了TÜV Rheinland认证测试机构的IEC 61508 SC3认证,与安全手册的使用条件配合使用,可以在STM32上实现安全完整性等级SIL-2或SIL-3的安全功能。

X-CUBE-STL现已上线,支持大多数STM32产品,按照计划,2020年第四季度将发布支持STM32L5、双核STM32H7和STM32MP1的软件包。

面向安全至关重要的家用电器,X-CUBE-CLASSB通过了Underwriters Laboratories(UL)的IEC 60335-1和60730-1的功能安全认证,适用于STM32F0、G0、F1、F3、G4、F2、F4、F7、H7、L0、L1、L4和WB系列STM32微控制器。

STM8-SafeCLASSB软件包让设备开发人员能够利用STM8产品的高能效、低成本和低功耗优势。

X-CUBE-STLX-CUBE-CLASSBSTM8-SafeCLASSB包含与应用无关的针对CPU内核和内存组件的自检库,以及必要的安全文档。

STM8A-SafeASIL软件包提供最高ASIL B级汽车功能安全应用开发所需的文档,适用于符合ISO26262的软件开发流程,可帮助用户实现STM8AF安全手册要求的软件自检库。

所有嵌入式开发人员都能利用这些软件包来克服工程难题,加快项目研发周期,最大程度地降低认证成本。

ST 授权合作伙伴的服务支持覆盖产品开发生命周期的各个阶段,包括安全要求制订;安全诊断、测试和验证;以及产品认证。这些授权合作伙伴包括Embedded Office、Microsoft、 Arm®、SEGGER和Wittenstein,每家授权公司都提供支持STM32微控制器和微处理器的安全RTOS操作系统。此外,IAR Systems和Arm还提供取得功能安全认证的STM8和STM32编译器。

Embedded Office、Hitex、innotec、MESCO和NewTec提供软件、设计和工程服务、参考平台和培训设施,以支持客户项目开发。

新功能安全软件包现已上线,用户可免费下载使用。X-CUBE-STLSTM8A-SafeASIL下载需要签订保密协议(NDA)。详情联系意法半导体当地销售办事处。

详情访问 https://www.st.com/functionalsafety

关于意法半导体

意法半导体(STMicroelectronics; ST)是全球领先的半导体公司,提供与日常生活息息相关的智能的、高能效的产品及解决方案。意法半导体的产品无处不在,致力于与客户共同努力实现智能驾驶、智能工厂、智慧城市和智能家居,以及下一代移动和物联网产品。享受科技、享受生活,意法半导体主张科技引领智能生活(life.augmented)的理念。意法半导体2019年净收入95.6亿美元,在全球拥有10万余客户。详情请浏览意法半导体公司网站:www.st.com

围观 12

作者:wenzid

内存映射

在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于 RAM 紧缺的嵌入式系统中,是缺少 MMU 内存管理单元的。因此在一些嵌入式系统中,比如常用的 STM32 来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。

STM32 的 Flash 和 RAM 地址范围

笔者标题所说的内存是指 STM32 的 Flash 和 RAM,下图是 ARM Cortex M3 的地址映射图:


从图中我们可以看到 RAM 地址是从 0x2000 0000 开始的,Flash地址是从 0x0800 0000 开始的,笔者将在下文中着重对这两部分进行剖析。

Flash

代码和数据是存放在 flash 中的,下面是将 flash 内部进行细分之后的一张图,图中标明了代码段,数据段以及常量在 flash 中的位置。


如上图所示,Flash 又可以细分为这么几个部分,分别是文本段 (Text),其中文本段中又包含可执行代码 (Executable Code)和常量 (Literal Value),在文本段之后就是只读数据区域 (Read Only Data),当然并不是所有架构的单片机都满足这样一个排布规律,这里只针对ARM Cortex M3 系列,只读数据段后面接着的就是数据复制段 (Copy of Data Section),第一次遇到这个概念的朋友看到数据复制可能会有所疑惑,其实这个段充当的作用是存放程序中初始化为非 0 值的全局变量的初始值,之所以要将初始值存放到这里,是因为全局变量是存放在 RAM 上的,RAM 上的值掉电便丢失,每次上电后这些变量是要进行重新赋值的,而重新赋的值就存放在这里。那为什么不存放初始化为 0 的全局变量初始值呢,原因也很简单,既然是初始化为 0,那么在上电后统一对存放初始化为 0 的全局变量的那块区域清0就好了。

下面举一个例子分析各个变量在上述中的存储位置:

#include <stdio.h>
const int read_only_variable = 2000;
int data = 500;

void my_function(void)
{
	int x = 200;
	char *str = "string";
}

在上述代码中,read_only_variable 是一个用 const 修饰的全局变量,它是只读的,存放在 flash 中的只读数据区域,编译器会给 read_only_variable 分配一个地址,并将 2000 这个数据存放到这个位置。data 这个变量将存放到 RAM 中的RW区域中 (后面将会进行详细讲解),但是 data 后面的初始值 500 将会被存放到数据复制区域中, 也就是上图中从下往上的第三个区域。在 my_function 中的变量 x 将会被存放到 RAM 中的堆栈中,将 x 赋值为 200 ,200 将被存储到 flash 里的 Text 中的常量区 (Literal Valu) 中。str 是一个 char 型的指针变量,它指向的是字符串第一个字符存放的位置,然而对于字符串 string 来讲,它是存放在Text常量区的,所以指针变量指向这个区域的一个地址,但是因为它终归中局部变量,它指向 Flash 的一个地址,但是其本身还是存放于 RAM 中的堆栈上的。

RAM

STM32单片机的片内RAM会被链接文件“分区”为如下几个段:


如上图所示,RAM 中包含了如下几个部分:

  • 栈 (Stack) : 存放局部变量和函数调用时的返回地址
  • 堆 (heap) : 由 malloc 申请,由 free 释放
  • bss : 存放未初始化或者是初始化为 0 的全局变量
  • data : 存放初始化为非 0 值的全局变量

下面举一个简单的例子来说明变量在各个段中的存储位置:

#include <stdio.h>
#include <stdlib.h>
int data_var = 500;
int bss_var0;
int bss_var1 = 0;
static int static_var;

void my_function(void)
{
	static int static_var1 = 0;
	int stack = 0;
	char *buffer;
	const int value = 1;
	buffer = malloc(10);
}

上述变量的命名已经很清楚地表明了变量处于 RAM 中的哪一个段,data_var 是已经初始化的全局变量,存放在 RAM 的 data 区,bss_var0 和 bss_var1是未初始化和初始化为0的全局变量,他们都存放于 RAM 中的 bss段,由 static 修饰的static_var 和 static_var1 都存放于 bss段,区别只在于两个变量的作用域不同。stack 是在函数内部定义的局部变量,其存放于 RAM 的栈区域,用 const 修饰的局部变量 value ,虽然他是只读的,但是它是存储于 RAM 中的栈中的,这里也说明一点,并不是所有用 const 修饰的变量都是存放于只读变量区的。buffer指针变量用 malloc 函数申请了 10 字节的内存空间,那这10字节的内存空间位于堆中。

堆栈溢出

如果在程序运行的过程中,堆的空间也一直在消耗,同时栈的空间也在增加,那么这时堆和栈如果碰到一起,那么就会造成堆栈溢出,从而导致我们的程序跑飞。

STM32中的map文件分析

在用 keil 编译 STM32 工程之后,我们会得到一个 map 文件,map 文件的最底部有这么一个信息:


上图中的各个段是和上文所述是能够进行对应起来的,正如下面这张表所示:


总结

对于 RAM 和 flash 空间都有限的 MCU 来讲,了解各个变量在内存中的存储位置是很有必要的,他能够很好地帮助我们去解决很多问题。

最后如果您觉得文章对您有所帮助,欢迎关注作者个人公众号:wenzi嵌入式软件

本文转自博客园 - wenzi
https://www.cnblogs.com/wenziw5/p/12801667.html

围观 890

STM32系列是ST公司基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核的32位单片机。按内核架构分为不同产品:

STM32外设有哪些?

其中STM32F系列有:STM32F103“增强型”系列、STM32F101“基本型”系列、STM32F105、STM32F107“互联型”系列。

增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。

在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。

STM32外设有哪些?

外设指的是单片机外部的外围功能模块,比如键盘控制芯片,液晶,A/D转换芯片,等等。外设可通过单片机的I/O,SPI,I2C等总线控制。

常见STM32外设:基本IO、定时器TIM、串口USART、ADC模数转换、DAC数模转换、SPI串行通信、EXIT外部中断、BKP备份数据、RTC闹钟SysTIck系统滴答、WDG看门狗(独立+窗口)、DMA传输数据、片内FLASH编程、FSMC读写外部SRAM、外部NorFlash操作等。

STM32外设的初始化和设置:在设置一个外设前,必须调用以下一个函数来使能它的时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE);

1.在主应用文件中声明一个结构PPP_InitTypeDef,例如: PPP_InitTypeDef

PPP_InitStructure;

2.为变量PPP_InitStructure的各个结构成员填入允许的值。可以采用以下2种方式:

a) PPP_InitStructure.member1 = val1;

b) PPP_StrucTInit(&PPP_InitStructure) PP_InitStructure.memberX = valX;

3.调用函数PPP_Init()来初始化外设PPP;

4.在这一步,外设PPP已被初始化。可以调用函数PPP_Cmd( )来使能之。

使用STM32外设的步骤:

1.PPP_Init() 函数,其功能是根据PPP_InitTypeDef中指定的参数,初始化外设PPP,如TIM_Init()名为PPP_DeInit()函数,其功能为复位外设PPP的所有寄存器至缺省值。

2.PPP_StructInit() 函数,其功能为通过设置PPP_InitTypeDef 结构中的各种参数来定义外设的功能,例如:USART_StructInit()。

3.PPP_Cmd() 函数,其功能为使能或者失能外设PPP,例如:SPI_Cmd。

4.PPP_ITConfig() 函数,其功能为使能或者失能来自外设PPP的中断源,例如:RCC_ITConfig。

5.PPP_DMAConfig() 的函数,其功能为使能或者失能外PPP的DMA接口。

6.PPP_GetFlagStatus() 的函数,其功能为检查外设PPP某标志位被设置与否。

7.PPP_ClearFlag() 的函数,其功能为清除外设PPP标志位,例如:I2C_ClearFlag。

8.PPP_GetITStatus() 的函数,其功能为判断来自外设PPP的中断发生与否。

9.PPP_ClearITPendingBit() 的函数,其功能为清除外设PPP中断待处理标志位。

转自: 嵌入式资讯精选

围观 237

2020年2月28日 – 横跨多重电子应用领域的全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST; 纽约证券交易所代码:STM) 为STM32MP1系统微处理器(MPU)产品增加了新的授权合作伙伴和软件功能,并显著提升了处理性能,将时钟速度提高到800MHz,软件引脚与650MHz产品兼容。

新STM32MP1 MPUs现在搭载800MHz Arm®Cortex®-A7双核应用处理器和209MHz Cortex-M4处理器,具有优异的语音和音频处理性能,解码质量达到高清视频级别,在神经网络和机器学习应用中,能够实现更强大的AI(人工智能)功能,还为Android系统带来更好的用户体验。新产品集成运算及3D图形加速器,兼备高能效实时控制和高集成度。

Qt公司高级副总裁Petteri Holländer表示:“我们的高人气的Qt HMI工具包及其基于QML的GUI应用软件都可以部署在STM32 MCU和STM32MP1平台上,在大幅降低开发成本的同时加快客户产品交付周期。ST和Qt的可扩展工具套件可以轻松利用STM32MP1的硬件资源,尤其是3D 硬件GPU加速器,为工业 / 物联网应用带来一个流畅的人机界面渲染解决方案。”

利用STM32MP1的灵活架构,新产品增强了客户代码安全保护功能,例如,身份验证安全启动、客户可用一次性可编程熔丝,以及安全操作系统(OP-TEE:可信执行环境)。密钥生成器签名工具、STM32CubeProgrammer和硬件安全模块(STM32HSM)等整套安全工具可将客户的加密数据安全地输入微处理器。

作为一个主线开源Linux操作系统,OpenSTLinux Distribution 具有在应用处理器内核上运行软件所需的全部基本组件,帮助客户加快开发周期,现在又新增了Android开发者软件包和云计算支持。意法半导体继续积极参与Linux社区开发,坚持主线内核战略。

Bootlin首席执行官Michael Opdenacker表示:“ ST积极参与Linux内核社区活动,这给我们留下深刻的印象。Linux和STM32MP1同步发布将使此次发布会得到更高的关注度。我们认为,ST知道客户的兴趣在哪里,主线版本支持开源项目,新版本免费升级,零成本安全更新,开发社区支持,以及保护长期投资。享有相同的开源DNA,Bootlin很荣幸能成为ST授权合作伙伴,在这个平台上向全球客户提供工程和培训服务。”

除了STM32CubeMX和STM32CubeProgrammer等强大软件工具外,现在STM32CubeIDE调试器也可以在Cortex M-4内核上使用。

授权合作伙伴数量的快速增长极大地扩大了客户的研发能力范围,并加快了STM32MP1系列MPU应用开发周期。除了嵌入式软件 和软件开发工具外,合作伙伴还在培训 和 工程服务方面贡献专业知识。意法半导体与Phytec等多家模块系统厂商合作,满足客户对本地技术支持和系统灵活性的需求。

Phytec产品经理Yves Astein表示:“持续丰富扩大的STM32MP1产品系列,以及大量的图形处理功能和丰富的通信接口,为Phytec的phyCORE-STM32MP1系统模块提供了工业级外设,使得该模块成为人机接口以及各种实时交互应用的最佳选择。这款PhyCore 系统级模块及长期维护服务可降低任何嵌入式设计的复杂性,同时与ST团队的良好关系使我们能够按时交付系统模块,保证客户设计安全。”

意法半导体还与系统级封装制造商Octavo Systems合作,满足空间受限应用的设计需求。

Octavo Systems战略副总裁Greg Sheridan表示:我们很快意识到,Octavo必须开发一个基于STM32MP1的系统级封装,利用ST的Cortex-M产品悠久的成功历史来简化微处理器的开发使用。我们的OSD32MP1 SiP在一个18mm x 18mm的微型封装内集成STM32MP1、STPMIC1、DDR3、振荡器和无源器件,使微处理器像微控制器一样容易上手,让设计人员没有任何生疏感。结合ST授权合作伙伴计划的支持,OSD32MP1 SiP让客户能够在一款功能强大的微处理器上快速开发产品。”

STM32MP1 MPU已通过工业标准认证,结温范围-40°C至125°C,10年成本归集期作业率为100%。800MHz Cortex-A7版STM32MP1现已投产。

详情查阅https://blog.st.com/mpu-stm32mp1/

围观 8

作者:华清远见王老师

单片机是指一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。

早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。我们说的51一般是指51系列的单片机,型号有很多,常见的有 STC89C51、 AT89S51 ,其中国内用的最多的是STC89C51/2  

随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。

当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。其中ST公司的32位微处理器STM32系列占据了大量的市场份额(华清远见近期与ST公司也有STM32项目方向的合作,主要是STM32MP1多核微处理器系列,ST公司最新推出的第一款MPU产品,感兴趣的朋友也可关注这里)。

那么作为开发者在开发51系列单片机与stm32系列单片机时存在什么样的差异性呢,下面就以国内用的最多STC89C51为51系列单片机代表和stm32对比讨论下。

1. 编程语言

由于51单片机结构相对简单,所以通常多使用汇编语言和C语言编程。而STM32系列的开发工作,不会采用汇编语言,因为工程量巨大,寄存器太多了,位数也多。

2. 编程方式

51单片机的任何器件只需要配置寄存器打开就可以进行编程,而STM32系列单片机则需要先打开对应的时钟,包括开启后打开外部时钟(晶振)才开始工作。

3. 库函数不同

由ST厂商推出的STM32系列单片机,ST厂商给了丰富的函数库,可以直接使用库函数,所以比起普通的51单片机在程序编写方面要更加的省时。

4. 资源不同

STM32的内部资源(寄存器和外设功能)较普通的51单片机都要多,基本上接近于计算机的CPU了,所以在程序编写上能有更多的选择。

结论:

通过上边的对比可以看到,虽然可以使用相同的编程语言进行程序编写,但是在编程方式和编程的快捷程度上均是STM32比较优秀。

51确实是经典,但也确实有点过时了。而无论是51系列还STM32系列,都同属于单片机,可以说STM32系列是51系列的继任者,随着现在技术发展,对硬件的拓展性和处理能力上有了更高的要求。STM32无论是内核部分还是总线宽度;无论是速度、功耗、外设都比51系列强大。

延展阅读:嵌入式与单片机的渊源

用一句话来说:单片机是属于嵌入式的一个分支。

从嵌入式的发展史上看:早在20世纪60年代,嵌入式技术就开始应用于通信领域。70年代,微处理器的广泛应用形成了一个广阔的嵌入式应用市场。80年代,单片机成为嵌入式计算机系统异军突起的一支新秀。其后发展的DSP产品则进一步提升了嵌入式计算机系统的技术水平。到了21世纪PC互联网时代及移动互联网时代,嵌入式计算机系统应用到了各类网络。而在万物智联的今天,物联网、人工智能产业的正在快速的发展,也再次带火了嵌入式,软硬件结合的浪潮将嵌入式带入了更广阔的应用舞台。

来源: 华清远见

围观 297

页面

订阅 RSS - STM32