1 STM32结构体,GPIO原理
1. RCC ->APB2ENR 结构体开发原理
RCC -> APB2ENR = 0x0 //给AP2ENR寄存器赋值
#define RCC ((RCC_TypeDef *) RCC_BASE) //RCC的宏定义
((RCC_TypeDef *) RCC_BASE)//结构体指针指向 RCC的基地址
RCC_TypeDef *
//下面是RCC_TypeDef * 类型的定义, RCC_TypeDef结构体变量是连续的;
#define __IO volatile
//volatile是不让系统修改代码
typedef struct
{
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
#ifdef STM32F10X_CL
__IO uint32_t AHBRSTR;
__IO uint32_t CFGR2;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
uint32_t RESERVED0;
__IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */
} RCC_TypeDef;
RCC_BASE
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
2. 通过取反移位与 置位寄存器
源码探究:通过结构体封装该用的寄存器,通过Structural Pointer调用。
要将寄存器的某一位设置为1,就使用按位或 |= 配合 (1 << 位数) 的掩码;要将其设置为0,则使用按位与和取反 &=~ 配合相同的掩码。
3. 2[arr] 与 arr[2]
在C语言中,由于数组索引 a[i] 本质上是 *(a + i) 的语法糖,而加法可以交换,因此 a[i] 和 i[a] 是完全等价的。
4. 第一个正式寄存器写法
寄存器写法:
利用预定义的宏(Macro)来替代具体的数值和位,使用位掩码(Bitmask)和位运算(|=用于置位,&=~用于复位)来精确修改寄存器中的特定比特,从而在不影响其他位状态的情况下完成对硬件功能的配置。
5. GPIO概述
STM32F103ZET6共有7组GPIO端口,他们分别是GPIOx(x从A-G),每组控制16个引脚,内含7个寄存器,共有112个GPIO引脚。
GPIO寄存器总览
这款32当中的GPIO,每个IO都可以作为外部中断,支持8种工作模式。
5.1.1. 输入模式 (Input Modes)
模拟输入 (Analog Input): 关闭所有数字电路,忠实传递原始电压,专供ADC采样。
浮空输入 (Floating Input): 电平完全由外部决定,内部无任何上拉或下拉,真实反映外部状态但易受干扰。
上拉/下拉输入 (Pull-up/Pull-down Input): 内部自带电阻将引脚钳位到默认高或低电平,有效防止引脚悬空。
5.1.2. 输出模式 (Output Modes)
通用推挽输出 (General-purpose Push-pull Output): 既能强力输出高电平,也能强力拉到低电平,驱动能力强,速度快。(通用的含义是芯片内核输出的高低电平)
通用开漏输出 (General--purpose Open-drain Output) : 只负责拉低电平,不主动输出高电平(需靠外部上拉),常用于实现多设备“线与”逻辑。(通用的含义是芯片内核输出的高低电平)
复用功能推挽输出 (Alternate Function Push-pull Output): 引脚控制权交给片上外设(如串口TX),由外设来驱动推挽输出。(复用的含义是片内外设输出的高低电平)
复用功能开漏输出 (Alternate Function Open-drain Output): 引脚控制权交给片上外设(如I²C),由外设来驱动开漏输出,以满足特定通信协议。(复用的含义是片内外设输出的高低电平)
PS:推挽输出能主动驱动高、低两种电平,像一只手既能推也能拉;而开漏输出只负责把电平拉低,想变高必须依靠外部的另一个“拉力”(上拉电阻)。
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问。
输出模式下可以控制端口输出高电平低电平,用于驱动LED、蜂鸣器等(PS:此款32芯片输出/输入最大电流25mA),如果是大功率器件(比如电机),还需要加上驱动器(小电流控制大电流)。
输入模式下可以读取端口的高低电平,用于读取外接按键、外接模拟信号的输入、ADC电压采集、模拟通信协议接受数据等。
6. 推挽or开漏输出:从左向右看图片
6.1. 推挽输出:
涉及BSRR和ODR和IDR寄存器,注意“输出控制”会取反,注意图片P-MOS的非门移动到输出控制中心。
BSRR和ODR都可以输出值到输出控制中心,如果是1那么N-MOS会导通,输出到IDR为1.
6.2. 开漏输出:
涉及BSRR和ODR和IDR寄存器,注意“输出控制”会取反,注意图片P-MOS的非门移动到输出控制中心。
说明手册图片如下:
注意“输出控制”存在非门,并且那个小圆圈不代表一个独立的非门,但它的含义确实是“反相”或“低电平有效”。
7. 推挽输出和开漏输出的选择
7.1. 使用推挽输出的优点
驱动能力需求较高的场合。
解释:推挽输出内部有专门的晶体管负责将电平“推”到高(VCC)和“拉”到低(GND)。这意味着它能提供较大的输出电流,可以直接驱动像LED灯这样的负载,或者为后续电路提供一个强劲、稳定的信号源。
高速信号传输。
解释:由于是主动推和拉,电压的上升和下降速度都非常快,信号边沿陡峭。这对于高频信号至关重要,可以确保信号波形不失真,从而实现可靠的高速数据传输(例如SPI、USART通信)。
无需共用信号线的场合。
解释:这是推挽输出的一个使用限制。由于它会强行输出高电平或低电平,如果将两个推挽输出口连接在一起,当一个输出高电平而另一个输出低电平时,就会造成电源和地之间的短路,可能会烧毁芯片。因此,推挽输出适用于点对点的连接。
7.2. 使用开漏的优点
多个设备共用信号线。
解释:这是开漏输出最经典的应用。多个开漏引脚可以安全地连接到同一根线上。任何一个设备想发送“0”,就将线路拉低。只有当所有设备都停止拉低(即都想发送“1”)时,线路才会通过外部的上拉电阻恢复到高电平。这就是著名的“线与 (Wired-AND)”逻辑,像I²C这样的通信总线就是基于此原理。
不同电压系统之间的接口。
解释:这是一个非常巧妙的应用。比如,一个3.3V的单片机要和一个5V的设备通信。可以将单片机的I/O口设为开漏输出,然后将上拉电阻接到5V的电源上。这样,当单片机输出低电平时,线路被拉到GND(0V);当单片机不输出(高阻态)时,线路被上拉电阻拉到5V。如此一来,就实现了从3.3V系统到5V系统的安全电平转换。
需要外部上拉电阻来确定逻辑高电平的场合。
解释:这一点既是开漏输出的一个特点,也是一个选择它的原因。在某些设计中,我们可能希望灵活地控制高电平的电压值(通过改变上拉电阻连接的电源),或者控制信号的上升速度(通过调整上拉电阻的阻值)。开漏输出提供了这种设计的可能性。
8. 输入模式:从右向左看图片
8.1. 上拉/下拉/浮空输入
上拉输入到MCU,V_DD联通。下拉输入到MCU,V_CC联通。
浮空输入到MCU,使用TTL转换成稳定的数字信号。
PS:TTL肖特基触发器的原理,将模拟信号变成数字信号
8.2. 模拟输入:
模拟输入到MCU,交给专门处理模拟信号的片内外设进行处理。
9. 课外要求
9.1.1. 掌握STM32手册当中的8.2节下的GPIO寄存器,并且前4个必须要记下来。
注意APB2总线下来控制GPIOx(A-G).
注意4Bit来设置一个引脚的工作模式这里是对应的0-7的引脚。
注意4Bit来设置一个引脚的工作模式这里是对应的8-15的引脚。
对应输入16个引脚的值。
对应输出的16个引脚的值。
一列是一组,对应16个引脚的另外一种输出方式,一般直接使用ODR。但要知道这个寄存器的作用。
这个是BSRR的阉割版,只用了Rest。
这个是保持引脚工作模式不变的寄存器,注意LCKK,他是两个密码锁大锁装小锁,大锁的写入顺序是10101.
9.1.2. 画出GPIO输入输出构造的图片
10. 英文附录:
LED: Light Emitting Diode
GPIO: General-purpose Input/Output
RCC: Reset and Clock Control
APB2ENR: Advanced Peripheral Bus 2 Enable Register
CRL: Control Register Low
ODR: Output Data Register
Peripherals: 外设 (指集成在微控制器芯片上,用于实现各种特定功能的模块,如通信、定时、转换等)
Flash memory: 闪存 (一种非易失性存储器,程序代码通常存储在这里,断电后数据不丢失)
Kbytes: 千字节 (存储容量单位, 1 Kbyte = 1024 字节)
SRAM: 静态随机存取存储器 (一种易失性存储器,用于在程序运行时存放变量和数据,速度比闪存快,断电后数据会丢失)
FSMC: 灵活的静态存储器控制器 (Flexible Static Memory Controller, 一个外设,用于扩展连接外部存储器,如SRAM, NOR Flash, NAND Flash等)
Timers: 定时器 (用于产生精确的时间延迟或周期性信号的模块)
General-purpose (Timers): 通用定时器
Advanced-control (Timers): 高级控制定时器 (通常功能更强大,常用于电机控制等精密场合)
Basic (Timers): 基本定时器
Comm (Communications): 通信 (指用于与其他设备进行数据交换的各类通信接口)
SPI (I²S): 串行外设接口 (Serial Peripheral Interface) / 集成电路内置音频总线 (Inter-IC Sound)
I²C: 集成电路互联总线 (Inter-Integrated Circuit, 一种常见的串行通信总线)
USART: 通用同步/异步收发器 (Universal Synchronous/Asynchronous Receiver/Transmitter, 常用于实现串口通信)
USB: 通用串行总线 (Universal Serial Bus)
CAN: 控制器局域网络 (Controller Area Network, 一种常用于汽车和工业领域的通信协议)
SDIO: 安全数字输入输出接口 (Secure Digital Input Output, 用于连接SD卡等设备)
GPIOs: 通用输入/输出引脚 (General-purpose Inputs/Outputs, 可由程序配置为输入或输出的引脚)
ADC: 模拟到数字转换器 (Analog-to-Digital Converter, 将模拟信号,如传感器电压,转换为数字信号)
Number of channels: 通道数 (指ADC或DAC可以独立处理的模拟信号路数)
DAC: 数字到模拟转换器 (Digital-to-Analog Converter, 将数字信号转换为模拟电压或电流信号)
CPU frequency: 中央处理器频率 (指芯片内核的工作时钟速度,通常以兆赫兹MHz为单位)
Operating voltage: 工作电压 (芯片正常工作所需的供电电压范围)
Operating temperatures: 工作温度 (芯片能保证正常工作的环境温度范围)
Ambient temperatures: 环境温度
Junction temperature: 结温 (指芯片内部半导体PN结的实际温度)
Package: 封装 (指芯片的物理外壳形式)
LQFP: 薄型四方扁平封装 (Low-profile Quad Flat Package)
WLCSP: 晶圆级芯片尺寸封装 (Wafer-Level Chip-Scale Package)
BGA: 球栅阵列封装 (Ball Grid Array)