Skip to content

LV001-STM32概述

一、STM32简介

1. STM32与ARM

在2004年, ARM公司推出新一代Cortex内核后, ST公司抓住机遇,在很短的时间内就向市场推出了一系列的32位微控制器, 同时提供基于库的开发模式,加快用户研发周期。 STM32就是ST公司基于ARM Cortex-M系列内核设计的微控制器,专为高性能、低功耗、低成本场景设计。

STM32如今产品系列非常丰富, 主要为ARM Cortex-M内核系列MCU,也开始涉及ARM Cortex-A内核 系列MPU,如下图所示。

image-20230417223005421

按应用特性分类,可分为无线WB/WL系列、超低功耗L0/L1/L3/L5系列、主流G0/G4/F0/F1/F3系列、高性能F2/F4/F7/H7系列、全新的MP1系列。

STM32的处理器种类众多, 通过了解STM32的命令规范,可以了解整个STM32家族产品, 也方便以后 芯片选型, STM32 MCU系列命名规则(STM32 芯片命名规则,下图仅适用于 MCU) :

image-20230417223152126

其实每一款芯片都会有一个datasheet,也就是数据手册,在数据手册中会对芯片的命名有详细的说明,例如:

image-20230417223503942

总的来说ARM公司售卖Cortex-M系列的授权, 意法半导体(STMicroelectronics, ST)购买了该授权,生产了一些列STM32产品, 这些使用ARM技术的处理器,都习惯称为ARM处理器 。

2. 相关资料

这一部分主要是记录一下查找ARM和STM32官方文档的时候的一些相关链接。

2.1 ST官网

这个网站是ST的官方网站,所有的文档都可以从这里找,例如STM32相关的内容,我们就可以进入【产品】→【微控制器与微处理器】,然后我们点进入就可以看到相关的产品及相关资料啦。

image-20230408162122910

对于几乎所有的MCU,都会有数据手册参考手册,这两个手册必须下载。对于STM32系列的MCU, 通常还会有Cortex-M3/M4编程手册闪存编程手册、 勘误手册、官方固件包示例源码、官方固件包用户手册、 HAL库用户手册等,这些资料根据需求下载。 对于Cortex-M3/M4架构的的MCU, 如果需要深入了解Cortex-M3/M4内核,还需要Cortex-M3/M4权威指南,这个供我们深入学习。

2.1.1 搜索?

我们以STM32F103ZET6为例来看一看资料都在哪里:

image-20230420215031690

随后显示该搜索条件匹配的产品,如下图所示,可以看到只有一款产品符合搜索条件,点击该产品进入详细信息。

image-20230420215214197
2.1.2 文档?

在产品详细页,切换到“Documentation”标签, 可以看到该产品的所有文档手册,如下图所示为部分截图。

image-20230420215311634

后来网站都显示为中文了,如果打开都是英文页面的话,对应如下:

  • “ Product Specifications”(产品规格):也就是数据手册, 包含该系列MCU的整体描述、引脚描述、内存映射、电气特性、封装信息、订购信息等。在芯片选型、 原理图设计、 PCB设计、代码编程等开发环节,都会需要该文档;

  • “ Reference Manuals”(参考手册): 包含该系列MCU各外设寄存器的详细描述, 在代码编程时,需要找到对应外设章节, 仔细阅读;

  • “ Programming Manuals”(编程手册): 包含闪存编程手册和Cortex-M3内核编程手册, 一些资源是在内核里的,比如NVIC和SysTick, 此时在参考手册里找不到相关寄存器信息,就需要在Cortex-M3内核编程手册里查找;

  • “ Errata Sheets”( 勘误手册) : 包含该MCU内核、 外设资源的限制,解决方案等,在调试中出现了bug,可以看看该手册是否有类似记录;

2.1.3 开发工具?

除了这些文档外, 通常半导体芯片制造厂还会为MCU提供一些示例程序, ST也不例外。 在前面的产品详细页,切换到“ Tools & Software”标签,可以看到该产品的所有工具软件,比如各种硬件开发工具、软件开发工具、元件模块、评估工具软件、 MCU/MPU嵌入式软件、 产品评估工具、解决方案评估工具、工程服务、培训课程等 :

image-20230420215929780

比如我们可以在这里找到Keil MDK开发工具:

image-20230420224355525

还可以找到图形化开发工具STM32CubeMX,不过这里好像链接有些问题,点进去什么也没得,不过问题不大:

image-20230420224605541
2.1.4 固件包?

在上边开发工具里还会有一个 MCU & MPU Embedded Software 的栏目,也就是 MCU 及 MPU嵌入式软件:

image-20230420225046300

我们下载下来看一下,我们点进去后点击 Get Software就会来到下载的页面,选择和这个Get latest,然后会让我们登录,登录后就可以下载了。

image-20230420225341112
2.1.5 标准外设库?

之前学习的时候最开始学习的就是标准库开发,那库在哪里下载?

在这里【官网】→【工具与软件】→【嵌入式软件】→【微控制器软件】→【STM32微控制器软件】

image-20230420230207229

比如图中的标准库:STM32标准外设软件库 - 意法半导体STMicroelectronics

2.2 ST中文官网

这里会有大量的中文文档,好像也是ST的官方网站,我们想要找自己使用的芯片的相关文档的话,就可以从下图的地方寻找:

image-20230408162420343

那我们平时在网上看到的那些中文文档在哪里呢?我们可以进入首页后【设计资源】→【中英译文】

image-20230408162808406

然后在下边选择我们的单片机的系列,这样就可以找到一些相关的中文文档啦,不过这里似乎不太好用,因为我没找到我想找的中文文档。

image-20230408162919664

然后一看,右上角不是有搜索框嘛,这不试一下?我们以STM32F1为例,搜索结果如下:

image-20230408164622525

然后这里就会显示所有相关的中文的文档啦,下图中框的,我们打开看的话就会发现,这个文档就是我们平时看到的STM32中文参考文档的资料啦

image-20230408164718576

我们下载下来后,以正点原子提供的参考资料为准对比一下,看看是不是就是这一个,对比发现,是一样的,所以呢,我们完全可以从官网找到一些相关的中文文档。

image-20230408165138311

2.3 ST社区

有一些资料我们也可以去ST的社区查找:意法半导体STM32/STM8技术社区 - 提供最新的ST资讯和技术交流 (stmcu.org.cn)

2.4 常用资料

STM32F103xx英文数据手册STM32F103xC/D/E系列的英文数据手册
STM32F103xx中文数据手册STM32F103xC/D/E系列的中文数据手册
STM32F10xxx英文参考手册(RM0008)STM32F10xxx系列的英文参考手册
STM32F10xxx中文参考手册(RM0008)STM32F10xxx系列的中文参考手册
Arm Cortex-M3 处理器技术参考手册-英文版Cortex-M3技术参考手册-英文版
STM32F10xxx Cortex-M3编程手册-英文版(PM0056)STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版
SD卡相关资料——最新版本有关SD卡的一些资料可以从这里下载
SD卡相关资料——历史版本有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议
SD 2.0 协议标准完整版这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看
### 3. STM32长啥样? image1

上边这张图是STM32F103ET6的芯片,芯片正面是丝印,ARM是表示该芯片使用的是ARM的内核,STM32F103VET6是芯片型号,后面的字应该是跟生产批次相关,最下面的是ST的LOGO。

芯片四周是引脚,左下角的小圆点表示1脚,然后从1脚起按照逆时针的顺序排列(所有芯片的引脚顺序都是逆时针排列的)。 开发板中把芯片的引脚引出来,连接到其他各种芯片上(比如传感器), 然后在STM32上编程(实际就是通过程序控制这些引脚输出高电平或者低电平)来控制其他芯片工作。

以STM32F103ZET6为例,我们看一下它大概都有哪些资源:

STM32F103ZET6 资源
内核Cortex M3通用定时器8USART5
主频72Mhz高级定时器2CAN1
FLASH512KB12 位 ADC3SDIO1
SRAM64KBADC 通道数18FSMC1
封装LQFP14412 位 DAC2DMA2
IO 数量112SPI3RTC1
工作电压3.3VIIC2USB 从机1

4. STM32 命名

STM32 的命名规则如图 :

image-20250920131230571

二、最小系统

单片机最小系统是指用最少的电路组成单片机可以工作的系统,通常最小系统包含: 电源电路、时钟电路、复位电路、 调试/下载电路,对于STM32还需要启动选择电路。

1. 电源电路

不同的MCU的工作电压可能是不一样的,比如51单片机通常为5V,而STM32单片机通常为3.3V。 因此,通常需要查阅该MCU的数据手册才能确定工作电压和规范。

我们打开STM32F103xE数据手册(Datasheet - STM32F103xC, STM32F103xD, STM32F103xE - High-density performance line Arm®-based 32-bit MCU with 256 to 512KB Flash, USB, CAN, 11 timers, 3 ADCs, 13 communication interfaces) 找到“ 5.1.6 Power supply scheme ” 电源方案小结,可以看到如下图框图。

image-20230417225559820

根据数据手册的“ 5.3.1 General operating conditions”的表10 ,可得知上图中的各电压值大小。

image-20230417225902352

(1)VDD-VSS: 标准工作电压;电压范围: 2V~3.6V; 从VDD1 ~ VDD11, VSS1 ~ VSS11共有11组;需要11个100nF和1个4.7uF去耦电容; 经过MCU内部Regulator电源管理, 为CPU、 存储器等供电; (2)VDDA-VSSA: 模拟工作电压;电压范围: 2V~3.6V(未使用ADC) 2.4V~3.6V(使用ADC);需要1个10nF和1个1uF去耦电容; 由VDDA输入,为ADC、 DAC等供电; (3)VREF+-VREF-: 基准参考电压;电压范围: 2.4V~ VDDA; 可以使用独立参考电压VREF(需10nF+1uF高频滤波电容), 也可使用VDDA输入,为ADC、 DAC等作基准参考电压; (4)VBAT: RTC备用电源; 电压范围: 1.8V~ 3.6V; 通常使用纽扣电池外部供电,当主电源VDD掉电后,VBAT为实时时钟( Real-Time Clock, RTC) 和备份寄存器供电(此时功耗超低) ;

2. 时钟电路

MCU是一个集成芯片, 由非常复杂的数字电路和其它电路组成, 需要稳定的时钟脉冲信号才能保证正常工作。 时钟如同人体内部的心脏一样,心脏跳动一下, 推动血液流动一下。时钟产生一次, 就推动处理器执行一下指令。除了CPU,芯片上所有的外设(GPIO、 I2C、 SPI等)都需要时钟,由此可见时钟的重要性。

芯片运行的时钟频率越高,芯片处理的速度越快,但同时功耗也越高。为了功耗和性能兼顾,微处理器一般有多个时钟源,同时还将时钟分频为多个大小,适配不同需求的外设。

STM32的时钟树我们需要在STM32参考手册(STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs - Reference manual)中查找,我们打开手册到 “ 7.2 Clocks ”,则有如下时钟树:

image-20230417230846857

可以看到一共有四个时钟源:

(1)HSI(High Speed Internal clock signal):

HSI是内部的高速时钟信号,频率8MHz。因为是内部提供,可以降低成本,缺点是精度较差。

(2)HSE(High Speed External clock signal):

HSE是外部的高速时钟信号,需要外部电路晶振,输入频率范围要求为4-16MHz。因为需要外部电路提供,成本会增加,但精度较好。

(3)LSE(Low Speed External clock signal):

LSE是外部的低速时钟信号,需要外部电路晶振,输入频率范围要求为32.768KHz。 一般用于RTC实时时钟。

(4)LSI(Low Speed Internal clock signal):

LSI是内部的低速RC振荡器,频率40KHz。一般用于看门狗、 RTC实时时钟等。对于STM32F103系列的MCU, 都需要一个高速时钟和一个低速时钟,而这两个时钟可以选择使用内部时钟源节约成本,也可以选择外部时钟源输入提高精度。 如果使用内部时钟源,则无需设计外部电路,反之,则需要时钟电路。

继续查看STM32数据手册的“ 5.3.6 External clock source characteristics ”,可以看到下图所示的外部时钟输入参考电路。

  • HSE 典型应用(8MHz)

对于HSE,当晶振为8MHz时, CL1和CL2的容值范围为5pF~25pF。 REXT用于产生负反馈,保证放大器工作在高增益的线性区, 同时也起到限流作用,通常在兆欧级,具体由晶振决定。

image-20230417231317291
  • LSE 典型应用(32.768KHz)

对于LSE,当晶振为32.768KHz时, CL1和CL2的容值范围为5pF~15pF。之所以选择32.768KHz,是因为 32768=215, 分频设置寄存器通常为2n的形式,这样经过15次分频就很容易得到1Hz的频率。

image-20230417231355101

3. 复位电路

嵌入式系统中, 由于外界环境干扰, 难免出现程序跑飞或死机, 这时就需要复位让MCU重新运行。在打开STM32F103xE数据手册(Datasheet - STM32F103xC, STM32F103xD, STM32F103xE - High-density performance line Arm®-based 32-bit MCU with 256 to 512KB Flash, USB, CAN, 11 timers, 3 ADCs, 13 communication interfaces)中查找,我们打开手册到 “ 5.3.15 NRST pin characteristics ”,则有如下复位电路:

image-20230417231603407

该电路将一个按键接在了NRST引脚,一旦按键按下,NRST就会接地,拉低NRST,实现复位 。

4. 调试/下载电路

不同的MCU,调试/下载的方式可能不一样。比如51系列单片机,使用串口下载程序,同时也使用仿真调试。 对于STM32, 可以使用串口下载程序,也能使用串口打印进行简单调试,但STM32支持更高效的JTAG( Joint Test Action Group) 调试接口和SWD( Serial Wire Debug) 调试接口。

STM32 的 JTAG 与 SWD 的接口共用, 如果下载器支持 SWD 调试模式, 则接上 JTAG 的时候同样可以使用 SWD模式。 常见的支持 SWD 模式的下载器有 JLINK V7/V8 和 ST LINK 等。

所涉及的引脚我们也可以查看STM32的参考手册(STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs - Reference manual)的“ 9.3.5 JTAG/SWD alternate function remapping ”一节:

image-20230417231931946

关于更加详细的内容可以查看STM32参考手册(STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs - Reference manual)的 “ 31 Debug support (DBG) ” 一节,有更为详细的说明。

一般设计原理图如下:

image-20230417232058730

4.1 JTAG协议简介

JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。可以对 FLASH 等器件进行程序的编程和烧写。 标准的 JTAG 接口是模式选择(TMS)、 时钟(TCK)、 数据输入(TDI)、 数据输出(TDO) 四线制接线。 它可以对多个串联在同一个接口上的器件分别进行测试。 现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。相关JTAG引脚的定义为:

引脚定义说明
TMS模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;
TCK时钟输入
TDI数据输入,数据通过TDI引脚输入JTAG接口;
TDO数据输出,数据通过TDO引脚从JTAG接口输出;

4.2 SWD协议简介

串行调试(Serial Wire Debug),与 JTAG 相比,SWD只要两根线,分别为:SWCLK和SWDIO,减少了对单片机GPIO口的占用:

引脚定义说明
SWDIO串行数据线,用于数据的读出和写入
SWDCLK串行时钟线,提供所需要的时钟信号

SWD 模式比 JTAG 在高速模式下面更加可靠。 在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多。基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 只要仿真器(仿真器是啥?后边写STM32工具相关的时候会有笔记说明)支持。

5. 启动选择电路

不同的MCU, 启动的方式的种类可能不一样。比如51系列单片机, 只能从内置存储器读取数据启动,因此没有启动选择的必要。

对于STM32, 可以从内置存储器启动(默认) ,可以从系统存储器(用于从USART1下载程序),可以从内部SRAM启动(调电消失,可用于调试) , 出现多个启动方式, 就需要启动选择。STM32通过BOOT1和BOOT2引脚的电平组合进行启动选择这一部分我们可以查看STM32的参考手册(STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs - Reference manual)的“ 3.4 Boot configuration ”。

image-20230417232300976

(1)BOO1为任意, BOOT0为0,开发板上电, MCU将从内部主存储器读取数据启动,是最常用的启动方式。

(2)BOO1为0, BOOT1为1,开发板上电, MCU将从系统存储器读取数据启动, 在系统存储器里面厂家烧写的串口下载程序, 此时可以通过USART1烧写新程序到主存储器。

(3)BOO1为1, BOOT1为1,开发板上电, MCU将直接从内部SRAM启动,SRAM的烧写次数寿命比Flash更多,可用于调试。

通常,我们只使用主存储器启动即可。 从系统存储器启动,实现从串口下载程序也逐渐被淘汰, STM32的高端MCU已经不支持该方式下载。从SRAM启动也没什么必要,目前Flash的烧写寿命次数也远远超过用户实际烧写次数。