STM32学习从入门到摆烂--GPIO(学习的是B站铁头山羊)

2.1什么是GPIO?

        GPIO=General   Purpose   Input/Output即为通用目的输入输出。

2.2GPIO的寄存器组

       寄存器组:寄存器是CPU与模块之间通信的工具,CPU通过读写寄存器从而控制模块实现具体功能,而寄存器组就是有很多个寄存器。

 

GPIO的寄存器组由GPIOx_CR(配置寄存器)GPIOx_IDR(输入数据寄存器)和GPIOX_ODR(输出数据寄存器)组成。

2.3GPIO的八种工作模式

四个分类标准:输出与输入;通用与复用;推挽和开漏;上拉、下拉和浮空;

输出:输出推挽,输出开漏,复用推挽,复用开漏。

输入:输入上拉,输入下拉,输入浮空,模拟模式。

问题:为什么输入模式无通用复用之分?

  1. 功能单一

    • GPIO引脚在输入模式下的主要功能是读取外部信号的状态(高或低)。因此,输入模式的设计通常是为了简化电路和逻辑,直接连接到外部设备或传感器。
  2. 硬件设计

    • 在硬件层面,GPIO引脚的输入模式通常是通过内部电路(如输入缓冲器)直接连接到引脚,而不需要额外的复用逻辑。这降低了设计的复杂性和功耗。
  3. 信号完整性

    • 输入引脚的信号完整性非常重要。如果引脚被设计为复用,可能会引入额外的延迟和干扰,从而影响输入信号的准确性。
  4. 配置简化

    • 输入模式的GPIO通常不需要复杂的配置。复用功能通常涉及多个外设和复杂的时序控制,而输入模式的GPIO则可以通过简单的读操作来获取状态。
  5. 资源限制

    • 在一些微控制器或单片机中,GPIO引脚的数量是有限的。设计时可能会优先考虑将引脚用于特定功能,而不是复用。
  6. 应用场景

    • 在许多应用中,GPIO的输入模式主要用于开关、传感器等简单输入,复用的需求相对较少。

推挽:由两个mos管连接着gpio口,上面是P-MOS下面是N-MOS,两个MOS管交替导通,当输出低电平(0),N闭合P断开,反则反之。

开漏:由两个mos管连接着gpio口,上面是P-MOS下面是N-MOS,P-MOS管始终断开,当输入0(低电平)时,N-MOS管闭合,GPIO口输出低电平,当输出1(高电平)时,GPIO口输出高阻抗(两个MOS管都断开)。

上拉下拉浮空针对的是输入模式。

 上拉输入:当GPIO口悬空的时候,稳定的给它一个高电压。

下拉输入:当GPIO口悬空的时候,稳定的给它一个低电压。

模拟输入:ADC外部的模拟信号转换为数字信号。

八种工作模式的英文名:

输出推挽模式        Output Push-pull

输出开漏模式        Output Open-drain

复用推挽模式        Alternate  Function Push-Pull

复用开漏模式        Alternate  Function Open-drain

输入上拉模式       Input   Pull-up

输入下拉模式       Input  Pull-down

输入浮空模式       Input  Floating

模拟模式    Analog

2.4IO的最大输出速度

最大输出速度:IO允许输出电平的最大切换频率。

三个等级:2MHz,10MHz,50Mhz。

实际使用时选择满足要求的最小值。

2.5GPIO的内部结构

施密特触发器原理:输出要么是0要么是1,对于输入负向递减和正向递减有不同的门限,即输入低于或者高于一定程度的时候输出才会变成0或1,可以对输入信号做一个滤波,免除噪声信号的干扰

### 关于 STM32铁头山羊项目的概述 铁头山羊作为一位专注于嵌入式开发的教学博主,其教程涵盖了多个 STM32 的外设及其实际应用场景。以下是基于提供的引用内容以及相关知识整理的一些典型项目示例。 #### 1. **SPI 外设的应用** 通过 SPI(Serial Peripheral Interface),可以实现主机与从设备之间的高速串行通信。在铁头山羊的 SPI 教程中提到的内容[^1],可以通过 HAL 库来配置和操作 SPI 接口。例如,在 LCD 显示屏驱动或者外部存储器扩展场景下,SPI 是一种常见的解决方案。 ```c // 初始化 SPI 设备 void MX_SPI1_Init(void) { hspi.Instance = SPI1; hspi.Init.Mode = SPI_MODE_MASTER; hspi.Init.Direction = SPI_DIRECTION_2LINES; hspi.Init.DataSize = SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.CLKPhase = SPI_PHASE_1EDGE; HAL_SPI_Init(&hspi); } ``` 上述代码展示了如何利用 HAL 库初始化 SPI1 接口,并将其设置为主模式。 --- #### 2. **Flash 存储功能** 对于需要保存非易失性数据的情况,STM32 提供了内部 Flash 编程接口。根据引用中的定义 `#define FLASH_START_ADDR 0x0801F000`[^2],可以从指定地址开始写入数据到 Flash 中。这通常用于固件升级、参数持久化等功能。 ```c #include "stm32f1xx_hal.h" #define DATA_TO_WRITE (uint32_t)0xDEADBEEF #define PAGE_SIZE 1024U void WriteToFlash(uint32_t address, uint32_t data) { HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR); if(HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data)) Error_Handler(); HAL_FLASH_Lock(); } WriteToFlash(FLASH_START_ADDR, DATA_TO_WRITE); ``` 此代码片段实现了向特定 Flash 地址写入一个字的数据的功能。 --- #### 3. **I²C 协议支持** I²C(Inter-Integrated Circuit)是一种广泛使用的低速率同步总线协议,适用于连接传感器或其他外围模块。依据提供的 I²C 配置方法[^3],可以轻松完成硬件引脚分配及时序调整工作。 ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); ``` 以上代码完成了 PB8 和 PB9 引脚针对 I²C1 功能的重新映射及初始化过程。 --- #### 4. **综合案例——温湿度监测系统** 结合上述技术要点,设计一款基于 DHT11 温湿度传感器的小型环境监控装置成为可能。具体来说: - 使用 SPI 或 UART 实现与传感器间的数据交换; - 将采集到的结果存入 Flash 并定期上传至云端服务器; - 如果涉及多路信号处理,则可借助 I²C 扩展更多输入通道。 这种类型的项目不仅能够锻炼开发者对外设的理解能力,还具备一定的实用价值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值