一、GPIO的基本介绍
(1) 整体框图

左侧片内部分

左侧芯片外部

(2) 保护二极管
1.二极管是半导体材料,单向导电
2.当进入的电平是高电平的时候,将超过正常电流的电压分流到VCC当中,这样的话,芯片内部就不会收到高于VCC的电平,起到了保护芯片的作用;
3.当进入的电平是低电平的是以后,将低于VSS的电平给阻隔掉,将0V的低电平传入到芯片中,保证接入的低电平不是负电平。
4.如果接入的电平过高也会将芯片烧掉,属于是弱保护,不能过渡依赖。
二、输入部分
图示

上拉电阻
可以将低电平上拉(弱上拉),主要在IO空闲时确定状态,不然就是浮空模式,设置IO空闲时为高电平,主要用于初始化IO状态;
下拉电阻
可以将高电平下拉(弱下拉),可以将高电平下拉(弱下拉),主要是在IO空闲时确定状态的,不然就是浮空模式,设置IO空闲时为低电平,主要用于初始化IO状态。
肖特基触发器
作用:可以将不规律的波形转化为有规律的方波
特点:当输入的电压高于正向阈值电压,输出为高;
当输入的电压低于负向阈值电压,输出为低;
当输入的电压在正向和负向阈值之间,输出不变。
三、输出部分P-MOS管和N-MOS管
图示:

导通条件:P-MOS(N-MOS)管导通条件是进入P-MOS(N-MOS)管的电压和VDD(VSS)不一致
四、八种工作模式
通用输入模式
1.输入浮空
浮空模式就是既不上拉也不下拉电阻,MOS管不导通,肖特基触发器打开,可以任意输入到IDR寄存器中电平是不确定,这种模式一般不使用。
2.输入上拉
上拉电阻接通,肖特基触发器打开,输出被禁止;
IO空闲的时候如果要向CPU写入高电平,就使用输入上拉即可。。
3.输入下拉
下拉电阻接通,肖特基触发器打开,输出被禁止;
IO空闲的时候如果要向CPU写入低电平,就使用输入下拉即可。
通用输出模式
4.开漏输出
开漏模式下只有N-MOS管工作,P-MOS是停止工作的,ODR输出为0的时候,N-MOS导通,输出低电平,ODR输出为1的时候N-MOS不导通。

开漏模式下只能向外输出低电平(如果有外接上拉电阻,其实也可以输出高电平)。
5.推挽输出
推挽模式下P-MOS管和N-MOS都可以导通,当ODR寄存器输出一个低电平的时候,N-MOS导通向外输出低电平,当ODR寄存器输出一个高电平,P-MOS管导通,向外输出高电平。
复用功能
复用功能和通用输出两个情况基本相同,
唯一的区别:通用模式下输出控制信号由ODR来提供,复用功能是由片上外设提供的
6.开漏输出
开漏模式下只有N-MOS管工作,P-MOS是停止工作的,ODR输出为0的时候,N-MOS导通,输出低电平,ODR输出为1的时候N-MOS不导通。
开漏模式下只能向外输出低电平(如果有外接上拉电阻,其实也可以输出高电平)。
7.推挽输出
推挽模式下P-MOS管和N-MOS都可以导通,当ODR寄存器输出一个低电平的时候,N-MOS导通向外输出低电平,当ODR寄存器输出一个高电平,P-MOS管导通,向外输出高电平。
8.模拟输入
模拟输入模式上下拉电阻不用、输出被禁止,肖特基触发器关闭;
模拟输入只在ADC/DAC上使用。
五、led灯的电路图
图示

解释:由电路图可知,如果想要点亮一个LED灯,就需要给PB5~PB7三个引脚中的任何一个传递一个高电平,如果要熄灭就传递低电平。
六、通用外设驱动的方式主要有三步
1、时钟设置、参数设置
2、读函数,从外设读取数据
3、写函数,像外设来写入数据
七、GPIO配置步骤
1、使能使用
用__HAL_RCC_GPIOx_CLK_ENABLE(),其中x代表要选择哪一组GPIO口来操作,当前电路板上的LED使用的是PB引脚,所以使能函数就是
__HAL_RCC_GPIOB_CLK_ENABLE()
2、设置工作模式
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
参数1:GPIO_TypeDef *GPIOx
GPIO_TypeDef *是一个结构体指针,这里直接传GPIOB即可,因为HAL库中将GPIOB的地址宏定义成了GPIOB,所以直接使用
参数2:GPIO_InitTypeDef *GPIO_Init
四个成员:
pin:设置GPIO引脚的
mode:设置工作模式
pull:设置电阻上下拉
speed:速度速度设置越高,GPIO驱动电路的响应速度越快,信号跳变(从高到低或者从低到高)的边沿更加陡峭(即上升和下降的时间更短),反之低速下就更加缓和。
低速模式:适用于led、按键、低速传感器等简单的数据信号,无需快速响应
高速模式:适用于SPI、I2C、USART的等外设需要高频PWM信号,确保信号边沿能满足时序要求。
速度只在输出模式下生效,输入模式无影响
3、设置输出状态
HAL_GPIO_WritePin() // 设置GPIO引脚的状态
参数1:选择哪一组GPIO
参数2:选择具体的GPIO PIN脚,比如GPIO_PIN_6
参数3:确定输出的电平应该高电平还是低电平
GPIO_PIN_SET:设置为高电平
GPIO_PIN_RESET:设置为低电平
八、代码区域
led.h
#ifndef LED_H
#define LED_H
#include "stm32f1xx.h"
//定义led端口和引脚
#define LED_PORT GPIOB
//查看芯片上的引脚,来定义引脚
#define LED2_PIN GPIO_PIN_5
#define LED3_PIN GPIO_PIN_6
#define LED4_PIN GPIO_PIN_7
//定义宏名 来led灯传递高低点评
#define led2(a) (a?HAL_GPIO_WritePin(LED_PORT,LED2_PIN,GPIO_PIN_SET):HAL_GPIO_WritePin(LED_PORT,LED2_PIN,GPIO_PIN_RESET))
#define led3(a) (a?HAL_GPIO_WritePin(LED_PORT,LED3_PIN,GPIO_PIN_SET):HAL_GPIO_WritePin(LED_PORT,LED3_PIN,GPIO_PIN_RESET))
#define led4(a) (a?HAL_GPIO_WritePin(LED_PORT,LED4_PIN,GPIO_PIN_SET):HAL_GPIO_WritePin(LED_PORT,LED4_PIN,GPIO_PIN_RESET))
#define led2Toggle HAL_GPIO_TogglePin(LED_PORT,LED2_PIN);
#define led3Toggle HAL_GPIO_TogglePin(LED_PORT,LED3_PIN);
#define led4Toggle HAL_GPIO_TogglePin(LED_PORT,LED4_PIN);
void LED_Init();
#endif
led.c
#include "led.h"
void LED_Init(){
//使能时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
//初始化结构体
GPIO_InitTypeDef LEDInit = {0};
//定义led引脚
LEDInit.Pin = LED2_PIN | LED3_PIN | LED4_PIN;
//设置输出模式是推挽
LEDInit.Mode = GPIO_MODE_OUTPUT_PP;
//不需要设置上下拉
//设置速度
LEDInit.Speed = GPIO_SPEED_FREQ_LOW;
//调用初始化函数
HAL_GPIO_Init(LED_PORT,&LEDInit);
}
main.c
#include "stm32f1xx.h"
#include "led.h"
typedef uint8_t u8;
typedef uint32_t u32;
void delay(u32 times){
int i;
for(i = 0 ; i < times ; i++ );
}
int main(){
HAL_Init();
LED_Init();
while(1){
led2Toggle;
delay(10000);
}
return 0;
}
2088

被折叠的 条评论
为什么被折叠?



