1.1 GPIO 输出电压
1.1 GPIO 输出电压
Sarzn欢迎来到 RM 电控, 这是一个新手向教程. 如有任何错误或者建议可以在文章下方的评论区留言, 收到反馈后会已邮件的方式发送通知
1.理论知识 - 基本硬件
MCU(Microcontroller Unit) - 微型控制单元
- 系统板的大脑, 相当于主机上的 CPU - 中央处理器
- 一般 3.3v 供电: 低电平约为 0v; 高电平约为 3.3v
RCC(Reset Clock Control) - 时钟
时钟是 STM32 单片机意见各种设备的心跳, 不可缺少
四种类型:
- HSI HSE LSI LSE
- 低速通常用于实时时钟 - RTC(Real Time Clock)等
- 高速通常用于定时器, UART, ADC 等多种外设
| 高低速 | 内外部 |
|---|---|
| HS(HighSpeed) - 高速 | I(Internal) - 内部 |
| LS(LowSpeed) - 低速 | E(External) - 外部 |
两两相互组合便得到了上述的四种类型
三种模式:
- Disable: 不启用外部时钟, 会导致自动-强制启用 MCU 的内部时钟(因为时钟必须存在), 但是MCU 的内部时钟通常不精准
- Crystal/ceramic resonator - 晶振/陶瓷振荡器: 它通常由开发板的某元件产生, 该元件俗称晶振 可以受到一定激励产生时钟信号, 经由 MCU 内部时钟电路驱动可以作为单片机的时钟
- Bypass clock source - 旁路时钟源:
它由其他设备主动给出, 该时钟信号不经过 MCU 内部时钟电路的驱动,
可直接作为单片机的时钟
Clock Tree - 时钟树
时钟是设备的心跳, 但是不同的设备所需要的时钟频率可能不一样,
于是我们需要时钟树来进行统一管理
以此确保一个数字芯片中所有需要同步工作的时序元件能在同一时刻(或具有严格可控的时序关系)接收到时钟信号
看起来像树一样: 由许多缓冲单元(buffer cell) 平衡搭建的网状结构,一般由一个时钟源点,经一级一级的缓冲单元搭建而成
- 基本时钟信号会经过单片机MCU 内部电路的处理, 通过倍频, 分频 (通过 PLL)实现不同频率的子时钟
- 时钟信号同步了需要同步工作的时序元件
- 不同的子时钟作用到不同的设备上, 适配不同设备的工作环境
- 按需配置, 一般性能拉满
我们都知道, STM32F103 官方推荐的最高稳定时钟可以达到 72MHz 但是这么高的频率只由晶振是很难实现的, 那我们该怎么办呢?
答案是我们通过一个神奇的电路来对晶振产生的频率进行加倍放大, 便可以得到我们想要的 72MHz, 这个神奇的电路就是 PLL - Phase Locked Loop
PLL - Phase Locked Loop
- 介绍: PLL(Phase Locked Loop),中文叫做锁相环或是锁相回路
- 作用: PLL 的主要作用是对时钟进行倍频 再进行输出
记住这个 PLL 哦, 这一章对应的实验篇我们会再次遇见它.
动手试一试: 在System Core - RCC 打开一个 HSE选择晶振, 会发现时钟树原本灰色的 HSE 亮了!
总览
1.2 理论知识 - GPIO 通用输入输出端口
GPIO - General Purpose Input Output(通用输入输出端口) GPIO 是 MCU 与外部元件沟通的接触点(俗称引脚), 一般沟通的是电压信息
引脚有两大工作模式:
| 输入 | 输出 |
|---|---|
GPIO_Mode_IPD 下拉输入 |
GPIO_Mode_Out_PP 推挽输出 |
GPIO_Mode_IPU 上拉输入 |
GPIO_Mode_Out_OD 开漏输出 |
GPIO_Mode_IN_FLOATING 浮空输入 |
GPIO_Mode_AF_PP 复用推挽输出 |
GPIO_Mode_AIN 模拟输入 |
GPIO_Mode_AF_OD 复用开漏输出 |
一张很好的示意图 - 接下来我们就这张图展开讲解:
GPIO_Mode_IN_FLOATING
浮空输入
浮空输入模式下
- I/O端口的电平信号直接进入输入数据寄存器
在I/O端口悬空(在无信号输入): 输入端的电平是不确定的- I/O的电平状态完全由外部输入决定, 是不确定的
GPIO_Mode_IPU 上拉输入
上拉输入模式下
- 上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器
- 在I/O端口
悬空(在无信号输入): 输入端的电平保持在高电平 - 在I/O端口
输入低电平: 读取到的电平是低电平
GPIO_Mode_IPD 下拉输入
下拉输入模式下
- 下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器
- 在I/O端口
悬空(在无信号输入): 输入端的电平保持在低电平 - 在I/O端口
输入高电平: 读取到的电平是高电平
GPIO_Mode_AIN 模拟输入
模拟输入模式下
- 模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块, 比如ADC模块, 而不经过输入数据寄存器
GPIO_Mode_Out_OD
开漏输出
开漏输出模式下
- 开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值, 途经N-MOS管,最终输出到I/O端口, 而 P-MOS 管始终保持关闭
- 当设置
输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由设置值决定,而是由I/O端口外部的上拉或者下拉决定 - 当设置
输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平 - 同时, I/O端口的电平也可以通过输入电路进行读取; 注意, I/O端口的电平不一定是输出的电平
在开漏输出模式下,这个P-MOS是无效的,只有 N-MOS 在工作
数据寄存器为1时: 下管断开,这时输出相当于断开,也就是高阻模式数据寄存器为0时: 下管导通,输出直接接到VSS,也就是输出低电平这种模式下, 只有低电平有驱动能力, 高电平是没有驱动能力的
- 这个开漏模式可以作为通信协议的驱动方式,如I2C通信的引脚,就是使用开漏模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰
- 另外开漏模式还可以用于输出 5V 的电平信号,比如在IO口外接一个上拉电阻到5V电源,当输出低电平时,由内部的 N-MOS 直接 接VSS, 当输出高电平时, 由内部的上拉电阻拉高至5V, 这样就可以输出5V的电平信号, 用于兼容一些 5V 电平的设备, 这就是开漏输出的主要途
GPIO_Mode_AF_OD
复用开漏输出
复用开漏输出模式下
- 与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的
GPIO_Mode_Out_PP
推挽输出
推挽输出模式下
- 通过设置位设置/清除寄存器或者输出数据寄存器的值, 途经 P-MOS 管和 N-MOS 管, 最终输出到I/O端口
- 当设置
输出的值为高电平的时候, P-MOS 管处于开启状态, N-MOS管处于关闭状态, 此时I/O端口的电平就由P-MOS管决定: 高电平 - 当设置
输出的值为低电平的时候, P-MOS管处于关闭状态, N-MOS管处于开启状态, 此时I/O端口的电平就由N-MOS管决定: 低电平 - 同时, I/O端口的电平也可以通过输入电路进行读取; 注意, 此时I/O端口的电平一定是输出的电平
在推挽输出的模式下,P-MOS和N-MOS均有效
数据寄存器为1时: 上管导通, 下管断开, 输出直接接到VDD, 就是输出高电平数据寄存器为0时: 上管断开, 下管导通, 输出直接接到VSS, 就是输出低电平这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也叫做强推输出模式 在推挽输出模式下,STM32对IO口具有绝对的控制权,低电平都是由STM32说的算
GPIO_Mode_AF_PP
复用推挽输出
复用推挽输出模式下
- 与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

















