01-认识STM32
1. 概述
1.1 术语名词
单片机 MCU 微控制器 内核 片上外设 STM32单片机 ARM公司 ST意法半导体公司
单片机:
- 是一个俗名,单片就是一颗芯片,机就是计算机,就是一颗芯片级别的计算机。
- 相对于传统个人计算机,单片机是一个麻雀虽小五脏俱全的,计算机,在一颗芯片也有
- CPU功能电路、有类似硬盘功能flash电路、有类似内存功能RAM电路。 至于类似网卡功能电路、类似声卡功能电路、类似USB功能电路等等这些根据单片机价格 功能来决定,有些单片机有 有些没有。
微控制器、MCU、单片机:
- 其实是一个东西。
微控制器
:是学名;MCU
(Mirco Control Unit ):是缩写,微控制单元;单片机
:是它的俗名。内核:core 这个如果是指的硬件,就是相当于说CPU,执行代码就是靠这个。
片上外设:芯片上,除了CPU以外的功能单元电路。学习单片机,除了掌握芯片里一些通用东西 主要是学习这个单片机芯片上,相关片上外设编程编程,能够熟练做到这些,就能针对性开发电子产品
ARM公司:是一家专门设计CPU的公司,赚钱方式 授权和版税
- A(Application Processor),以前专指移动处理器,后来又扩展到服务器和网络处理器领域。
- R(Real Time),主要用于汽车,控制,固态硬盘,调制解调器等实时性需求较强的领域。
- M(MCU),微控制器,领域更广
ST意法半导体公司:
- STM32单片机,是ST公司(意法半导体公司),开发出来系列单片机芯片在STM32单片机里,CPU电路是ARM公司技术,其余电路都是ST公司设计,ST公司和ARM合作关系每年都要给技术专利费,ARM给ST提供CPU授权和技术支持
1.2 STM32
STM32 是 STMicroelectronics( ST) 的一系列 32 位微控制器, 其基于 ARM Cortex-M
系列的处理器内核设计。它们广泛应用于各种嵌入式系统, 如物联网设备、 汽车电子、 工业自动化等领域。
Cortex-M 系列被设计为满足实时操作系统的需求, 用于低成本
、 低功耗
、 小尺寸
的微控制器设备
1.2.1 STM32 的型号介绍
-
“ST” 是指制造商 STMicroelectronics 的缩写。
-
“M” 表示其是基于 ARM 的 Cortex-M 系列核心。
-
“32” 则代表其为
32 位
微控制器(使用32个比特位来表示一个地址)。 -
STM32 的常见系列
-
STM32 系列微控制器的命名方式:
1.2.2 STM32F103ZET6
- “STM32”: STMicroelectronics 公司的产品, 基于 ARM Cortex-M 内核的 32 位微控制器。
- “F”: 表示该微控制器属于 STM32 的 F(Foundation) 系列。
G系列
:通用,是F系列的替代,性能更优秀;F系列
:主流,性能不是非常强大,性价比高;H系列
:高性能,贵;L系列
:低功耗,主要用于穿戴、手环等产品(电池供电);W系列
:无线,MCU中集成了无线通信的基带。
- “103”: 表示该微控制器属于 103 系列, 这一系列的微控制器具有相对较高的主频, 丰富的内部外设以及适中的内存容量。
- “Z”: 表示该微控制器 144 引脚。
- “E”: 512K 闪存。
- “T”: 表示该微控制器的封装类型是 LQFP。
- “6”: 表示该微控制器的工作温度范围是工业级别, 即-40℃ 到 85℃。
用最小的电路组成单片机可以工作的系统称为最小系统。
stm32 芯片型号: stm32f103zet6 最小系统有 5 部分组成(电源电路、 时钟电路、 boot 电路、 下载/调试接口、 复位电路)
1.3 STM32芯片架构
我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的 CPU 与主板、内存、显卡、硬盘的关系。
STM32F103 采用的是 Cortex-M3 内核,内核即 CPU,由 ARM 公司设计。ARM 公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如 ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如 GPIO、USART(串口)、I2C、SPI 等都叫做片上外设。
芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动单元有 4 个,被动单元也有 4 个,具体见下面系统架构图示。
1.4 系统架构
系统架构图示:
ICode 总线
(ICode Bus) :
- ICode 总线是一个专门 用于 CPU 从 Flash 内存中取指令的总线,它几乎每时每刻
都需要被使用。 这条总线专门优化了指令的取得, 以提高 CPU 的性能。 专门用于从 Flash 内存或者其他指令存储器中获取指令, 支持 CPU 以最优化的方式取指。 该总线用于把指令从存储器传输到处理器核心, 以便执行, 主要面向读操作。 - 驱动单元:
DCode 总线
(DCode Bus):D表示data, 是一个专门用于 CPU 访问数据的总线, 可以从 Flash 内存或系统内存中读取数据。 用于 CPU 核心的数据访问, 包括对 Flash 内存和 RAM 的读写。 使数据可以并行地(与指令访问操作并行) 从存储器中读取或写入。为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。系统总线
:系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。DMA 总线
(DMA Bus) :DMA, 全称 Direct Memory Access, 是一种 让某些硬件子系统在内存和外设之间直接传输数据, 而无需处理器参与的技术。 在 STM32 中, DMA 总线主要用于 DMA 控制器和内存以及需要使用 DMA 服务的外设(如 USART、 SPI、ADC 等) 之间的数据传输。总线矩阵
(Bus Matrix) :总线矩阵主要 用于在多个主设备(如 CPU、 DMA 等) 和从设备(内存和外设) 之间进行数据的路由和管理。 通过总线矩阵, 主设备可以 同时 并行 地访问从设备。
- 被动单元:
FLASH
:内部的闪存存储器 ,我们编写好的程序就放在这个地方。内核通过 ICode 总线来取里面的指令。内部的 SRAM
:即我们通常说的 RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过 DCode 总线来访问它。FSMC
:英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器,是 STM32F10xx 中一个很有特色的外设,通过 FSMC,我们可以扩展内存,如外部的SRAM,NANDFLASH 和 NORFLASH。但有一点我们要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。AHB 到 APB 的桥
:从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上,这个是我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。
1.5 内部资源介绍
1)内核(core)
:32位,高性能ARM Cortex-M3处理器,时钟
:72M,实际可超频一点
2)IO口
: STM32F103ZET6,144引脚,112个IO,大部分IO口都耐5V(模拟通道除外),支持调试:SWD 和 JTAG,SWD只要2根数据线
3)存储器容量
:512K FLASH,64K SRAM
4)时钟,复位和电源管理:
- 2.0~3.6V电源和IO电压
- 上电复位,掉中复位和可编程的电压监控
- 强大的时钟系统
- 4~16M的外部高速晶振
- 内部8MHz的高速RC振荡器
- 内部40KHz低速RC振荡器,看门狗时钟
- 内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL倍频后得到
- 外部低速32.768K的品振,主要做RTC时钟源
5)低功耗:
- 睡眠,停止和待机种低功耗模式
- 可用电池为RTC和备份寄存器供电
6)AD:
- 3个12位AD (18个外部测量通道)
- 转换范围:0-3.6V(参考电源电压)
- 内部通道可以用于内部温度测量
- 内置参考中压
7)DA:2个12位DA
8)DMA:12个DMA通道(7通道DMA1, 5通道DMA2),挂在AHB
9)支持外设:定时器、ADC、DAC、SDIO、I2S、SPI、I2C 和 USART
10)定时器:11个定时器
- 4个通用定时器,2个基本定时器,2个高级定时器,1个系统定时器,2个看门狗定时器
11)通信接口:13个通信接口
- 2个I2C接口,5个串口,3个SPI接口,1个CAN2.0,1个USB FS,1个SDIO
- 4个通用定时器
- 2个基本
1.6 参考资料
-
数据手册(DSxxx)
:规格书,产品的具体参数 -
参考手册(RMxxx)
:产品的使用方法
ST官网:www.st.com 搜索 芯片型号:STM32F103ZET6,点击进入详细文档
1.6.1 数据手册和参考手册的对比
RM0008 | DS5792 | |
---|---|---|
类型 | Reference Manual参考手册 | Data Sheet数据手册 |
内容 | 介绍芯片内部每一个模块的特性、工作原理、使用方法、编程方法 | 引脚分配、电性能、封装尺寸 |
手册厚度 | 1136页 | 143页 |
适用范围 | 整个STM32F1xx系列 | STM32F103xC, STM32F103xD, STM32F103xE |
2. stm32 启动过程
2.1 启动模式
在STM32F10xxx里,可以通过 BOOT[1:0]
引脚选择三种不同启动模式
跳帽: BOOT0: BOOT1: 0 0 启动方式从 Flash 中启动。
2.2 stm32启动流程
2.2.1 启动文件
startup_stm32f10x_hd.s
文件,它里边使用 汇编语言
写好了基本程序,当STM32 芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起 C 语言的运行环境,所以我们把这个文件称为启动文件。
启动文件主要功能总结如下,不用详细了解里面的代码:
- 初始化堆栈指针 SP;
- 初始化程序计数器指针 PC;
- 设置堆、栈的大小;
- 初始化中断向量表;
- 配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);
- 调用 SystemInit() 函数配置 STM32 的系统时钟;
- 设置 C 库的分支入口“__main”(最终用来调用 main 函数);
主要理解 最后两点
,在启动文件中有一段复位后立即执行的程序
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
- 开头的是程序注释,在汇编里面注释用的是“;”,相当于 C 语言的“//”注释符
- 第二行是定义了一个子程序:Reset_Handler。PROC 是子程序定义伪指令。这里就相当于 C 语言里定义了一个函数,函数名为
Reset_Handler
。 - 第三行 EXPORT 表示 Reset_Handler 这个子程序可供其他模块调用。相当于 C 语言的函数声明。关键字[WEAK] 表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。
- 第四行和第五行 IMPORT 说明 SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。相当于 C 语言中,从其它文件引入函数声明。以便下面对外部函数进行调用。
- 第六行把 SystemInit 的地址加载到寄存器 R0。
- 第七行程序跳转到 R0 中的地址执行程序,即执行 SystemInit 函数的内容。
- 第八行把
__main
的地址加载到寄存器 R0。 - 第九行程序跳转到 R0 中的地址执行程序,即执行__main 函数,执行完毕之后就去到我们熟知的 C 世界,进入 main 函数。
- 第十行表示子程序的结束。
翻译成 c
语言:
// Reset handler
void Reset_Handler()
{
extern Reset_Handler;
extern void __main();
extern void SystemInit();
SystemInit();
__main();
}
SystemInit();
/*在这个函数主要进行时钟配置,把时钟由内部8M(RC振荡器) 配置成基于外部8M,CPU 72。
* 配置时钟树,让CPU发挥高性能。进入main函数之前,库会帮我配置时钟:
* 外部的高速时钟可以取值为4~16M,一般选8M晶振,
* 8M 经过PLL锁相环倍频器,可以让倍频系数值为9,这里出来PLLCLK锁相环时钟为最高72MHz,
* 单刀三击开关选择PLLCLK作为SYSCLK系统时钟,系统时钟信号也是 72M Hz,
* AHB 和APB2预分频器分频里值是1,APB1预分器值是2,最终,
* AHB 的HCLK时钟信号72M,
* APB1上 PCLK1是36M,
* APB2上PCLK2是72M
*/
__main(); //注意这个函数不是C语言main,这个函数是C语言一个库函数,我们C语言的main只是这个函数的子函数,进入这个函数首先会执行 STM32的堆、栈的初始化,最后才调用C语言我们编写的main,进入C语言世界
2.2.2 流程
当STM32上电,就会发生复位,CPU首先执行启动文件里的复位中断函数 Reset_Handler
,调用 SystemInit 函数初始化系统时钟,然后调用 C 库函数_main,最终调用 main 函数去到 C 的世界。
3. STM32开发环境搭建
3.1 安装 MDK Keil 软件
安装要点:
1)、右键管理员模式运行
,安装路径不要带中文
2)、一路next,关键点截图
3.2 窗口问题
3.3 STM32F10X系列芯片支持包
选中芯片支持包:直接双击运行下一步
4. 创建模板工程
4.1 创建文件夹
新建 demo/User
文件夹,方便以后移植。
4.2 添加工程素材(库)
- STM32F10x_StdPeriph_Lib_V3.5.0.zip
- STM32F10x系列
- std标准单词前缀
- Periph:片上外设
- lib 库
- v版本3.50 这是标准库,3.50版本也是最新版本
1)、解压:挑选需要的素材
2)、剪切 Libraries
文件夹至 demo
文件夹下,与 User
同级目录
3)、3个.c
2个.h
文件剪切到 demo/User
文件夹下
4)、MDK keil软件创建工程、选择芯片
5)、工程中新建文件夹
6)、添加工程素材
-
工程中的
User
添加 3个.c
文件 -
工程中的
Lib
添加demo\Libraries\STM32F10x_StdPeriph_Driver\src
路径下所有.c
文件
- 工程中的
StartUp
添加demo\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
路径下的startup_stm32f10x_hd.s
启动文件 文件
4.3 工程配置
因为添加的标准库是 STM32F10x
系列芯片,为了适配 更详细的 STM32F103ZET6
所以要添加宏 和头文件
4.3.1 添加2个全局宏
USE_STDPERIPH_DRIVER,STM32F10X_HD
4.3.2 添加4个头文件路径
stm32f10x_conf.h
demo\Usermisc.h等官方外设库头文件
demo\Libraries\STM32F10x_StdPeriph_Driver\inccore_cm3.h
demo\Libraries\CMSIS\CM3\CoreSupportstm32f10x.h
demo\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
4.4 工程创建完成-编译
后续直接 复制使用即可,不用在创建工程
5. 第一个程序-点亮LED
5.1 原理图:
5.2 查询固件库手册
- RCC_APB2PeriphClockCmd
- GPIO_Init
- GPIO_ResetBits
代码:
#include "stm32f10x.h"
// 经过原理图分析,PB5接D0 输出低电平小灯(LED 发光二极管)亮,高电平不亮
int main()
{//RCC reset clock contrl
//第一步,开相关片上外设时钟,这里GPIO,所有的GPIO外设都在APB2时钟线上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//第二步,相关GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //引脚号
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //高低电平输出切换速度,10M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO工作模式。一共有8种,其中4种输入和4种输出模式,配置成通用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 让PB5输出低电平
while(1);
}
6. 烧录方式
6.1 串口烧录
通过STM32串口,直接烧录,这种烧录方式,好处省钱,缺点只能把程序下载进去不能在线仿真调试,相对仿真器下载速度慢一些
1)、编译前设置生成HEX 文件
2)、使用 mcuisp.exe
烧录软件
6.2 仿真烧录
通过仿真器下载(STlink仿真器 JLink下载器 Ulink下载…),可以下载、也可以在线调试仿真、下载速度也快 缺点单独华清 20~100不等。 通过JTAG下载口进行下载
1)、编译程序
2)、ST-link 仿真器
3)、下载