目录
第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 遗留的一系列的问题:
STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器(MCU)。
STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核 。
官网:STMCU中文官网
(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℃。 |
(1)GPIO端口:用于读写芯片外部的数字信号。
(2)ADC模块:用于读写芯片外部的模拟信号。如电压值。
(3)常见低速外设:
UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet
NVIC:管理中断,如配置中断优先级等。
SysTick:给操作系统提供定时服务。
RCC:使能外设时钟。
AFIO:复用功能端口重定义,及中断端口配置。
CAN:多应用于汽车领域
RTC:在STM32内部完成年月日、时分秒的计时功能,可接外部备用电池,掉电也可使用。
CRC:判断数据的正确性。
PWR:电源可睡眠,使功耗降低。
GPIO、EXTI、TIM、USART、I2C、SPI、ADC:对外通信接口
DMA:DMA
STM32F103采用的是Cortex-M3内核,内核由ARM公司设计和授权。
STM32的芯片生产厂商ST公司,负责在ARM内核之外部件的设计并生产整个芯片。
这些内核之外的部件被称为核外外设或片上外设:如 GPIO、USART(串口)、I2C、SPI 等,
芯片内核与外设之间通过各种总线连接。
其中驱动单元有 4 个,被动单元也有 4 个。
可以把驱动单元理解成是内核部分,被动单元都理解成外设。
(1)ICode 代码总线
ICode总线是专门用来取指令的,其中的I表示Instruction(指令),指令的意思。写好的程序编译之后都是一条条指令,存放在 FLASH中,内核通过ICode总线读取这些指令来执行程序。
(2)DCode数据总线
DCode这条总线是用来取数的,其中的D表示Data(数据)。在写程序的时候,数据有常量和变量两种。常量就是固定不变的,用C语言中的const关键字修饰,放到内部FLASH当中。变量是可变的,不管是全局变量还是局部变量都放在内部的SRAM。
备注:可以看出,STM32内部采用的哈弗架构。
(3)system系统总线/外设总线
我们通常说的寄存器编程,即读写寄存器都是通过系统总线来完成的。
系统总线主要是用来访问外设的寄存器。
(1)概述
DMA控制器用来提供在外设控制器和内部存储器RAM之间或者存储器和存储器之间的高速数据传输。
在DMA传输期间,无须CPU干预,也无需要CPU进行上行文的切换,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
(2)STM32的DMA特性
(3)DMA的触发
当发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开发访问发出请求的外设时,DMA控制器立即发送给它应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。如果有多个请求,外设可以启动下一个周期。
(4)DMA中断
每个DMA通道都可以在DMA传输过半,传输完成和传输错误时产生中断。
备注:
为了降低管脚的数量,减少芯片的体积,STM对外部管脚进行了大量的复用。
(1)电源(红色部分)
(2)控制信号(蓝色)
(3)其他复用功能管脚有:
(1)供电电压:3.3V,滤波电容可保证供电电压的稳定和消除电源毛刺。
(2)STM主体芯片:所有的外设控制器,都集成到了芯片内部,除了需要少量的时钟和复位和管脚配置硬件电路,单颗芯片就可以构建一个小型的计算机系统。
(3) OSC32:32.768KHz的晶体震荡器,内部倍频生成高频时钟。
(4)启动配置:用于配置启动方式。
(5)下载端口:JTAG调试口。
(6)复位:对单片机进行复位。
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值被锁定。
(1)主闪存存储器启动模式(正常的工作模式)-- FLASH存储器
STM内部的FLASH,掉电不丢失,用户可以将代码存储到FLASH中。
从FLASH启动就可以执行用户烧录好的代码。
(2)SRAM启动模式(调试模式下的工作模式)-- SRAM存储器
STM内部的SRAM,掉电丢失,RESET不丢失。
在调试状态下,先把程序下载到STM内部的SRAM中。
然后复位系统,程序直接运行在SRAM中,程序下载的效率比烧录Falsh效率高,程序的执行效率也比较高。调试结束后,掉电,程序丢失。
(3)系统存储器启动模式(主闪存程序更新)-- ROM存储器
系统存储器中保存着芯片厂商的bootloader,主要用于通过串口下载并烧录程序。
程序烧录完成后想要启动烧录程序,必须将BOOT引脚重新配置为主闪存存储器启动。
注意:从系统存储器启动,只能下载并更新主闪存中的程序,不能启动程序。
STM32上电或者复位后,PC指针将始终从0x00000000取第一条指令。
用户可以通过BOOT1和BOOT0引脚状态,选择启动模式,并将相应模式对应的设备的首地址映射到启动空间(0x0000 0000)。
(1)0x000-0x03FF的内容来自于Flash或者SRAM或系统存储器,是地址空间的映射,,至于如何映射则取决于Boot0、Boot1的配置。
(2)其他的地址空间的内容都是确定不变的。
在嵌入式操作系统中,Bootloader的作用是对CPU内部的寄存器、中断向量、存储控制器等进行初始化,初始化CPU的寄存器,通常是有汇编语言提供的。
Bootloader的另一个作用是启动操作系统程序,再由操作系统程序启动应用程序。
(1)在Linux环境中
(2)在单片机环境中
(3)STM32的booloader
bootloader,也可以叫启动文件,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。
最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发工具环境往往自动、完整地提供了这个启动文件,不需要开发人员再行干预启动过程,用户只需要从main函数开始进行应用程序的设计即可。
同样,STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件。
网上有很多资料分析了STM32的启动文件的内容。
(1)首先会定义堆栈。
(2)定义中断/异常向量表,而其中只实现了复位的异常处理函数Reset_Handler,该函数内容如下(STM32F4XX,IAR编译器),可以看到其主要执行了SystemInit和__iar_program_start两个函数,
(3)其主要功能除了初始化时钟,浮点处理单元FPU等。
(4)执行一个重要功能,那就是内存的搬移、初始化操作。
就是如果从Flash启动的话,程序是存放在Flash中,但并非所有的程序都从Flash中执行。
为了提高程序的执行效率,通常情况下,除了初始化CPU相关的代码是在Flash中执行,操作系统程序和应用程序通常是在RAM中执行的,这就存在一次代码搬移的过程。如ARM9、CortexA系列的时候,一般都是把代码搬到内部的SRAM或者外部DDR中执行的,STM32也是类似,它会把程序搬移到内部的RAM后再继续在RAM中执行。
程序代码的构成:
我们知道烧录的镜像文件中包含:
代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就OK。
但是.data段和.bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此bootloader会执行很重要的一步,就是会在RAM中初始化.data和.bss段,搬移或清空相应内存区域。
因此,我们知道,当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据端则会被拷贝到内部SRAM中,该过程是由bootloader完成的。
bootloader在完成这些流程之后,就会将代码交给用户的main函数开始执行用户代码。
用户代码:可能是轻量级os的入口函数,也可能直接是用户应用程序的入口函数。
备注:
在有uboot的嵌入式环境中,uboot的代码段被切分成两部分,一部分可能会在ROM中执行,一部分被搬移到RAM中执行。
至此,就可以CPU就可以执行应用程序的代码了。
单片机提供了大量的内嵌的外设,应用程序要访问这些外设,需要驱动程序来完成相关的硬件操作
(1)这些驱动程序是由谁提供的呢?
这些驱动程序通常称为系统驱动库,这些驱动库通常是有芯片厂家提供的。
(2)驱动程序是应用程序吗?
它本身并不是应用程序,他们称为系统驱动库。
应用程序调用系统驱动库的程序来操作STM的硬件控制器。
下一篇文章进一步探讨这个问题:《如何通过STM32开发板构建自己的应用》