AFVN越南通讯网

1 STM32结构体,GPIO原理

18浏览 1天前 数码 MA111402

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)

未经作者允许,禁止转载
#STM32 #单片机
2