目录
GPIO的作用
General Purpose Input Output,通用输入输出端口,通过写软件来控制
1、作为输出引脚,控制LED灯的亮灭
GPIO电平的控制:最终变成了向这个GPIO的硬件寄存器写入数据,硬件的状态会跟随寄存器的数据改变而改变。
GPIO配置
伪代码:
配置某一个IO口为通用推挽输出模式所需要的GPIO寄存器
{
1.对应位的MODER配置为01——————————通用输出
2.对应位的OTYPER配置为0——————————推挽输出
3.对应位的OSPEEDR配置为(01)—————25Mhz中速(这个不一定,按照自己的需求)
4.对应位的PUPDR配置为00——————————无上下拉
5.对应位的ODR 配置为0——————————输出低电平; 配置为1——————————输出高电平
}
GPIO输出流程
-
启用GPIO时钟:首先,需要启用相应GPIO端口的时钟,以便能够对GPIO进行配置和控制。通过在RCC寄存器中启用相应的GPIO时钟。
-
配置GPIO引脚:使用
GPIO_Init()
函数配置GPIO引脚的模式(输出模式)、速度、上拉/下拉等参数。通常需要指定引脚号、模式、速度、上拉/下拉方式等。 -
控制GPIO输出:使用
HAL_GPIO_WritePin()
函数控制GPIO的输出电平,可以将引脚设置为高电平(GPIO_PIN_SET)或低电平(GPIO_PIN_RESET)。 -
控制输出电平:根据应用需求,可以定时或根据条件更改GPIO引脚的输出电平,从而控制连接的外部设备或器件。
// 启用GPIO时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
// 配置GPIO引脚
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0; // 配置为输出引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 控制GPIO输出
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 设置引脚为高电平
用于将GPIO的输出状态与硬件寄存器的特定位相关联,以实现更底层的控制。可能需要使用指针和位操作来确切地控制寄存器的位。这个操作通常是在需要直接操作硬件寄存器的情况下进行,以执行更精细的控制或配置。
启用GPIO时钟:首先,需要启用相应GPIO端口的时钟,以便能够对GPIO进行配置和控制。通过在RCC寄存器中启用相应的GPIO时钟。
配置GPIO引脚:使用GPIO_Init()函数配置GPIO引脚的模式(输出模式)、速度、上拉/下拉等参数。通常需要指定引脚号、模式、速度、上拉/下拉方式等。
控制GPIO输出:使用HAL_GPIO_WritePin()函数控制GPIO的输出电平,可以将引脚设置为高电平(GPIO_PIN_SET)或低电平(GPIO_PIN_RESET)。
访问硬件寄存器:在需要控制硬件寄存器时,可以通过操纵硬件寄存器的位来实现。硬件寄存器的访问可能需要使用指针和位操作进行。
修改硬件寄存器位:根据需要,将GPIO的输出电平状态与硬件寄存器的特定位关联,以控制硬件逻辑。
2、输入中断信号
通过适当配置GPIO输入中断信号,可以实现灵活的外部事件触发机制。
当满足预设的条件时,比如引脚状态发生变化或特定信号到达时,将触发中断请求,处理器会停止当前执行的任务,转而执行与该中断相关的中断服务程序。
这种机制允许处理器在没有轮询GPIO状态的情况下,即在等待外部事件发生的同时继续执行其他任务。
通过GPIO输入中断信号,可以实现以下功能:
-
外部事件响应:通过监控GPIO输入引脚状态变化,实现对外部事件的实时响应,例如按键点击、传感器信号变化等。
-
节省处理器资源:在等待外部事件时,通过中断方式处理GPIO输入信号,避免了持续轮询GPIO状态,节省了处理器资源。
-
实现实时任务调度:通过确定中断优先级和处理顺序,可以实现不同优先级的中断服务程序,实现实时任务的调度和响应。
GPIO输入中断信号的流程通常包括以下步骤:
-
初始化GPIO引脚作为输入:首先,需要将相应的GPIO引脚配置为输入模式,以便接收外部信号。通过设置引脚模式为输入模式、上拉/下拉配置等来初始化GPIO引脚。
-
配置外部中断触发条件:通过设置外部中断触发条件,确定何种事件触发中断,例如上升沿、下降沿、上升/下降沿、低电平、高电平等。这一步骤通常是通过配置寄存器(比如EXTI寄存器)来实现的。
-
注册中断服务程序:编写中断服务程序(中断处理函数),用于处理GPIO输入中断触发后的操作。在初始化时,需要注册相应的中断处理函数,以便在中断发生时执行。
-
使能外部中断线(EXTI):通过使能相应的外部中断线(EXTI),使系统能够监测GPIO引脚上的外部事件,并触发中断请求。
-
处理中断:当配置的外部中断触发条件满足时,系统会产生中断请求。此时,处理器会暂停当前任务,执行注册的中断服务程序来处理中断事件。
-
中断服务程序执行:在中断服务程序中,可以执行与GPIO输入中断相关的操作,比如读取引脚状态、记录事件发生时间、向其他任务发送信号等。
-
清除中断标志:在中断服务程序执行完成后,需要清除相应的中断标志,以使处理器能够继续正常执行主任务。
TBD--外设等复杂操作
GPIO除了简单的输入输出之外,还可以做一些相对复杂的操作,例如模拟I2C或SPI数据线、ADC电压检测、输出PWM波形等。
这些功能有些可以直接配置成硬件接口,也可以通过软件来模拟波形。
输入输出模式
1、4种输入模式
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟输入
-
输入浮空(Input Floating):
- 特点:当引脚未连接到外部信号时,处于浮空状态。
- 应用:适用于接收正常的数字输入信号,典型情况是通过外部设备或传感器驱动GPIO引脚。
-
输入上拉(Input Pull-up):
- 特点:引脚在未连接外部信号时被上拉到高电平(逻辑“1”)。
- 应用:当外部设备未驱动引脚时,引脚保持高电平。
- 按下接地,松开高电平,使能内部上拉电阻
-
输入下拉(Input Pull-down):
- 特点:引脚在未连接外部信号时被下拉到低电平(逻辑“0”)。
- 应用:当外部设备未驱动引脚时,引脚保持低电平。
- 外部上下拉
- 内部:按下接地,松开高电平,使能内部上拉电阻
-
模拟输入(Analog Input):
- 特点:允许引脚接收模拟信号,用于模拟输入采样。
- 特殊要求:可能需要额外的ADC(模数转换器)设置和处理。
- 得到原始输入
施密特触发器:
避免抖动
2、4种输出模式
- 推挽输出
- 开漏输出
- 复用推挽输出
- 复用开漏输出
-
推挽输出(Push-Pull Output):
- 特点:引脚可输出高或低电平,可提供驱动能力。
- 应用:用于控制外部电路,例如驱动LED、驱动电机等。
- 想输出1时,把场效应管电压推导VDD,想输出0时,把场效应管电压推到VSS
-
开漏输出(Open Drain Output):
- 特点:引脚只能拉低,拉高时需外部上拉电阻。
- 应用:通常与外部上拉电阻一起用于实现总线结构,如I2C通信。
- 双向通信
- P-MOS悬空
- 开漏输出步骤,IIC会用
-
复用推挽输出(Alternate Function Push-Pull Output):
- 特点:引脚同时具有复用功能,可以用作其他功能(例如定时器输出)。
- 应用:在相同引脚上实现多种功能共享,节省IO资源。
-
复用开漏输出(Alternate Function Open Drain Output):
- 特点:引脚即可提供开漏输出,也能兼具复用功能。
- 应用:兼顾开漏输出的特性和复用功能,适用于特定应用场景。
操作GPIO
配置寄存器CRL(0~7),CRH(8~15)
读写寄存器:IDR/ODR/BSRR