什么是单片机
单片机(Single-Chip Microcomputer)单片机微型计算机,是一种集成电路芯片,把具有数据处理能力的中央处理器 CPU、随机存储器 RAM、闪存 flash、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
单片机特点:
- 体积小:<5mm*5mm
- 功耗低:mA级
- 集成度高:IO/TIM/AD/DA
- 使用方便:C/Debug
- 扩展灵活:IIC/SPI/FSMC
STM32命名规则
Cortex-M系列介绍
ARM公司与ST公司
- ARM公司:只做内核设计和 IP 授权,不参与芯片设计。
- ST公司:拿到 ARM 公司授权后,进行芯片设计。类似的公司还有华为、高通、NXP 等。
ARM内核系列
- A 系列:Application缩写。高性能应用,比如:手机、电脑、电视等。
- R 系列:Real-time缩写。实时性强,汽车电子、军工、无线基带等。
- M 系列:Microcontroller缩写。超低功耗,工控、消费电子、家电、医疗器械等。
- 性能由高到低,时钟频率由高到低。
如何获取和使用数据手册
获取途径:
- ST官网:st.com/content/st_com/en.html;
- 中文社区网:STMCU中文官网;
- 一些搜索网站,例如百度等等;
- 售卖店铺,例如淘宝的详情页。
如何阅读数据手册:(本篇以STM32F103系列产品说明)
- 芯片手册(数据手册);
- 参考手册。
嵌入式硬件基础
认识手中的开发板上
例:上官二号开发板
- 主控芯片:STM32F103C8T6
- 高速晶振:8M
- 低速晶振:32.768k
- LED:5 颗
- KEY:3 个
项目
|
介绍
|
内核
|
Cortex-M3
|
Flash
|
64K x 8bit
|
SRAM
|
20K x 8bit
|
GPIO
|
37
个
GPIO
,分别为
PA0-PA15
、
PB0-PB15
、
PC13-PC15
、
PD0-PD1
|
ADC
|
2
个
12bit ADC
合计
12
路通道,外部通道:
PA0
到
PA7+PB0
到
PB1
内部通道
:
温度传感器通
道
ADC_Channel_16
和内部参考电压通道
ADC_Channel_17
|
定时器/计数器
|
4
个
16bit
定时器
/
计数器,分别为
TIM1
、
TIM2
、
TIM3
、
TIM4
,
TIM1
带死区插入,常用于
产生
PWM
控制电机
|
看门狗
定时器
|
2
个看门狗定时器(独立看门狗
IWDG
、窗口看门狗
WWDG)
|
滴答定时器
|
1
个
24bit
向下计数的滴答定时器
systick
|
工作电压、温度
|
2V~3.6V
、
-40°C~85°C
|
通信接口
|
2 * IIC
,
2 * SPI
,
3 * USART
,
1 * CAN
|
系统时钟
|
内部
8MHz
时钟
HSI
最高可倍频到
64MHz
,外部
8MHZ
时钟
HSE
最高可倍频到
72MHZ
|
STM32F103C8T6引脚分布
注意: I = 输入,O = 输出,S = 电源, HiZ = 高阻 ,FT:容忍5V
- 电源引脚
基本以字母 V 开头,比如 VDD/VSS、VDDA/VSSA、VREF+/VREF-、VBAT 等。
- VDD/VSS:数字部分电源正/负引脚,为 STM32 供电。
- VDDA/VSSA:模拟部分电源正/负引脚,为内部模拟部分供电。
- VREF+/VREF-:为 ADC/DAC 提供参考电压,100 脚以上的型号 才有这两个脚。
- VBAT:RTC/后备区域供电引脚(可用纽扣电池供电)。
- 晶振引脚
一共两组:OSC_IN/OSC_OUT、OSC_IN32/OSC_OUT32。
- OSC_IN/OSC/OUT:外部 HSE 晶振引脚(高速),用于给 STM32 提供高精度系统时钟。
- OSC_IN32/OSC_OUT32:外部 LSE 晶振引脚(低速),用于给 STM32 内部 RTC 提供晶振。
- 内部晶振:HSI、LSI
- 复位引脚
只有一个:NRST
用于复位 STM32 ,低电平有效。
- 下载引脚 (三种下载引脚。)
第一种:JTAG(可仿真/调试,但占用引脚数较多);
第二种:SWD(可仿真/调试,占用引脚数较少,强烈建议!)
第三种:串口( 只能下载程序,不可调试。只能串口 1 ,其它串口不行!)
- BOOT引脚
BOOT0 及 BOOT1 ,启动选择引脚。
- GPIO引脚
以字母 P 开头的都是 GPIO 引脚。
STM32最小系统
定义:单片机最小系统是指能够将 单片机芯片运行所必需的最少的硬件电路 集成在一起的系统。
它是一种基本的单片机应用系统,通常由 主芯片,时钟电路,复位电路,电源电路, BOOT 启动电路,程序 下载电路,扩展接口 组成,为单片机提供时钟信号、复位信号以及外设接口等必要功能。
提供时钟信号:
|
晶振是一个振荡器,它会产生连续的脉冲信号,这些信号的频率非常稳定。
STM32
微控制器中的CPU
和其他外围设备需要一个稳定的时钟信号来协调它们的工作。因此,晶振
为整个系统提供了一个可靠的时钟源,使得各个模块能够以相同的频率工作,从而保证系统的稳定性和准确性。
|
决定CPU的工作速度:
|
晶振的频率决定了CPU的工作速度。频率越高,CPU的执行速度就越快;反之,频率越低,CPU的执行速度就越慢。
因此,根据实际需求选择合适的晶振,可以确保系统在满足性能要求的同时,不会造成不必要的功耗浪费。
|
确保外围设备的正常工作:
|
除了
CPU
之外,系统中还有很多其他的外围设备,如串口、定时器、
ADC等。这些
外围设备也需要时钟信号来进行工作
。晶振提供的时钟信号可以确保这些外围设备正常、准确地工作。
|
解决电磁兼容性问题:
|
一些外围设备在工作时可能会产生电磁干扰,这些干扰可能会影响系统的稳定性。而晶振产生的时钟信号是高度稳定的,因此
使用晶振可以减少由于电磁干扰导致的系统误差或故障。
|
电路的基础知识(能看懂原理图)
![]() | VCC:接正极;GND:接地 |
![]() | 电阻 |
![]() | 电容:滤波(滤波电龙) |
![]() | 电感:通直阻交 |
![]() | 连接件 |
![]() | 开关 |
![]() | 晶体管: PNP、NPN、 P-MOS、N-MOS |
![]() | 稳压器件,能将5v电压转变成3.3v电压 |
常见的晶体管电路图:
| 非门:![]() |
![]() ![]() | 与门:![]() |
| 或门:![]() |
| 异或门:![]() |
如何查看原理图(以上官二号开发板为例)
- 电源电路
- 主芯片电路
- 复位部分电路
| ①号:表示当按键未按下时,RST接上拉电阻,复位按键置3.3v高电平; ②号:当按键按下时,RST接GND,此时置低电平; ③号:通电复位,当接通电路时,C5电容蓄电,达到饱和时接通电路。 |
- 晶振电路:
- 下载电路(SWD)
- BOOT启动电路
上官二号最小系统板只有BOOT0电路,下拉输入,接置低电平0,表示只能从主闪存存储器启动:
其他最小系统板BOOT1和BOOT0电路都存在,表示能从系统存储器启动:
- 扩展电路(不同的电路不同)
电路图 接口 名称 按键 GPIO口 LED灯:①电源指示灯、②编程的时点亮的灯、③TXD2和RXD2串口灯(看数据是否存在通信) AT24C64: EEPROM(电可擦可编程只读存储器)芯片。
功能:通过 I²C(Inter-Integrated Circuit) 接口与主控芯片(如MCU、CPU)通信,仅需两根信号线(SCL时钟线、SDA数据线)。
开发环境的搭建
官方安装包/器件
1 MDK5官方安装包获取
MDK-ARM Version 5.42a Evaluation Software Request
2.官方器件包获取
- 什么是器件包呢?由于 ST 公司生产了非常多的芯片,每颗芯片所需要的支持文件都不一样,这些文件组合 起来就是器件包。
- 但有这么多芯片,他们不可能把所有的器件包都集成在 MDK5 里,否则 MDK5 的安装包将变得超级无敌巨大,很占空间也没必要。比较好的解决方案就是你需要用到什么芯片,就安装对应的器件包就可以了。
网址如下:
3.STM32CubeMX 的安装
- 作用:通过界面的方式,快速生成工程文件。(初学者不建议使用)
- 下载和安装详见:一文教你使用STM32CubeMX开发工具 | 良许嵌入式
为什么要下载CH340?
答:
- 串口下载程序(BOOT0引脚:1,BOOT0引脚:0);
- 进行通信(USART)。
下载程序的五种方式
- 串口下载(学会);
- ST-Link V2下载(学会);
- STM32 ST-LINK Utility;
- JLink下载;
- STVP下载(一般不用)。
具体使用方法: STM32下载程序的五种方法 | 良许嵌入式
MDK5常用的配置和使用技巧
- MDK5基本使用方法(参考文章):一文教你使用MDK开发工具 | 良许嵌入式
- 一些推荐的常用的配置
编辑器配置(扳手) | 代码提示与语法检测(扳手) | 快速定位函数或变量位置(魔法棒)-快捷键:F12 |
![]() | ![]() | ![]() |
- 使用技巧:
查找匹配花括号: | ctrl+e | Tab键的使用: |
|
快速注释/取消注释:
|
|
快速编辑一列
|
按住
Alt
选择一列编辑
|
快速打开头文件:
|
右击,选择
open document
|
快速拆分窗口
| 右击标签页,选择 new horizontal(按行)/vertical tab group(按列) |
查找和替换功能:
MDK仿真调试
仿真调试的配置(参考文章):手把手教你使用MDK仿真调试 | 良许嵌入式
这篇文章主要介绍:调试工具的配置,各个调试按钮的作用,工具栏常用窗口按钮的介绍 。并举例如何查看延时函数是否起作用。
STM32系统入门
-
F1系列内核和芯片系统架构
在小容量、中容量和 大容量产品中,主系统 由以下部分构成:
四个驱动单元(主动单元):
对被动单元发出命令请求;用来控制被动单元
| 四个被动单元 不能对主动单元发起控制 |
|
|
补充:
DMA(Direct Memory Access,直接内存访问):
- 定义:是一种允许外部设备(如硬盘、网卡等)直接访问计算机内存的技术,而无需 CPU 的干预。
- 工作原理:在进行数据传输时,DMA 控制器会接管总线控制权,直接在内存和外部设备之间传输数据,传输完成后再将总线控制权交还给 CPU。这样可以大大提高数据传输效率,减少 CPU 的负担,使 CPU 能够同时处理其他任务。
AHB(Advanced High - performance Bus,高级高性能总线):
- 定义:是 AMBA(Advanced Microcontroller Bus Architecture)总线架构中的一种高性能总线,主要用于连接高性能的处理器、存储器和其他高速设备。用于构建片上系统(SoC),连接 CPU、内存控制器(复位)、高速外设(时钟控制RCC)等组件,以满足系统对高性能数据传输的需求。
- 工作原理:采用了流水线操作和突发传输等技术,支持多个主设备和从设备同时进行数据传输,能够实现高速的数据传输和复杂的总线仲裁机制,以确保多个设备之间的高效协作。
APB(Advanced Peripheral Bus,高级外设总线):
- 定义:也是 AMBA 总线架构的一部分,是一种低功耗、低成本的总线,主要用于连接低速外设,如 UART、SPI、GPIO 等。
- 工作原理:APB 总线相对简单,采用了单周期传输和简单的地址译码机制,不需要复杂的仲裁逻辑。它通过桥接器与 AHB 等高性能总线相连,实现了高速总线与低速外设之间的数据传输和通信。
- 系统结构简图(参考手册)

- STM32F103xx增强型模块框图(数据手册上的)
注意:
不同型号的 STM32 微控制器,其系统时钟架构和最高频率有所不同。比如,STM32F4 系列微控制器的 APB1 最高频率可达 42MHz,APB2 最高频率可达 84MHz;而 STM32H7 系列微控制器的频率更高。所以,具体的频率要参考对应微控制器的数据手册。
-
存储器映像
STM32 寻址范围:2^32 = 4 * 2^10 *2^10 K = 4 * 2^10 M = 4G
地址所访问的存储单元是按字节编址的。
什么是存储器映射?
答:存储器本身不具有地址信息,给存储器分配地址的过程称为存储器映。
ROM:只读存储器,非易失性,掉电不丢失的存储器(类似于硬盘);
RAM:随机存储器,易失性,掉电丢失的存储器(类似内存)。
什么是寄存器?
答:现在举一个高压锅的例子,高压锅的显示屏:数据存储器
开关、食物的类型、口感:控制寄存器
饭好了会亮灯、鸣响:中断寄存器
加热、升压:状态寄存器
等等,还有许多种类的寄存器,大多数寄存器不单是起存储的作用,内部也有许多电路连接,可以控制硬件,也可以显示硬件的状态,操作寄存器可以起到对外部硬件控制的作用。
寄存器映射
定义:寄存器是特殊的存储器,给寄存器地址命名的过程,就叫作寄存器映射。
寄存器地址:0x4001080C、寄存器名字:GPIOx_ODA
直接操作寄存器(地址) | 寄存器映射后在操作 | 结构体操作 (更加的便捷操作寄存器,可以一次批量的重映射一大堆) |
门牌号111 = 一斤鸡蛋 | 老王家 = 一斤鸡蛋 | 老王家=一斤鸡蛋 |
*(unsined int *)(0x4001080C) = 0xFFFF
|
GPIOx_ODR = 0xFFFF
| GPIO->ODR = 0下FFFF |
- 寄存器起始地址(参考手册:寄存器映射)
- 进行外设地址映射
总线基地址 + 外设相对于总结基地址偏移量 + 寄存器相对于外设基地址偏移量
举例:假如有一个小区,分成ABC三个小区,没区有十栋楼,每栋楼有二十户人家。
小区 | 总线 | 基地址 | 偏移量(相对于APB1基地址) |
A |
APB1
| 0X4000 0000 | 0 |
B |
APB2
| 0X4001 0000 |
0X1 0000
|
C |
AHB
| 0X4001 8000 |
0X1 8000
|
外设基地址:
楼 | 外设(挂载在APB2总线上) | 基地址 | 偏移量(相对于APB2总线基地址) |
1 | GPIOA |
0X4001 0800
|
0X800
|
2 | GPIOB |
0X4001 0C00
|
0XC00
|
3 | GPIOC |
0X4001 1000
|
0X1000
|
4 | GPIOD |
0X4001 1400
|
0X1400
|
GPIOA寄存器地址:
门牌号 | 寄存器(GPIOA上的部分寄存器) | 地址 | 偏移量(相对于GPIOA外设基地址) |
1 |
GPIOA_CRL
|
0X4001 0800
|
0X00
|
2 |
GPIOA_CRH
|
0X4001 0804
|
0X04
|
3 |
GPIOA_IDR
|
0X4001 0808
|
0X08
|
4 |
GPIOA_ODR
|
0X4001 080C
|
0X0C
|
5 |
GPIOA_BSRR
|
0X4001 0810
|
0X10
|
6 |
GPIOA_BRR
|
0X4001 0814
|
0X14
|
7 |
GPIOA_LCKR
|
0X4001 0818
|
0X18
|
新建HAL版本工程模板
搭建工程模板教程
- 具体方法详见文章:手把手带你创建HAL版本MDK工程模板 | 良许嵌入式
- 文件夹创建的流程图:
什么是CMSIS
答:使用CMSIS,可以为 处理器 和 外设 实现一致且简单的 软件接口 ,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。
操作单片机的方式(三种)
寄存器 | 标准库 | HAL库(Hardware Abstraction Laye) |
|
|
|
两个宏和常见文件的意义
- 两个宏定义的意义
两个宏定义:USE_HAL_DRIVER 和 STM32F103xB(中间用英文逗号隔开)
如果要使用别的芯片的话:要将 STM32F103xB 替换成对应的
配置:
作用:
USE_HAL_DRIVER | STM32F103xB |
![]() | ![]() |
- 常见文件的意义:
STM32启动
从上电/复位到在运行main函数的时候,中间还需要执行一段代码。
启动流程
1.上电/复位;
2.根据BOOT0/BOOT1确定程序从哪个存储位置启动。(有三中方式)
3.初始化 sp 和 pc 指针
- 将 0X08000000 位置(存储器映像中Flsah存储器的起始地址)的 栈顶地址 存放在 SP 指针中。(如下图所示)
- 将 0x08000004 位置 (相差一个int字节)存放的 向量地址(0x080001CD:存放的是接下来要执行的复位代码) 装入 PC 程序计数器。(如下图所示)
进一步说明:(0x080001CD : 启动引导代码 )
执行 Reset handler函数:将__main( != main函数)和 SystemInit 导入进来。
4.初始化系统时钟
5. 初始化用户堆栈
6. 进入main函数
map文件
定义:map 文件是 MDK 编译代码后,产生的集程序、数据及IO空间的一种映射列表文件。简单来说就是包括了: 各种 .c 文件、函数、符号等的地
址、大小、引用关系等信息。
作用: 用于分析各 .c 文件占用 FLASH 和 RAM 的 大小,方便 优化代码 。
生成和打开该文件
- 生成:利用魔法棒进行如下配置
- 打开方式
组成(五部分):
模块、段(入口)交叉引用(
Section Cross References
)
|
移除未使用的模块(
Removing Unused input sections from the image
)
|
映射符号表(
Image Symbol Table
)
|
内存(映射)分布(Memory Map of the image)
重点
|
映射组件大小(Image component sizes)
重点
|
描述了各文件之间函数的调用关系,
有 助于理解各个源文件如何相互关联。
|
描述了工程中未用到 而被删除的冗余程序段
,有助于优化代码,降低内存负担。
|
描述了各符号(程序段、数据)在存储器中的地址、类型、大小等信息
,对于理解程序的内存布局以及定位特定代码或数据段非常有用。
|
描述了各程序段(函数)在存储器中的地址及占用大小
,有助于分析程序的内存占用情况。
|
给出了整个映像代码(.o)占用空间的汇总信息
,包括
代码、只读数据、已初始化读写数据、未初始化读写数据等的大小,有助于了解程序的总体内存使用情
况。
|
map 文件相关的一些基本概念
段(section)
|
RO
|
RW
|
ZI
|
.text
|
.constdata
|
.bss
|
.data
|
描述映像文件的代码和数据块
|
Read-Only
的缩写,包括
RO-data
(只读数据)和
RO-code
(代码)
|
Read-Write
的缩写,主要是
RW-data
,
RW-data
由程序初始化初始值
|
Zero-initialized
的缩写,主要是
ZI-data
,由编译器初始化为
0
。
|
与RO-code
同义
|
与
RO-data
同义
|
与
ZI-data
同义
|
RW-data
同义
|
时钟树
什么是时钟
定义:时钟是由电路产生的具有周期性的脉冲信号,相当于单片机的心脏,给单片机提供一个统一的信号。 要想使用单片机的外设必须开启相应的时钟。
HSE | HSI | LSI | LSE |
高速外部时钟
| 高速内部时钟 | 低速内部时钟 | 低速外部时钟 |
配置时钟树
- 由 外部时钟 到 系统时钟
- 系统时钟 到 内核、AHB、APBx时钟