目录

关于STM32

STM32F1

存储器

位带操作

三种启动模式

低功耗模式

复位

时钟系统

STM32库

仿真器和调试器


注:本文大部分内容来自于STMCU官网以及STM32数据手册。

STM32使用的是ARM公司的Cortex-M系列的内核,ARM将MCU的设计卖给其他公司,其他公司再添加总线和各种外设接口,就形成了STM32单片机。

在这些下游商家中,以意法半导体公司(STMicroelectronics)最为知名,产品最为成熟。

ST官网(打开非常慢,经常打不开):首页 - STMicroelectronics

意法半导体不只是做STM32,还有其他各种半导体产品。

其中,有一个单片机的专门网站(重点关注):

意法半导体STM | STM32/STM8微控制器 | MCU单片机

可以先将这个网站仔细浏览一遍。以下记录重要内容。

关于STM32

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。覆盖超低功耗、超高性能方向,同时兼具市场竞争力。

STM32致力于ARM® Cortex® 内核单片机和微处理器和微处理器市场和技术方面,目前提供18大产品线 (F0, G0, F1, F2, F3, G4, F4, F7, H7, MP1, L0, L1,L4, L4+,L5,U5,WB,WL),超过1000个型号。

STM32产品广泛应用于工业控制、消费电子、物联网、通讯设备、医疗服务、安防监控等应用领域,其优异的性能进一步推动了生活和产业智能化的发展。

系列产品如下所示:

其中:

L是低功耗,F是普通的,L系列一般都只有低端产品,F则从低端到高端非常全。

G应该是表示入门级?H表示高性能?这两个型号含义具体不详,如此理解也无妨。

其他还有U系列等等。

G系列和U系列都是比较新的产品(2022年8月)

  • 极端低功耗系列:STM32L0,STM32L1,STM32L4,性能依次增强。
  • 主流系列: STM32F0,STM32F1,STM32F3,性能依次增强。
  • 高性能系列: STM32F2,STM32F4,STM32F7,STM32H7,性能依次增强。

在STM32相同内核的F系列和L系列中(比如F0和L0系列),最主要的不同是对于功耗的控制,其中L系列是针对电池供电应用做过功耗优化的,一般比同型号的F系列主频低,功耗也低很多。而F系列则主要考虑性能和价格因素,所以像智能穿戴产品这类应用一般都会用到L0或者L4系列的MCU作为主控。而一些使用外部供电的家用电器,则对于功耗要求没有那么高,就会考虑F0或者F4系列,这些性价比更好一些。

产品命名含义

比如我们学习时用的STM32F103C8;

再比如我们公司用的STM32F103RCT6等等。

STM32F1

功能展示:

STM32F103xx增强型系列使用高性能的ARM Cortex-M3 32位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:多达2个I2C和SPI、3个USART、一个USB和一个CAN。
STM32F103xx增强型系列工作于-40°C至+105°C的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。
这些丰富的外设配置,使得STM32F103xx增强型微控制器适合于多种应用场合:
● 电机驱动和应用控制
● 医疗和手持设备
● PC外设和GPS平台
● 工业应用:可编程控制器、变频器、打印机和扫描仪
● 警报系统,视频对讲,和暖气通风空调系统

嵌套的向量式中断控制器(NVIC)

STM32F103xx增强型内置嵌套的向量式中断控制器,能够处理多达43个可屏蔽中断通道(不包括16个Cortex-M3的中断线)和16个优先级。
● 紧耦合的NVIC能够达到低延迟的中断响应处理
● 中断向量入口地址直接进入核心
● 紧耦合的NVIC接口
● 允许中断的早期处理
● 处理晚到的较高优先级中断
● 支持中断尾部链接功能
● 自动保存处理器状态
● 中断返回时自动恢复,无需额外指令开销
该模块以最小的中断延迟提供灵活的中断管理功能。
时钟和启动
系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以选择外部的、具失效监控的4~16MHz时钟;当外部时钟失效时,它将被隔离,同时会产生相应的中断。同样,在需要时可以采取对PLL时钟完全的中断管理(如当一个外接的振荡器失效时)。
具有多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和高速APB的最高频率是72MHz,低速APB的最高频率为36MHz。
自举模式
在启动时,自举管脚被用于选择三种自举模式中的一种:
● 从用户闪存自举
● 从系统存储器自举
● 从SRAM自举
自举加载器存放于系统存储器中,可以通过USART对闪存重新编程。
串行线JTAG调试口(SWJ-DP)
内嵌ARM的SWJ-DP接口和JTAG接口,JTAG的TMS和TCK信号分别与SWDIO和SWCLK共用管脚,TMS脚上的一个特殊的信号序列用于在JTAG-DP和SWJ-DP间切换。

内部框图

存储器

STM32是32位CPU,数据总线是32位的。
STM32的地址总线也是32位的。
STM32可以访问的地址容量是:4GB(2的32次方Byte)STM32没有用到所有4GB的空间。

ARM是内存与IO统一编址的。

ARM采用的是小端模式。

内存映射

注意,上面标注的地址是每一块的起始地址。

比如,TIM2的地址范围为0x40000000~0x400003FF。

在左侧的内存映射图中,有些之所以只有起始地址,没有结束地址,是因为不同型号的单片机是不一样的,起始地址都是一样的,结束地址根据其实际大小来决定。你空间大一些,我其后的保留地址就相应小一些。

F10x系列配置静态SRAM,起始地址为0x20000000,大小为20k字节。

位带操作

在32中,有一种操作方式,叫做位带(Bit-banding)操作。

什么是位带操作呢?

回顾下51单片机,我们可以对整个端口进行操作,但是也可以进行寄存器位操作。

显然,位操作是很有必要的,且不会影响到其他的位。

但是,在32中,无法针对特定位进行操作,而是需要进行寄存器整体操作,也就是说,如果想要操作某一位,就要操作32位寄存器,先读出32位,修改,然后再写入,也就是针对32位地址的读改写操作。

显然,每次操作一位就要进行如此繁杂的操作,效率不高。

为了解决这个问题,32就设定了一种位带操作的机制。即每一个位都有一个对应的32位地址与其相对应,只要操作这32位地址,就会映射到要操作的位,从而提高运行效率。

这些32位地址就称为对应位的别名。

别名存储器区——字(32位)

|
映射

|
位段存储区——位

映射公式如下:

映射的别名地址=别名区的起始地址

+ 位段区中包含目标位的字节的编号*32

+ 目标位的位位置*4

举例如下:

由此可知:别名存储器区大小等于位段存储器区大小的32倍。

三种启动模式

32支持3种启动方式。通过boot[1:0]引脚来选择启动方式。

用户闪存存储器区:是给我们设计来放置用户写的代码的,我们程序员写的代码烧录时就被烧录到这里了,正常工作状态下就要把STM32设置为从这里启动。

系统存储器区:在非常规情况下用,用来实现ISP功能的。

内嵌SRAM区:这种也是非常规的,用来实现调试器调试功能的。

ISP实现

ISP原理回顾
第1步:先设置BOOT1和BOOT0从系统区启动,执行系统中预设的程序
第2步:主机通过串口发送要下载的hex文件给STM32
第3步:系统预设的程序接收到hex后将其烧录到用户区flash中
第4步:设置BOOT1和BOOT0为从用户区启动,然后复位重启执行刚才下载的hex即可

在这期间,系统和软件需要完成启动方式的切换。

可以使用商家提供的ISP直接进行32程序的下载,那么,自动下载电路是如何实现启动方式的切换的呢?

自动下载电路:

已知CH340是一个USB转串口芯片。参考:基于CH340G的USB芯片的学习_FPGAI的博客-CSDN博客_ch340g

按照商家给的说明,电源打开的状态下,下载程序,没有反应。

重启后才能生效。

说明:

仔细看资料,才知道我买到的开发板(转接板)没有实现自动下载的功能,默认就将BOOT0和BOOT1接地了,所以,程序会直接下载到flash中,需要下一次启动后,才能从flash中读取程序执行。

也就是说,用不到系统存储区了。

更详细的内容,请参考:

【单片机】一文彻底搞懂单片机程序烧录_记录无知岁月的博客-CSDN博客_单片机下载程序

单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?_码农爱学习的博客-CSDN博客_isp烧录原理

注意,系统存储器是芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,然后锁死,就是通常说的ISP程序,这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。

电源管理

STM32单片机一般都是3.3V供电,而生活中一般常见的都是5V电源(如电脑的USB口,手机充电器,移动电源...),所以一般使用稳压电源芯片将5V降压为3.3V。

STM32的供电电压在外部看来一般就是外设的3.3V供电,但内核、存储器等部件一般使用1.8V电压供电,但不需要自行引入。STM32为了简化外围电路设计,一般是不额外引入内核供电电源引脚,这样你只输入一路3.3V,其他电压由内部线性稳压获得。(这与FPGA的设计不同,FPGA一般需要1.2、1.8和3.3三路供电,STM32这种低成本的控制器不会设计得这么繁琐。)

STM32电源框图如下:

POR和PDR

POR:POR = Power On Reset 上电复位;

PDR = Power Down Reset 掉电复位。
POR 的功能是在VDD电压由低向高上升越过规定的阀值之前,保持芯片复位,当越过这个阀值后的一小段时间后(图中的"滞后时间"或表中的"复位迟滞"),结束复位并取复位向量,开始执行指令。(复位是有一个过程的,也可以一直保持复位状态)
PDR:掉电复位;PDR的功能是在VDD电压由高向低下降越过规定的阀值后,将在芯片内部产生复位。

低功耗模式

睡眠SLEEP模式:CPU停,外设运行。

唤醒源为所有中断;

停机STOP模式:CPU停,时钟停,外设停,只有SRAM和寄存器还能保持原来的值。

唤醒源是外部中断;

待机SUSPEND模式:CPU停、外设停、时钟停、SRAM和寄存器停(相当于整个都断电关机了),只有备份寄存器和待机电路还能工作。

唤醒源:WKUP引脚的上升沿、 RTC闹钟、 NRST引脚上外部复位、 IWDG复位。

BKP和入侵检测

很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态 信息保存,或者是统计系统重启次数。类似于浏览器中保存网站的用户名、密码和登录状态等信息。

保存这些动态信息其实有很多种方法.

第一种:在系统掉电前保存到片内flash,但是对 flash的读写是按页操作,对于保存一些少量的数据来说并不合算。

第二种:在系统掉电前保存在片外的EEPROM,可以根据需要选用合适的EEPROM存储的大小,但这样需要增加额外电路,增加成本。

第三种:利用片内的备份寄存器里的后备数据寄存器存储。

STM32备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。

他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。

此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。

复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。

BKP意思是备份backup,表示备份寄存器,当主电源切断,在备份电源的支持下,对程序数据进行保存;

Tamper 意思是入侵,检测引脚为GPIOC.13,当Tamper引脚检测到入侵事件的时候,就会清除BKP寄存器的数据(防止数据泄漏),并给CPU发送一个入侵事件中断,CPU可以对此做一个处理;

入侵事件检测是通过对比GPIOC.13现在的电平与BKP寄存器中备份的电平比较,一但有电位不一致就会认为发生入侵事件。

复位

32有三种复位,系统复位、电源复位和备份区域复位。

系统复位:

电源复位:

复位电路:

备份区域复位:

复位后CPU都会被强制到复位向量中去执行程序。

时钟系统

时钟源通常有三类,即纯内部、纯外部、内外部。他们各有优缺点,一般都是这三类的综合设计,以供不同情境下的使用。

纯内部时钟源优点是方便,直接在芯片内部集成了,但往往不够精准。

纯外部时钟是外面直接生成时钟再引入内部,一般比较精准,但是占地方,使用起来也不够方便。

内外部则是振荡电路在内部,而晶振在外部。

在实际中,内外部结合的方式是较为理想的。

PLL

锁相环电路,可以进行倍频和分频。具体见模电数电。

时钟树

注:内部时钟不是很精准,为了兼顾启动速度和时钟的精准度,32是这样设计的。启动时,先用的是内部的时钟HSI,让系统启动起来之后,再通过读取用户程序,切换到更加精准的内外部时钟。

时钟源:

HSE

HSI

LSE

LSI

其他后续时钟:

SYSCLK:系统时钟,STM32大部分器件的时钟来源。它由AHB预分频器分配到各个部件。

HCLK:由AHB预分频器直接输出得到,它是高速总线AHB的时钟信号,提供给存储器、DMA及Cortex内核,是Coex内核运行的时钟,CPU主频就是这个信号,它的大小与STM32运算速度、数据存取速度密切相关。

FCLK:同样由AHB预分频器输出得到,是内核的“自由运行时钟”(free running clock)。“自由”表现在它不来自时钟HCLK,因此在HCLK时钟停止时FCLK也会继续运行。它的存在,可以保证在处理器休眠时,也能够采样中断和跟踪休眠事件,它与HCLK互相同步。

PCLK1:外设时钟,由APB1预分频器输出得到,最大频率为36MHz,提供给挂载在APB1总线上的外设(低速外设)。

PCLK2:外设时钟,由APB2预分频器输出得到,最大频率可为72MHz,提供给挂载在APB2总线上的外设(高速外设)。

时钟相关寄存器

时钟相关寄存器主要是控制时钟开关、时钟分频、时钟倍频、时钟选择等部件。

具体内容查阅数据手册。

其中1、2、6、7、8这5个寄存器比较重要。

STM32库

寄存器操作(懂底层)

stm32有很多型号,每种型号的寄存器都有所不同,我们知道,我们是通过操作寄存器来操作单片机的,所以,不同的型号,就要去学习对应型号的寄存器,这样的话,每接触一个新的型号,因为寄存器的些许差别,就会导致代码需要重新调整。

标准库(懂原理)

显然,这样太不灵活,代码的可移植性太差。

于是,STM32就封装了一些库,这些库屏蔽了底层的寄存器操作(类似于C语言的标准库),我们通过调用这些库来实现功能。

这就是stm32的标准库(全称为标准外设库)

HAL库(会用即可,主流方向)

但是,标准库的功能也是有限的,像网络模块、蓝牙模块、GUI等,标准库没有提供。

于是,就在此基础上又开发了一些库,称之为HAL库(也叫cubeMX),这些库拿来即用,又能够实现一些更高级的功能。

从哪里获取

从ST官网。

地址如下:

STM32微控制器软件 - STMicroelectronics

STM32前言知识总结相关推荐

  1. STM32应用知识归纳

    STM32应用知识归纳 GPIO 1.1 GPIO基本结构 1.2 GPIO工作方式 1.3 GPIO寄存器 NVIC 中断优先级管理 时钟系统 1.1 SYSCLK 系统定时器 / 滴答定时器 1. ...

  2. 【正点原子STM32连载】第五章 STM32基础知识入门 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  3. 【STM32】知识补充 深入探讨预分频器

    [STM32]知识补充 深入探讨预分频器 概述 分频器是什么 工作原理 计数器预分频器 触发器预分频器 模数计数器预分频器 上升沿和下降沿 应用场景 微控制器时钟预分频 通信系统中的频率合成 计时器与 ...

  4. STM32基础知识(一)

    文章目录 前言 一.什么是STM32 二.STM32 的分类 三.STM32的命名规则 前言 在正式学习 stm32 之前,先简单的介绍一下stm32的基础知识: 包括一些 STM32的基本概念.ST ...

  5. 2021-03-30 一笔记 STM32基础知识

    2021.3.30 第一次笔记 STM32的入门学习之基础知识 一 STM32的介绍 STM32是基于ARM内核的32位MCU系列---内核为ARM公司为要求高性能,低成本,低功耗的嵌入式应用专门设计 ...

  6. STM32存储器知识的相关应用(IAP、Bit Banding)

    1 STM32的启动 根据参考手册RM0008中的图表: 得知STM32的启动有三种模式,三种模式的选择在于芯片上的两个Boot引脚,如RM0008种描述: 在系统复位之后的四个上升沿后索存BOOT引 ...

  7. STM32相关知识——u8是什么意思?

    通俗理解下,u8是无符号32位整型数据的其中一种表示方法,完整表示为(typedef unsigned char uint8_t).程序员为了定义数据类型少敲几个字符,简化而来. 参考core_cm3 ...

  8. 1.STM32基本知识

    启动方式 常用的为第一种启动方式 除内核之外的部件被称为核外外设或片上外设,如:GPIO.USART (串口).I2C.SPI等都叫片上外设 1. ICode 总线 ICode 中的 I 表示 Ins ...

  9. STM32 CubeMx教程 -- 基础知识及配置使用教程

    文章目录 前言 一.STM32CubeMx 界面介绍 File 界面 Windows 界面 Help 界面 Updater Settings 界面 二.STM32CubeMx 使用教程 新建工程 配置 ...

最新文章

  1. MySQL第11天:MySQL索引优化分析之性能分析
  2. HDFS的工作机制,HDFS写数据流程,HDFS读数据流程(来自学习资料)
  3. 学习ccna,ccnp中如何提高英语问题
  4. 栈的应用--数制转换
  5. linux内核rest_init分析
  6. 组播穿越MPLS ***+SSM
  7. python写一个app接收摄像头传输的视频_如何使用Python中的tcp套接字发送和接收网络摄像头流?...
  8. 第三周课程总结&实验报告一
  9. Java Wbe开发快速入门
  10. h3c 出口路由器mac地址过滤
  11. CODEVS 1746 贪吃的九头龙
  12. 华科计算机系统结构研究生就业,华中科技大学这四个“王牌”专业,堪比金字招牌,考上就是“香饽饽”...
  13. 电脑控制手机投屏同步声音
  14. 给screen的会话改名字
  15. (二)使用Keadm进行部署KubeEdge
  16. 信息系统项目管理师:信息、信息化、信息系统、信息系统开发方法
  17. Android 新增外设Service添加供app使用
  18. 手把手教你煮一锅水米分明的潮汕砂锅粥
  19. 编写bat命令打开文件夹或者doc,txt文件
  20. ShareSDK Android SDK API

热门文章

  1. 微信跳一跳游戏外挂(mac电脑+android手机)
  2. Navicat Premium的下载及安装
  3. 【Python】单样本、独立样本、配对样本的t检验
  4. 小赛毛游C记-初识C语言(2)
  5. 【WLAN】【测试】WLAN相关测试软件一览
  6. layert弹出层关于layer.open,打开页面时的用法
  7. 在Linux和Windows上安装kafka(版本:2.12-2.8.0)
  8. Windows还原系统后分区合并为一个分区恢复方法
  9. 代数系统,二元运算,半群,含幺半群,群
  10. 为什么实体类要实现serializable接口序列化