针对 STM32 单片机的学习
- 开发工具:Keil5
- 开发板:STM32F103C8T6
- 烧录工具:ST-Link Utility
# 三种烧录方式
嵌入式是:Embedded Programming,即将程序烧录到 MCU 内部的 ROM 中,运行时不需要外接电源。
# 介绍 / 前言
STM32 是一种高性能、低功耗的 32 位微控制器,具有丰富的外设接口,可广泛应用于各种应用领域。本系列将介绍 STM32 的基本知识、基本用法、常用外设及驱动、编程技巧等内容。
# 外设介绍
- 位于内核里的外设
它的外设(peripherals)包括 GPIO、定时器、串口、SPI、I2C、USB、ADC、DAC、PWM、CAN、QSPI、SDIO、RNG、LCD 等。
英文缩写 | 名称 | 英文缩写 | 名称 |
---|---|---|---|
NVIC | 嵌套向量中断控制器 | CAN | 控制器局域网 / CAN 通信 |
SysTick | 系统计时器 | USB | 通用串行总线 / USB 主机 |
SCB | 系统控制块 | USART | 通用串行接口 / 串口通信 |
GPIO | 通用输入输出 | SPI | 串行外围接口 / SPI 通信 |
ADC | 模拟 - 数字转换 | I2C | 互联式总线 / I2C 通信 |
DAC | 数字 - 模拟转换 | UART | 通用异步收发器 / UART 通信 |
PWM | 脉冲宽度调制 | RNG | 随机数发生器 |
RTC | 实时时钟 | LCD | 液晶显示屏 |
# 命名规则
# 系统结构
图・・・・・・・・・・・・・・・
三个总线 icode 指令总线(加载程序指令)、dcode 数据总线(加载数据,比如常量何调试数据)、system 系统总线。icode 与 dcode 总线主要用来连接 flash 闪存(flasd 存储的是编写的程序)。
sram 用于存储程序运行时的变量数据
ahb(先进高性能总线)系统总线用于挂载主要的外设(挂载最基本或者性能比较高的外设,比如复位和时钟控制这些基本的电路)sdio 也是挂载在 ahb 上的。
两个桥接,接到了 apb1(先进外设总线)和 apb2 两个外设总线上(用来连接一般的外设)
ahb 和 apb 的总线协议、总线速度还有数据传输格式的差异,所以中间需要加两个桥接来完成数据的转换和缓存
ahb 的整体性能比 apb 高一些,APB2 的性能比 APB1 高一些。
APB2 一般和 AHB 同频率都是 72MHz,APB1 一般是 36MHz,所以 APB2 连接的一般是外设中稍微重要的部分(例如 GPIO 端口,还有一些外设的一号选手比如 USART1、SPI1、TIM1、TIM8(高级定时器)、ADC、EXTI、AFIO),Apb1 连接次要一点的外设 2、3、4 号外设还有 DAC\PWR\BKP 等。
DMA 是 CPU 的小秘书,比如一些大量的数据搬运这样简单且重复干的事情,让 cpu 来干会浪费时间。
DMA 通过 DMA 总线连接到总线矩阵上,可以拥有和 cpu 一样的总线控制权,用于访问外设小弟,当需要 DMA 搬运数据时,外设就会通过请求线发送 DMA 请求,然后 DMA 就会获的总线控制权,访问并转运数据,整个过程不需要 cpu 的参与
# 引脚定义
图・・・・・・・・・・・
- 拿到一个芯片时,需要着重的看一下它的引脚定义
- 让 STM32 正常工作,首先将电源部分和最小系统部分的电路连接好(也就是这个表中红色和蓝色的部分)
- 红色为电源相关引脚,蓝色为最小系统相关引脚,绿色为 IO 口、功能口
- S 代表电源、I 代表输入、O 代表输出,IO 代表输入输出
- IO 口电平代表 IO 口所能容忍的电压,FT 代表容忍 5V 的电压,没有 FT 的智能容忍 3.3V 电压(如果没有 FT,需要接 5V 的电平,需要加装电平转换电路)
- 主功能就是上电后默认的功能,一般和引脚名称相同。如果不同的话引脚的实际功能是主功能而不是引脚名称的功能
- 默认复用功能是,IO 口上同时连接的外设功能引脚,配置 IO 口时可以选择是通用 IO 口还是复用功能
- 重定义功能,作用是如果有两个功能同时复用在了一个 IO 口上,而且确实需要用到这两个功能,可以将其中一个复用功能重映射到其他端口上(前提是,这个重定义功能的表里有对应的端口)
- 优先使用加粗的 IO 口,没有加粗的 IO 口可能需要进行配置或者兼具其他功能。
- 1 引脚 VBAT 是备用电池供电引脚,可接 3v 电池,当系统电源断电时,备用电池可给内部的 RTC 时钟和备份寄存器提供电源
- 2 引脚是 IO 口或侵入检测或 RTC,IO 口可以根据程序输出或读取高低电平。侵入检测可以用来做安全保障的功能(比如你的产品安全性比较高,可以在外壳加一些防拆的触电,然后接上电路到这个引脚上,若有人强行拆开设备,则触电断开,这个引脚的电平变化就会触发 STM32 的侵入信号,然后就会清空数据来保证安全)。RTC 的引脚可以用来输出 RTC 校准时钟、RTC 闹钟脉冲或者秒脉冲
- 3、4 引脚是 IO 口或者接 32.768KHz 的 RTC 晶振
- 5、6 号引脚接系统的主晶振,一般是 8MHz,然后芯片内有锁相环电路,可以对这个 8MHz 的频率进行倍频,最终产生 72Mhz 的频率作为系统的主时钟
- 7 引脚 NRST 是系统复位引脚,N 代表是低电平复位
- 8、9 引脚是内部模拟部分的电源,比如 ADC、RC 振荡器等。vss 是负极,接 GND,VDD 是正级,接 3.3V
- 10-19 号引脚都是 IO 口,其中 PA0 还兼具了 WKUP 功能(可以用于唤醒处于待机模式的 STM32)
- 20 号引脚是 IO 口或 BOOT1 引脚,BOOT 引脚是用来配置启动模式的
- 21、22 引脚是 IO 口
- 23、24 引脚是 VSS_1 和 VDD_1 是系统的主电源口,同样的 VSS 是负极,VDD 是正级
下面的 VSS_2 和 VDD_2 以及 VSS_3 和 VDD_3 都是系统的主电源口,这里 STM32 内部采用分区供电的方式,所以供电口比较多,在使用时,把 VSS 都接 GND,VDD 都接 3.3V 即可 - 25-33 引脚都是 IO 口
- 34-40 引脚再加 27 号引脚,都是 IO 口或者调试端口,默认功能是调试端口(用来调试程序和下载数据),这个 STM32 支持 SWD(需要两根线,分别是 SWDIO 和 SEDLK) 和 JTAG (需要五根线,分别是 JTMS、JTCK、JTDL、JTDO、NJTRST) 两种调试方式。
- STLINK 调试程序用的是 SWD 方式(只需占用 PA13 和 PA14 这两个 IO 口,剩下的 PA15、PB3、PB4 可以切换为普通的 IO 口使用(需在程序中配置,不配置的话默认是不会用作 IO 口的)
- 41、42、43、45、46 引脚都是 IO 口
- 44 引脚 BOOT0 和 BOOT1 一样用来做启动配置
# 启动配置
- 启动配置的作用是指定程序开始运行的位置。
- 一般情况下,程序都是在 FLASH(主闪存存储器)程序存储器开始执行
- 接 1 就是接到 3.3V 电源正的意思
- 系统存储器这个模式就是用来做串口下载的,这个系统存储器存的就是 STM32 中的一段 - BootLoader 程序(BootLoader 程序作用就是接受串口的数据,然后刷新到主闪存中,这样就可以使用串口下载程序)。
- 一般,需要串口下载程序时(当没有调试接口时,这时需要用到串口的方式下载程序)需要配置到系统存储器启动模式
- 内置 SRAM 模式,主要用来进行程序的调试
- BOOT 引脚的值是在上电复位后的一瞬间有效的,之后就随便了。例如 20 引脚在上电瞬间是 BOOT1 的功能,当第四个时钟过之后就是 PB2 的功能了
# 最小系统电路
- 一般来说,单片机只有一个芯片是无法正常工作的,需要连接最基本的电路(最小系统电路)
- 供电部分,VSS 都连接了 GND,VDD 都连接了 3.3V。在这个 3.3v 和 GND 之间,一般会连接一个滤波电容(这个电容可以保证电压的稳定)
- 一般只要遇到供电,都会习惯上加上几个滤波电容
- VBAT 是接备用电池的。可以选择一个 3v 的纽扣电池,正极接 VBAT,负极接 GND。备用电池是给 RTC 和备份寄存器服务的
- 晶振部分,接一个 8MHz 的主时钟晶振(8MHz 经过内部锁相环倍频,得到 72Mhz 的主频)
- 这个晶振的两根引脚分别通过两个网络标号接到 STM32 的 5、6 号引脚
- 还需接两个 20pf 的电容,作为启震电容,电容的另一端接地即可
- 若需 RTC 功能还需再接一个 32.768KHz 的晶振,电路和这个一样,接在 3、4 号引脚,OSC32 - 就是 32.768KHz 晶振的意思。(因为 32.768 是 2 的 15 次方,内部 RTC 经过 2 的 15 次方分频就可以生成 1 秒的时间信号)
- 复位电路部分,是一个 10k 的电阻和 0.1uf 的电容组成,用来给单片机提供复位信号,NRST 接在 STM32 的 7 号引脚
- 上电瞬间的波形是先低电平,然后逐渐高电平。NRST 是低电平复位的(当复位电路上电的瞬间,电容是没有电的),电源通过电阻开始向电容充电,并且此时电容呈现的是短路状态(NRST 引脚就会产生低电平)。当电容逐渐充满电时,电容就相当于断路,此时 NRST 就会被 R1 上拉为高电平。(低电平提供 STM32 的上电复位信号)
- 按键,提供一个手动复位的功能,当按下按键,电容放电,并且 NRST 引脚也通过按键直接接地了,这就相当于手动产生了低电平复位信号,按键松手后,NRST 又回归高电平,此时单片机从复位状态转为工作状态。复位,程序就从头开始运行。
- 启动配置部分,H1 相当于开关的作用(拨码开关 / 插跳线帽),拨动开关就可以让 BOOT 引脚选择接 3.3v 还是 GND 了
- 下载端口部分,若使用 STLINK 下载程序,需将 SWDIO 和 SWDLK 这两个引脚引出来方便接线,另外将 3.3v 和 GND 引出来
# 第一个工程的实现
- 标准库(库函数)新建工程教程和方法实例:https://blog.csdn.net/m0_61712829/article/details/132369707
每次新建完工程之后要添加到积木箱并且把路径加到 C/C++ 的 defines 定义文件下中,否则会找不到头文件。
头文件搜索路径中,否则会找不到头文件。
USE_STDPERIPH_DRIVER