当前位置: 首页 > news >正文

[架构之路-18]:目标系统 - 硬件平台 - 案例1 - 单片机MCU STM32 芯片的工作原理与启动流程

目录

第1章 STM32 概述

1.1 概述

1.2 产品系列与应用场合

第2章 片上资源(STM32F103xxx)

2.1 不同型号芯片的片上资源比较

2.2 资源的含义与作用

第3章 STM32F103内部架构

3.1 概述与架构图

3.2 内部总线

3.3 DMA控制器

第4章 外部引脚与最小系统(STM32F103xxx)

4.1 外部引脚

4.2 最小系统连接

第5章 系统启动

5.1 复位

5.2 启动管脚配置

5.3 程序启动地址

5.4 内部地址空间

5.5 STM32的Bootloader

5.6 STM32 CPU的初始化过程

5.7  bootloader对Flalsh程序的搬移

5.8 遗留的一系列的问题:


第1章 STM32 概述

1.1 概述

STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器(MCU)。

STM32系列专为要求高性能、低成本、低功耗嵌入式应用设计ARM Cortex®-M0,M0+,M3, M4和M7内核 。

官网:STMCU中文官网

1.2 产品系列与应用场合

(1)智能车:循迹小车,读取光电传感器或者摄像头的数据,驱动电机前进和转弯。
(2)无人机:读取陀螺仪加速度计的姿态数据,根据控制算法控制电机速度,保证飞机稳定飞行。
(3)机器人:驱动舵机,控制其关节,让机器人运动。
(4)无线通信:给STM32连接一些2.4G无线模块或者蓝牙、WIFI模块,则具备无线通信能力。
(5)物联网:借助无线通信模块,再通过STM32驱动继电器来控制220v电路的通断。
(6)工业控制:PLC主控。
(7)娱乐电子产品:流水灯之类……
(8)……

STM32家族系列图

 主流产品(STM32F0、STM32F1、STM32F3)、

超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、

高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)

基本型:STM32F101R6、STM32F101C8、STM32F101R8、STM32F101V8、STM32F101RB、STM32F101VB

增强型:STM32F103C8、STM32F103R8、STM32F103V8、STM32F103RB、STM32F103VB、 STM32F103VE、STM32F103ZE

STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下:

1

STM32

STM32代表ARM Cortex-M内核的32位微控制器。

2

F

F代表芯片子系列。

3

103

103代表增强型系列。

4

R

R这一项代表引脚数,其中T代表36脚,C代表48脚,R代表64脚,V代表100脚,Z代表144脚,I代表176脚。

5

B

B这一项代表内嵌Flash容量,其中6代表32K字节Flash,8代表64K字节Flash,B代表128K字节Flash,C代表256K字节Flash,D代表384K字节Flash,E代表512K字节Flash,G代表1M字节Flash。

6

T

T这一项代表封装,其中H代表BGA封装,T代表LQFP封装,U代表VFQFPN封装。

7

6

6这一项代表工作温度范围,其中6代表-40——85℃,7代表-40——105℃。

第2章 片上资源(STM32F103xxx)

2.1 不同型号芯片的片上资源比较

STM32F103x8B片上存在的外设

(1)GPIO端口:用于读写芯片外部的数字信号。

(2)ADC模块:用于读写芯片外部的模拟信号。如电压值。

(3)常见低速外设:

UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet

2.2 资源的含义与作用

片上资源/外设

NVIC:管理中断,如配置中断优先级等。
SysTick:给操作系统提供定时服务。
RCC:使能外设时钟。
AFIO:复用功能端口重定义,及中断端口配置。
CAN:多应用于汽车领域
RTC:在STM32内部完成年月日、时分秒的计时功能,可接外部备用电池,掉电也可使用。
CRC:判断数据的正确性。
PWR:电源可睡眠,使功耗降低。
GPIO、EXTI、TIM、USART、I2C、SPI、ADC:对外通信接口

DMA:DMA

第3章 STM32F103内部架构

3.1 概述与架构图

STM32F103采用的是Cortex-M3内核,内核由ARM公司设计和授权。

STM32的芯片生产厂商ST公司,负责在ARM内核之外部件的设计并生产整个芯片

这些内核之外的部件被称为核外外设或片上外设:如 GPIO、USART(串口)、I2C、SPI 等,

3.2 内部总线

芯片内核与外设之间通过各种总线连接。

其中驱动单元有 4 个,被动单元也有 4 个。

可以把驱动单元理解成是内核部分,被动单元都理解成外设。

(1)ICode 代码总线

ICode总线是专门用来取指令的,其中的I表示Instruction(指令),指令的意思。写好的程序编译之后都是一条条指令,存放在 FLASH中,内核通过ICode总线读取这些指令来执行程序。

(2)DCode数据总线

DCode这条总线是用来取数的,其中的D表示Data(数据)。在写程序的时候,数据有常量和变量两种。常量就是固定不变的,用C语言中的const关键字修饰,放到内部FLASH当中。变量是可变的,不管是全局变量还是局部变量都放在内部的SRAM。

备注:可以看出,STM32内部采用的哈弗架构。

(3)system系统总线/外设总线

我们通常说的寄存器编程,即读写寄存器都是通过系统总线来完成的。

系统总线主要是用来访问外设的寄存器。

3.3 DMA控制器

(1)概述

DMA控制器用来提供在外设控制器和内部存储器RAM之间或者存储器和存储器之间的高速数据传输。

在DMA传输期间,无须CPU干预,也无需要CPU进行上行文的切换,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

(2)STM32的DMA特性

  • 12个独立的可配置的通道:DMA1有7个通道,DMA2有5个通道
  • 每个通道都有直接连接专用硬件DMA请求,每个通道都同样支持软件触发。这些通道可以通过软件来配置
  • 在同一个DMA模块上,多个请求间的优先级通过软件设置,优先级相等时由其硬件决定
  • 独立数据源和目标数据区的传输宽度(字节、半字、全字)源和目标地址必须按照数据传输宽度对齐
  • 支持循环的缓冲器管理
  • 每个通道有三个事件标志(DMA半传输、DMA传输完成、DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求
  • 存储器和存储器间,外设和存储器,存储器和外设之间的传输
  • 闪存,SRAM,外设的SRAM,APB1,APB2和APB均可作为访问的源和目标
  • 可编程的数据传输数目:最大65535

(3)DMA的触发

当发生一个事件后,外设DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开发访问发出请求的外设时,DMA控制器立即发送给它应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。如果有多个请求,外设可以启动下一个周期。

(4)DMA中断

每个DMA通道都可以在DMA传输过半,传输完成和传输错误时产生中断。

在这里插入图片描述

第4章 外部引脚与最小系统(STM32F103xxx)

4.1 外部引脚

STM32F103C8T6引脚定义

 引脚图

备注:

为了降低管脚的数量,减少芯片的体积,STM对外部管脚进行了大量的复用。

(1)电源(红色部分) 

  • 3.3V

(2)控制信号(蓝色)

  • 调试、下载:JTMS/JTCK/
  • 启动配置:Boot0和Boot1
  • 晶振时钟输入:OSC_IN、OUT
  • 复位:NReset

(3)其他复用功能管脚有:

  • UART1~2总线:Tx/Rx
  • I2C1~2总线:SCL/SDK
  • SPI1~2总线:SCK/MISO//MOSI
  • Timer1~4总线:CH1/CH2/CH3
  • CAN总线:TX/RX
  • ADC0~3模拟输入:IN

4.2 最小系统连接

最小系统电路

(1)供电电压:3.3V,滤波电容可保证供电电压的稳定和消除电源毛刺。

(2)STM主体芯片:所有的外设控制器,都集成到了芯片内部,除了需要少量的时钟和复位和管脚配置硬件电路,单颗芯片就可以构建一个小型的计算机系统。

(3) OSC32:32.768KHz的晶体震荡器,内部倍频生成高频时钟。

(4)启动配置:用于配置启动方式。

(5)下载端口:JTAG调试口。

(6)复位:对单片机进行复位。

第5章 系统启动

5.1 复位

系统复位后,SYSCLK的4个上升沿,BOOT引脚的值被锁定

5.2 启动管脚配置

在这里插入图片描述

启动模式

(1)主闪存存储器启动模式正常的工作模式-- FLASH存储器

STM内部的FLASH,掉电不丢失,用户可以将代码存储到FLASH中。

从FLASH启动就可以执行用户烧录好的代码。

(2)SRAM启动模式(调试模式下的工作模式)-- SRAM存储器

STM内部的SRAM,掉电丢失,RESET不丢失。

在调试状态下,先把程序下载到STM内部的SRAM中。

然后复位系统,程序直接运行在SRAM中,程序下载的效率比烧录Falsh效率高,程序的执行效率也比较高。调试结束后,掉电,程序丢失。

(3)系统存储器启动模式(主闪存程序更新)-- ROM存储器

系统存储器中保存着芯片厂商的bootloader,主要用于通过串口下载并烧录程序。

程序烧录完成后想要启动烧录程序,必须将BOOT引脚重新配置为主闪存存储器启动。

注意:从系统存储器启动,只能下载并更新主闪存中的程序,不能启动程序。

5.3 程序启动地址

STM32上电或者复位后,PC指针将始终从0x00000000取第一条指令。

用户可以通过BOOT1和BOOT0引脚状态,选择启动模式,并将相应模式对应的设备的首地址映射到启动空间(0x0000 0000)。

5.4 内部地址空间

在这里插入图片描述

(1)0x000-0x03FF的内容来自于Flash或者SRAM或系统存储器,是地址空间的映射,,至于如何映射则取决于Boot0、Boot1的配置。

(2)其他的地址空间的内容都是确定不变的。

5.5 STM32的Bootloader

在嵌入式操作系统中,Bootloader的作用是对CPU内部的寄存器、中断向量、存储控制器等进行初始化,初始化CPU的寄存器,通常是有汇编语言提供的。

Bootloader的另一个作用是启动操作系统程序,再由操作系统程序启动应用程序。

(1)在Linux环境中

  • bootloader、操作系统程序、应用程序是三个独立的程序体。
  • Bootloader是由uboot来承担的,
  • 操作系统是由Linux来承担,
  • 应用程序由各种main函数指定的程序承担 。

(2)在单片机环境中

  • bootloader、操作系统程序、应用程序被整合在一起,编译成了一个可执行程序。
  • 对CPU的寄存器进行初始化的bootloader程序通常是由芯片厂家提供,基本不需要进行修改。
  • 操作系统:是可选的,大多数情况下,都不需要操作系统,只有少数情形,会使用uOS这样的轻量级操作系统。
  • 应用程序:有用户写的main函数承担,由于单片机大多数情况下没有操作系统,因此,通常只有一个主应用程序。

(3)STM32的booloader

bootloader,也可以叫启动文件,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。

最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发工具环境往往自动、完整地提供了这个启动文件,不需要开发人员再行干预启动过程,用户只需要从main函数开始进行应用程序的设计即可。

同样,STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件

5.6 STM32 CPU的初始化过程

网上有很多资料分析了STM32的启动文件的内容。

(1)首先会定义堆栈。

(2)定义中断/异常向量表,而其中只实现了复位的异常处理函数Reset_Handler,该函数内容如下(STM32F4XX,IAR编译器),可以看到其主要执行了SystemInit和__iar_program_start两个函数,

在这里插入图片描述

(3)其主要功能除了初始化时钟,浮点处理单元FPU等。

(4)执行一个重要功能,那就是内存的搬移、初始化操作。

5.7  bootloader对Flalsh程序的搬移

就是如果从Flash启动的话,程序是存放在Flash中,但并非所有的程序都从Flash中执行。

为了提高程序的执行效率,通常情况下,除了初始化CPU相关的代码是在Flash中执行,操作系统程序和应用程序通常是在RAM中执行的,这就存在一次代码搬移的过程。如ARM9、CortexA系列的时候,一般都是把代码搬到内部的SRAM或者外部DDR中执行的,STM32也是类似,它会把程序搬移到内部的RAM后再继续在RAM中执行。

程序代码的构成:

在这里插入图片描述

我们知道烧录的镜像文件中包含:

  • 只读代码段.text
  • 已初始化数据段.data
  • 未初始化的或者初始化为0的数据段.bss。

代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就OK。

但是.data段和.bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此bootloader会执行很重要的一步,就是会在RAM中初始化.data和.bss段,搬移或清空相应内存区域。

因此,我们知道,当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据端则会被拷贝到内部SRAM中,该过程是由bootloader完成的。

bootloader在完成这些流程之后,就会将代码交给用户的main函数开始执行用户代码

用户代码:可能是轻量级os的入口函数,也可能直接是用户应用程序的入口函数。

备注:

在有uboot的嵌入式环境中,uboot的代码段被切分成两部分,一部分可能会在ROM中执行,一部分被搬移到RAM中执行。

至此,就可以CPU就可以执行应用程序的代码了

5.8 遗留的一系列的问题:

单片机提供了大量的内嵌的外设,应用程序要访问这些外设,需要驱动程序来完成相关的硬件操作

(1)这些驱动程序是由谁提供的呢?

这些驱动程序通常称为系统驱动库,这些驱动库通常是有芯片厂家提供的。

(2)驱动程序是应用程序吗?

它本身并不是应用程序,他们称为系统驱动库。

应用程序调用系统驱动库的程序来操作STM的硬件控制器。

下一篇文章进一步探讨这个问题:《如何通过STM32开发板构建自己的应用》

相关文章:

  • C++内存管理以及模板的引入
  • ROS问题:gazebo没有想要的模型,而且不报错
  • 【SpringBoot+MyBatisPlus】点餐系统之登录功能、退出功能设计
  • 操作符(operator)
  • 数据同步工具—Sqoop
  • 文件上传之中间件解析漏洞详解
  • 【每日一好题】这么经典的题你不能不会:矩阵置零
  • JSR223常用函数和对象--Jmeter内置对象Chapter1
  • 从头开始训练神经网络(Unet)
  • Python制作自动填写脚本,100%准确率
  • 半小时了解SQL注入漏洞?(注入方式大全+绕过大全)
  • CSS 几种常见的选择器
  • 【Day17】Java算法刷题 【面试题 01.08. 零矩阵】 【844. 比较含退格的字符串】
  • 【C++游戏引擎Easy2D】Random随机数,不同于Rand,做游戏必备
  • 【小程序入门】App函数注册小程序实例
  • 03Go 类型总结
  • Docker: 容器互访的三种方式
  • Electron入门介绍
  • ES10 特性的完整指南
  • exports和module.exports
  • Java的Interrupt与线程中断
  • js继承的实现方法
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Python学习之路16-使用API
  • Vue--数据传输
  • 聊聊flink的TableFactory
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何进阶一名有竞争力的程序员?
  • 首页查询功能的一次实现过程
  • 系统认识JavaScript正则表达式
  • 一、python与pycharm的安装
  • 再次简单明了总结flex布局,一看就懂...
  • 【干货分享】dos命令大全
  • 如何在招聘中考核.NET架构师
  • $.ajax()方法详解
  • (pytorch进阶之路)扩散概率模型
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (转)jQuery 基础
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET企业级应用架构设计系列之技术选型
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @property括号内属性讲解
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [20171113]修改表结构删除列相关问题4.txt
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [android] 看博客学习hashCode()和equals()
  • [C++]AVL树怎么转
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [C++]模板与STL简介
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [IE技巧] 使IE8以单进程的模式运行
  • [ISCTF 2023]——Web、Misc较全详细Writeup、Re、Crypto部分Writeup