STM32F103简介
自从大学毕业之后,已经很久没有接触STM32
控制器了,最近打算学习一下LVGL
,控制芯片计划使用STM32F103RTC6
,因此这里我们会简单介绍有关STM32F103RTC6
的知识。
一、STM32F103RTC6
介绍
1.1 命名规则
我从网上买了一块STM32F103RTC6
开发板,STM32F103RCT6
各个字段的含义:
STM32
(芯片系列):STM32
代表ARM Cortex-M
内核的32
位微控制器;103
(芯片子系列):101
基本型,102USB
基本型(USB2.0
),103
代表增强型系列,105
或107
互联型;F
(产品类型):F
代表通用系列 ;R
(引脚数量):T=36
,C=48
,R=64
,V=100
,Z =144
;C
(闪存容量):4=16K
,6=32K
,8=64K
,B=128K
,C=256K
,D=384K
,E=512K
;T
(表封装):H
代表BGA
封装、T
代表LQFP
封装 、U
代表VFQFPN
封装 、Y
代表WLCSP64
;6
(工作温度范围):6
代表-40~85℃
,7
代表-40~105℃
;
更多细节可以参考下图:
1.2 原理图
接下来我们看一下这块开发板的完整电路原理图,后续我们会一一介绍各个组成部分;
STM32F103RCT6
核心板丝印尺寸图:
1.2.1 MCU
部分
MCU
采用的STM32F103RTC6
,一共64
个引脚;
由于引脚比较多,我们不可能一一介绍,这里我们仅仅介绍比较重要的引脚;
- 电源引脚,包括:
VDD
(13
、19
、32
、48
、64
):供电电源引脚,D=device
表示器件的意思,即器件内部的工作电压,通常连接到3.3V
电源;VSS
(12
、18
、31
、47
、63
):接地引脚,S=series
表示公共连接的意思,通常指电路公共接地端电压;VBAT
(1
):RTC
的电池供电引脚,当使用电池或其他电源连接到VBAT
脚上时,当VDD
断电时,可以保存备份寄存器的内容和维持RTC
的功能。如果应用中没有使用外部电池,VBAT
引脚应接到VDD
引脚上;
- 复位与时钟引脚,包括:
NRST
(7
):复位引脚,外部低电平触发复位。若外部复位被激活,MCU
会重新启动;BOOT0/1
(28
、60
):启动引脚,选择MCU
启动方式,用于选择从闪存或外部设备启动;
RTC
引脚:RTC
(2
):RTC
实时时钟的输出引脚,可以配置为1Hz
信号输出,通常用于提供精确的时间基准;
- 通信引脚,
STM32F103RTC6
提供了多种通信接口,其中包括:USART
(通用同步异步收发器,42
和43
、16
和17
、29
和30
):例如,TX
(发送)和RX
(接收)引脚;SPI
(串行外设接口,21
、22
、23
):例如,MOSI
(主输出从输入)、MISO
(主输入从输出)等引脚;I2C
(52
和53
):SCL
(时钟线)、SDA
(数据线)引脚。
GPIO
引脚:STM32F103RTC6
提供了多个通用输入输出引脚(GPIO
),这些引脚可以用于多种不同的外设功能,如数字输入、输出、高低电平控制、外部中断等;- 外部中断引脚:
EXTI
(外部中断)引脚,用于从外部设备(如按钮、传感器等)接收中断信号; - 模拟引脚:
ADC
(模拟数字转换器)引脚,用于接收模拟信号并进行数字化处理。这些引脚通常与外部传感器连接; - 调试引脚:
SWDIO
(46
)和SWCLK
(49
):用于调试的串行线(Serial Wire Debug
)接口引脚,用于与调试器连接; PWM
输出引脚:TIMx
:定时器模块的输出引脚,用于生成脉宽调制(PWM
)信号,通常用于电机控制、亮度调节等应用。
1.2.2 复位引脚NRST
原理图
STM32
的NRST
是异步复位脚。 复位就是让单片机重启,使其恢复到一个缺省的状态。
- 当
NRST
输入低电平的时候,MCU
处于复位状态,重设所有的内部寄存器,及片内几十KB
的SRAM
。; - 当
NRST
从低电平变高时,PC
指针从0
开始。 但是复位的时候不会将STM32F
片内RTC
的寄存器以及后备存储器重置,因为它们是用电池通过专门的VBAT
脚供电。
STM32
中的NRST
有施密特功能。大概在输入电压低于1.V
的时候将芯片复位。
开发板上电的瞬间,电容C4
两端电压可以认为是0,刚上电的时候电流会通过R1
和C4
到地,为C4
充电,RESET
会输出低电平,stm32
处于复位状态,VCC3.3
通过电阻R1
给电容充电,当电容C4
的电压升高到0.8V
以上,stm32
退出复位状态进入运行状态。
1.2.3 晶振引脚原理图
1.2.3.1 8MHz
晶振
高速晶振8MHz
作为系统时钟的来源,可以由芯片内部的HSI RC
时钟源或芯片外部的独立时钟源提供。
在STM32
最小系统板上,8M
晶振是用于提供系统时钟的外部晶体振荡电路之一。
高速晶振8MHz
作为系统时钟的来源,可以由芯片内部的HSI RC
时钟源或芯片外部的独立时钟源提供。由于芯片内部的HSI RC
时钟源不够精准,我们通常采用外部独立时钟源来来为芯片提供系统时钟。
具体计算方法如下:
如果需要一个1秒的周期,需要多少个晶振周期?
因此,如果使用8MHz
晶振,系统需要运行8000000
个晶振周期才能完成一个1
秒的周期。
1.2.3.2 32.768k
晶振
低速晶振32.768kHz
连接LSE
(low-speed external clock signal
),最终到达RTC
(real-time clock
)。
RTC
是一个独立的定时器 。从real-time clock
(实时时钟)四字可以理解,RTC
可以为系统实时记录当前系统时间和日期,不管芯片有没有掉电。如果想要使用RTC
实时记录系统时间,芯片需要接入额外备用电源,通常为纽扣电池。这样以来,RTC
在芯片掉电后,可以由电池供电继续运行。
对于掉电后不需要记录系统时间的电路板,我们将低速晶振32.768kHz
舍去,节约板子空间,精简电路设计。
2
的15
次方正好等于32768
,反过来讲,如果要把32.768K
的时钟频率经过15
次分频的话,得到的频率正好是1Hz
。
1.2.3.3 电容介绍
晶振旁的俩个电容到底有啥作用?
主要作用是平衡晶振引脚的电感的。因为晶振在高频工作时有寄生电感,为了平衡电感起到谐振的作用。所以要用两个小电容来平衡电感。一般电容的选20pf–30pf
的就可以了。具体的大小请参看晶振厂家提供的数据手册。
芯片晶振引脚的内部通常是一个反相器,芯片晶振的两个引脚之间还需要连接一个电阻,使反相器在振荡初始时处与线性状态,但这个电阻一般集成在芯片的内部,反相器就好像一个有很大增益的放大器,为了方便起振,晶振连接在芯片晶振引脚的输入和输出之间,等效为一个并联谐振回路, 振荡的频率就是石英晶振的并联谐振频率。
晶振旁边的两个电容需要接地,其实就是电容三点式电路的分压电容,接地点就是分压点,以分压点为参考点,振荡引脚的输入和输出是反相的,但从晶振两端来看,形成一个正反馈来保证电路能够持续振荡。
芯片设计的时候,其实这两个电容就已经形成了,一般是两个的容量相等,但容量比较小,不一定适合很宽的振荡频率范围,所以需要外接两个负载电容。
为了让晶振能够可靠、稳定的起振,我们在布线时,需要让晶振和负载电容尽量的靠近芯片的晶振引脚。
1.3 电源转换电路
我们可以发现电源转换电路是由一个稳压芯片AMS1117-3.3V
、两个电解电容(C21
、C22
)组成。实际上C21
和C22
两侧还应该各接一个104
的贴片电容;比如这种:
设计原因:STM32
芯片的工作电压为2.0~3.6V
,我们一般取3.3V
;而通过USB
接口输出的电源为5V
,为防止STM32
芯片损坏,需要我们通过该电源转换电路,把5V
的输入电压降低到3.3V
工作电压。
电容作用:
C4
和C5
是输出滤波电容,作用是抑制自激振荡,如果不接这两个电容,通常线性稳压器的输出会是个振荡波形;C6
和C7
是输入电容,对于交流电压整流输入,它们的第一个作用是把单向脉动电压转换成直流电压,在本图中输入已经是+5V
直流电源了,它们的作用就是防止断电后出现电压倒置,因此通常输入电容的容量应该大于输出电容。
概括性地说,输出的电容的作用是把输出信号的干扰作为滤除。输入电容的作用就是把输入信号中的高频噪声作为滤除对象,把前级携带的高频杂波滤除。
1.4 调试接口
众所周知,SWD
和JTAG
是单片机下载程序与调试的常用接口。其共同之处:
- 供电电压范围:
1.2 V - 5.5 V
; - 时钟速率: 可配置高达
10 MHz
; SWO
跟踪捕获: 数据速率高达50 Mbit/s
(UART/NRZ
模式);- 隔离电压:
1 kV
; - 热插拔:支持;
1.4.1 JTAG
JTAG
,全名为Joint Test Action Group
(联合测试行动小组)。截至本文最新的标准为IEEE Standard 1149.1-1990
。其拓扑图如下:
JTAG
一般使用5
个引脚:
TDI
(Test Data In
):串行输入引脚;TDO
(Test Data Out
):串行输出引脚;TCK
(Test Clock
):时钟引脚,一般附加100k
下拉电阻;TMS
(Test Mode Select
):模式选择(控制信号)引脚;TRST
(Test Reset
):复位引脚;
JTAG
的优势:
- 不限于
ARM
系列芯片; - 具有更多用于编程,调试和生产测试的用途。
1.4.2 SWD
全称为Serial Wire Debug
(串行线调试),是ARM
专门设计的协议,仅支持ARM
(所以在ARM
系列单片机中性能表现较佳)。
SWD
一般使用 2 个引脚:
SWDIO
(Serial Wire Data Input Output
):串行数据输入输出引脚;SWCLK
(Serial Wire Clock
):串行线时钟引脚;
SWD
的优势:
- 使用引脚更少,只需
SWDIO
和SWCLK
两个引脚; SWD
具有特殊功能,例如打印调试信息;- 与
JTAG
相比,SWD
在速度上具有更好的整体性能;
我们使用的开发板就使用了SWD
接口,电路原理图如下:
SWDIO
:在芯片内部已经有上拉,但在电路板上必须再一次上拉(100k
或者10k
电阻);不过我们这个开发板原理图并没有接上拉电阻,如果我们设计原理图,最好接上上拉电阻;
SWCLK
,在芯片内部已经有下拉,在电路板上没有特殊要求进一步下拉。
1.4.3 JTAG
与SWD
的兼容性
一般来说,单片机板子上会有以下这些烧录座,可同时兼容JTAG
与SWD
:
其中:
TCK
兼容SWCLK
;TMS
兼容SWDIO
;TDO
兼容SWO
;
选用SWD
而非JTAG
的理由:
- 电路原理图设计需要足够简单,且可以在没有
JTAG
功能的情况下进行测试; PCB
在尺寸方面有限制,SWD
可以节省空间;MCU
已经没有多余的引脚给JTAG
用了。
1.5 BOOT0/1
BOOT
决定的模式:
BOOT1 | BOOT0 | 启动方式 | 说明 |
---|---|---|---|
X | 0 | 主闪存存储器 | 主闪存存储器被选为启动区域 |
0 | 1 | 系统存储器 | 系统存储器被选为启动区域 |
1 | 1 | 内置SRAM | 内置SRAM被选为启动区域 |
1.5.1 主闪存存储器
是STM32
内置的Flash
,一般我们使用JTAG
或者SWD
模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
1.5.2 系统存储器
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。
系统存储器是芯片内部一块特定的区域,STM32
在出厂时,由ST
在这个区域内部预置了一段BootLoader
,也就是我们常说的ISP
程序,这是一块ROM
,出厂后无法修改。
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader
中,提供了串口下载程序的固件,可以通过这个BootLoader
将程序下载到系统的Flash
中。但是这个下载方式需要以下步骤:
- 将
BOOT0
设置为1,BOOT1
设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
; - 最后在
BootLoader
的帮助下,通过串口下载程序到Flash
中; - 程序下载完成后,又有需要将
BOOT0
设置为0,手动复位,这样,STM32
才可以从Flash
中启动。
1.5.3 内置SRAM
内置SRAM
,既然是SRAM
,自然也就没有程序存储的能力了,这个模式一般用于程序调试。
假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash
,比较的费时,可以考虑从这个模式启动代码(也就是STM32
的内存中),用于快速的程序调试,等程序调试完成后,再将程序下载到Flash
中。
1.6 LCD
外围电路
开发板支持外接一块I2C
通信的OLED
的屏幕,比如可以连接与开发板配套的128*128 TFT_LCD
液晶屏;
1.7 串口一键下载电路(CH340
)
我们想用串口下载代码,就要配置BOOT0
为1,BOOT1
为0,但是如果想让STM32
一复位就运行代码,就要配置BOOT0
为0,BOOT1
配置为什么都可以,为了解决这个问题,我们可以设计一个电路,通过串口转USB
芯片CH340G
的DTR#
和RTS#
引脚的信号来控制一键下载电路,从而间接控制STM32
的RESET
和BOOT0
引脚的信号,来达到通过串口一键下载和运行的效果,省去了购买仿真器的费用,下载程序也变得简单方便,一键下载电路如下图所示:
我们需要注意一点:CH340G
上电后DTR#
和RTS#
都为高电平,在用MCUISP
烧写软件时,我们在软件下方选择DTR
的低电平复位,RTS
高电平进BootLoader
,CH340G IC
在实际操作时引脚的变化为DTR#
拉高,RTS#
拉低,即软件设置和实际情况是取非的,相反的。
具体原理如下:
mcuisp
控制DTR
输出低电平,则DTR#
输出高,然后RTS
置高,则RTS#
输出低,这样Q1
导通了,BOOT0
被拉高,即实现设置BOOT0
为1,同时Q2
也会导通,STM32
的复位脚被拉低,实现复位;- 然后,延时
100ms
后,mcuisp
控制DTR
为高电平,则DTR#
输出低电平,RTS
维持高电平,则RTS#
继续为低电平,此时STM32
的复位引脚,由于Q2
不再导通,变为高电平,STM32
结束复位,但是BOOT0
还是维持为1,从而进入ISP
模式,接着mcuisp
就可以开始连接STM32
,下载代码了,从而实现一键下载。
程序下载完毕后,如果设置了编程后执行,STM32
会再次被复位,此时DTR#
为高,RTS#
为低,STM32
复位后,DTR#
设置为低,RTS#
设置为高,那么Q1
和Q2
都不导通,此时,STM32
重新开始启动后,检测到BOOT0为0
,程序开始正常运行,一键下载至此就完成了。
二、程序烧写
2.1 ISP
下载
STM32
开发板,自带串口一键下载电路,配合上位机可实现一键ISP
下载,不需要修改开发板上的BOOT
设置。与仿真器相比, ISP
只能下载程序,不能在线调试且下载速度慢 。
串口下载软件选用的是MCUISP
,通过串口的DTR
和RTS
信号来自动配置BOOT0
和RESET
信号,不需要用户手动切换它们的状态,直接串口软件自动控制,可以方便的下载代码。
2.1.1 配置
我们首先需要安装好CH340
驱动,然后将PC
和STM32
开发板的ISP
接口通过USB
线连接好,打开MCUISP
,点击搜索串口,将自动找到电路板板载串口。
在bps
中选择波特率为115200
(尽量不要设置的太
高),左下角选择:DTR
的低电平复位,RTS
高电平进BootLoader
。再加载烧写文件。
2.1.2 读取器件配置
在烧写程序以前,点击读器件信息将出现如下图所示的信息,说明电路板串口连接成功。
2.1.3 烧录程序
选择要烧录的hex
文件,点击开始编程,程序开始烧写,烧写成功后会出现如下图所示信息,表明程序烧写成功。
2.2 SWD
下载
首先需要安装Jlink
驱动,这里就不过多介绍了。接着我们使用Keil 5
打开STM32
开发板自带的出厂程序。
2.2.1 设置Jink
点击Settings
,选择SW
,并配置为5M
;
配置好相应的Flash Download
选项;
2.2.2 下载
将JLink
的如下引脚与开发板对应引脚连接起来;
-
TCK
连接到SWCLK
; -
TMS
连接到SWDIO
; -
VTref
连接到3.3V
; -
GND
连接到GND
。
编译工程文件,开始下载:
参考文章