1 STM32 基础知识综述#
1.1 STM32 简介#
STM32 是 ST 公司基于 ARM Cortex-M 内核开发的 32 位微控制器
M
是Microcontroller
的意思
STM32 常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
STM32 功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器
1.2 ARM 简介#
ARM 既指 ARM 公司,也指 ARM 处理器内核
ARM 公司是全球领先的半导体知识产权(IP)提供商,全世界超过 95% 的智能手机和平板电脑都采用 ARM 架构
ARM 公司设计 ARM 内核,半导体厂商完善内核周边电路并生产芯片
1.3 STM32F103C8T6 简介#
系列:主流系列 STM32F1
内核:ARM Cortex-M3
主频:72MHz
RAM:20K(SRAM)
ROM:64K(Flash)
供电:2.0~3.6V(标准 3.3V)
封装:LQFP48
1.4 片上资源 / 外设 (Peripheral)#
STM32 可以加入操作系统,例如 FreeRTOS、UCOS 等,如果使用了这些操作系统则需要SysTick
提供定时来进行任务切换功能。
UART
是异步串口的意思,而STM32
的USART
既支持异步串口也支持同步串口,异步串口使用相对较多
英文缩写 | 名称 | 英文缩写 | 名称 |
---|---|---|---|
NVIC | 嵌套向量中断控制器 | CAN | CAN 通信 |
SysTick | 系统滴答定时器 | USB | USB 通信 |
RCC | 复位和时钟控制 | RTC | 实时时钟 |
GPIO | 通用 IO 口 | CRC | CRC 校验 |
AFIO | 复用 IO 口 | PWR | 电源控制 |
EXTI | 外部中断 | BKP | 备份寄存器 |
TIM | 定时器 | IWDG | 独立看门狗 |
ADC | 模数转换器 | WWDG | 窗口看门狗 |
DMA | 直接内存访问 | DAC | 数模转换器 |
USART | 同步 / 异步串口通信 | SDIO | SD 卡接口 |
I2C | I2C 通信 | FSMC | 可变静态存储控制器 |
SPI | SPI 通信 | USB OTG | USB 主机接口 |
1.5 芯片命名规范#
1.6 系统结构#
Cortex-M3
内核引出三条总线,ICode
指令总线,DCode
数据总线,System
系统总线
ICode
总线和DCode
总线主要是用来连接Flash
闪存的
Flash
里面存储的是我们编写的程序
ICode
指令总线用来加载程序指令
DCode
数据总线用来加载数据,例如常量和调试数据等
System
系统总线连接到SRAM
,FSMC
SRAM
用于存储程序运行时的变量数据
AHB
系统总线用于挂载主要的外设,AHB 的意思是先进高性能总线,挂载的一般是最基本的或者性能比较高的外设,例如复位和时钟控制这些最基本的电路,还有SDIO
也是挂载在AHB
上的
APB1
APB2
两个外设总线,APB
的意思是先进外设总线,用于连接一般的外设,
因为AHB
和APB
的总线协议,总线速度,数据传送格式的差异,所以中间需要加两个桥接来完成数据的转换和缓存,AHB
的整体性能比APB
高一些,其中APB2
的性能又比APB1
的性能高一些,APB2
一般和AHB
同频率,都是 72MHz,APB1
一般是 36MHz, 所以APB2
连接的一般都是外设中稍微重要的部分,如GPIO
端口还有一些外设的 1 号选手 (USART1
,SPI1
,TIM1
,TIM8
等),TIM8
和TIM1
一样也是高级定时器,所以也是重要的外设,ADC
,EXTI
,AFIO
也是接在APB2
上面的;其他的像 2,3,4,5 号外设,DAC、PWR、BPK 等次要一点的外设都会分配到APB1
上去;当然在使用时,个人一般感觉不到APB2
和APB1
的性能差异,只需要知道这个外设是挂载到哪个总线上的就可以了
DMA
可以当做内核 CPU 的小秘书,比如大量数据搬运的活,让 CPU 来干就太浪费时间了,DMA
主要干这些简单且反复要干的事情,DMA
通过DMA
总线连接到总线矩阵上,他拥有和 CPU 一样的总线控制权,用于访问这些外设,当需要DMA
搬运数据时,外设就会通过请求线发送DMA
请求,DMA
就会获得总线控制权,访问并转运数据,整个过程不需要 CPU 的参与,省下了 CPU 的时间用来干其他的事情
1.7 引脚定义#
红色的是电源相关的引脚
蓝色的是最小系统相关的引脚
绿色的是 IO 口、功能口这些引脚
S
类型代表电源
I
类型代表输入
O
类型代表输出
IO
类型代表输入输出
FT
代表这个引脚能容忍5V
的电压,没有FT
的只能容忍3.3V
的电压
STM32
内部采用分区供电的方式,供电口较多,使用时VSS
都接GND
,VDD
都接3.3V
STM32
支持SWD
和JTAG
两种调试方式
SWD
需要两根线,分别是SWDIO
和SWCLK
JTAG
需要 5 根线,分别是JTMS
,JTCK
,JTDI
,JTDO
,NJTRST
STLINK
使用的是SWD
的方式下载调试程序,所以只需要占用PA13
和PA14
这两个IO
口
使用SWD
方式下载时,PA15
PB3
PB4
可以切换为普通IO
口来使用,但是需要在程序中进行配置,不配置的划默认是不会用作 IO 口的
引脚号 | 引脚名称 | 引脚定义 | 主功能 |
---|---|---|---|
1 | VBAT | 备用电池供电引脚,此引脚可外接一个 3V 电池,当系统电源断电时,备用电池可以给内部的 RTC 时钟和备份寄存器提供电源 | VBAT |
2 | PC13-TAMPER-RTC | I/O 口或侵入检测或 RTC,IO 口可以根据程序输出或读取高低电平,侵入检测可以用来做安全保障的功能,RTC 可以用来输出 RTC 校准时钟、RTC 闹钟脉冲或秒脉冲 | PC13 |
3、4 | PC14-OSC32_IN/PC15-OSC32_OUT | IO 口或者接 32.768KHz 的 RTC 晶振 | PC14/PC15 |
5、6 | OSC_IN/OSC_OUT | 接系统的主晶振,一般是 8MHz,芯片内部有锁相环电路,可以对这个 8MHz 的频率进行倍频,最终产生 72MHz 的频率作为系统的主时钟 | OSC_IN/OSC_OUT |
7 | NRST | 系统复位引脚,N 表示低电平复位 | NRST |
8,9 | VSSA/VDDA | 内部模拟部分的电源,如 ADC、RC 振荡器等;VSS 是负极接是 GND,VDD 是正极接 3.3V | VSSA/VDDA |
10 | PA0-WKUP | IO 口兼具 WKUP 功能,可以唤醒处于待机模式的 STM32 | PA0 |
11-19 | PA1、PA2、PA3、PA4、PA5、PA6、PA7、PB0、PB1 | IO 口 | PA1-PB1 |
20 | PB2 | IO 口或 BOOT1 引脚,BOOT 引脚用来配置启动模式 | PB2/BOOT1 |
21,22 | PB10、PB11 | IO 口 | PB10,PB11 |
23,24 | VSS_1/VDD_1 | 系统主电源口,VSS 是负极,VDD 是正极 | VSS_1/VDD_1 |
25-33 | PB12、PB13、PB14、PB15、PA8、PA9、PA10、PA11、PA12 | IO 口 | PB12、PB13、PB14、PB15、PA8、PA9、PA10、PA11、PA12 |
34 | PA13 | IO 口或调试端口 | JTMS/SWDIO |
35,36 | VSS_2/VDD_2 | 系统主电源口,VSS 是负极,VDD 是正极 | VSS_2/VDD_2 |
37-40 | PA14/PA15/PB3/PB4 | IO 口或调试端口 (用来调试和下载程序) | JTCK_SWCLK/JTDI/JTDO/NJTRST |
41-43 | PB5/PB6/PB7 | IO 口 | PB5/PB6/PB7 |
44 | BOOT0 | 与 BOOT1 一样也是用来做启动配置的 | BOOT0 |
45,46 | PB8/PB9 | IO 口 | PB8/PB9 |
47,48 | VSS_3/VDD_3 | 系统主电源口,VSS 是负极,VDD 是正极 | VSS_3/VDD_3 |
1.8 启动配置#
启动配置的作用是指定程序开始运行的位置,一般情况下程序都是在 Flash 程序存储器开始执行,但是在某些情况下我们也可以让程序在别的地方开始执行,用来完成特殊的功能
BOOT1
=0 BOOT0
=1 模式用来做串口下载,系统存储器存的就是STM32
中的一段BootLoader
程序,BootLoader
程序的作用就是接收串口的数据然后刷新到主闪存中,这样就可以使用串口下载程序了,一般我们需要串口下载程序的时候会配置到这个模式上
BOOT0
=0 启动模式为主闪存存储器的模式,主闪存存储器被选为启动区域,此时正常执行 Flash 闪存里面的程序,这个模式是最常用的模式,一般情况下都是这个配置
BOOT1
=1 BOOT0
=1 配置的是SRAM
启动,这个模式主要用于程序调试,现阶段使用较少
BOOT
引脚的值是在上电复位的一瞬间有效的,之后就随意了
1.9 最小系统电路#
OSC32
是 32.768KHz 晶振的意思,32768 是 2 的 15 次方,内部 RTC 电路经过 2 点 15 次方分频就可以生成 1s 的时间信号了,
RTC
晶振是 32.768KHz 晶振