[架构之路-18]:目标系统 - 硬件平台 - 案例1 - 单片机MCU STM32 芯片的工作原理与启动流程
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构之路-18]:目标系统 - 硬件平台 - 案例1 - 单片机MCU STM32 芯片的工作原理与启动流程相关的知识,希望对你有一定的参考价值。
目录
第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)……
主流产品(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 不同型号芯片的片上资源比较
(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 外部引脚
备注:
为了降低管脚的数量,减少芯片的体积,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开发板构建自己的应用》
以上是关于[架构之路-18]:目标系统 - 硬件平台 - 案例1 - 单片机MCU STM32 芯片的工作原理与启动流程的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-20]:目标系统 - 硬件平台 - 嵌入式系统硬件电路基础:架构设计流程总线外设基本电路编码
[架构之路-14]:目标系统 - 硬件平台 - CPUMPUNPUGPUMCUDSPFPGASOC的区别
[架构之路-17]:目标系统 - 硬件平台 - ARM CPU架构与系列选型
[架构之路-12]:目标系统 - 硬件平台 - 单核CPU的架构与基本工作原理
[架构之路-16]:目标系统 - 硬件平台 - CPU主要物理性能指标
[架构之路-19]:目标系统 - 硬件平台 - 案例1 - 用单片机STM8/STM32搭建目标系统(以无线传感器LoRa终端为例)