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 晶振
