GPIO是“General Purpose Input/Output”的英文缩写,中文翻译为“通用输入输出”。GPIO是一种用于与外部设备进行通信的物理引脚接口。GPIO可以在不同的嵌入式系统上具有不同的功能,例如作为输入引脚接收信号,或作为输出引脚发送信号。
通用性:GPIO可以灵活配置为输入或输出,并且可以根据应用需求进行重新配置。
数字信号:GPIO的信号通常是数字信号,即高电平(1)或低电平(0)。
多功能:同一个GPIO可以具有多种不同的功能,例如输入、输出、中断等。
可编程性:某些嵌入式系统允许通过编程方式对GPIO进行配置和控制,以满足特定的应用需求。
GPIO引脚在嵌入式系统中重要的作用是实现stm32与各种外部硬件之间的连接和数据交互,负责外部器件的信息和控制外部器件工作,例如传感器、执行器、显示器、通信模块等。
负责芯片内部的控制单元与外部相应外设的连接。 引脚其实本质上就是一根电线。
1)引脚可以输入/输出一个电平信号(1/0)
这个电平信号是对于CPU来说的,因为CPU只能识别 0/1
2)引脚可以输入/输出一个高低电压。
因为对于外部电路来说,外部电路的工作是采用的模拟电信号(电压值)。
不同MCU,GPIO口的引脚数量不同 。
GPIO分为输出和输入两种模式,两种模式又分别对应一下方式:
输入:
信号从IO脚输入,经过保护电路后进入GPIO内部,然后进入上下拉电路,然后分成两部分,上面的是模拟输入(ADC/DAC),下面再分为两部分,上面是复用输入至片上外设,下面进入输入寄存器(IDR),CPU就能读取其中的信号获得信息。
四种输出方式:
(1)推挽输出:可以输出高、低电平,连接数字器件,驱动能力强,25mA(MAX),通用输出。上下拉电阻关闭,施密特触发器打开,ODR对应位写0时,NMOS管导通,输出低电平,写1则PMOS管导通,输出高电平。
(2)开漏输出:
输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。
(3)复用推挽输出(4)复用开漏输出:
复用推挽,复用开漏可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
输出:
如果需要输出高电平,就使PMOS管导通,从VDD接进高电平输出3.3V,如果需要输出低电平就使NMOS管导通将VSS(0V)导通至外部。上面的是连接输出寄存器(ODR),可以通过对位清除寄存器(BSRR)对ODR进行读写,也可以直接进行读写操作,然后进行二选一选择器,再进入输出控制器。
四种输入方式:
(1)浮空输入:浮空输入一般多用于外部按键输入,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况(高阻态)下,读取该端口的电平是不确定的。
(2)上拉输入:用内部上拉,默认为高电平。使用上拉电阻,下拉电阻关闭,施密特触发器打开,模拟输入关闭,引脚悬空时,IO呈现高电平。
(3)下拉输入:
用内部下拉,默认为低电平。使用下拉电阻,上拉电阻关闭,施密特触发器打开,模拟输入关闭,引脚悬空时,IO呈现低电平。
(4)模拟输入:
上下拉电阻关闭,施密特触发器关闭,模拟输入打开,专门用于模拟信号输入
GPIO中断,指有GPIO模块产生的中断,有边沿触发中断或者电平翻转中断。GPIO模块能检测到引脚上的值是0还是1,并能通过外部拓展将电平从变为1或是从1变到0。CPU接收外部的中断请求,并进行处理,是一个被动接受的过程,这样能保证主任务的执行效率,又能及时获取外部请求,从而处理重要的设备请求中断。当GPIO模块检测到管脚电平变化且满足中断触发条件,就会触发中断,CPU会跳转到中断处理地址进行中断处理,为了避免破坏主任务数据,CPU会处理保存当前相关寄存器并进入中断服务函数,执行完中断服务函数后,CPU会恢复相关寄存器,回到主任务继续执行程序。
在STM32控制器中,GPIO模块内包含寄存器和驱动器:
GPIO模块内部有多个寄存器,用于控制GPIO口的工作模式、电平状态、中断控制等。常见的GPIO寄存器包括GPIOx_MODER、GPIOx_ODR、GPIOx_IDR、GPIOx_BSRR等。这些寄存器可以通过编程来进行配置和控制。
GPIO模块内部的驱动器用于控制GPIO口的电平状态。在STM32控制器中,GPIO口可以输出高电平、低电平或者高阻态,驱动器可以根据寄存器的配置来控制GPIO口的电平状态。常见的GPIO驱动器包括CMOS、TTL等。(STM32是32位的单片机,故STM32内部的寄存器都是32位的,由于端口只有16位,所以寄存器只有低16位对应的有端口,高16位无用)
寄存器和驱动器是GPIO模块内部的两个重要组成部分,它们共同实现了GPIO口的各种功能。通过对GPIO寄存器的配置,可以实现GPIO口的输入、输出、中断控制等操作;通过GPIO驱动器的控制,可以实现GPIO口的电平状态控制。
通过配置GPIO引脚为输出模式,设置不同的输入电平和触发方式,以此达到控制蜂鸣器。
例如STM32中的应用:
// 配置GPIO引脚为输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 控制蜂鸣器发声
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // 产生声音
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // 停止声音
通过配置GPIO引脚为输出模式,设置不同输出电平,由此达到控制LED灯的点亮熄灭等功能。
例如STM32中的应用:
// 配置GPIO引脚为输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 控制LED灯亮灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED灯
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // 熄灭LED灯
除此之外,在STM32控制器中,GPIO口的应用非常广泛。比如,可以使用GPIO口来控制控制继电器的闭合、读取传感器的数据等。同时,GPIO口也可以广泛应用于通信领域,如SPI、I2C、USART等串行通信控制等。其中,GPIO口的引脚复用功能可以实现多重功能,如CAN总线、PWM输出等特殊功能。
综上所述,GPIO是STM32控制器中的一个重要设备,这种通用输入输出口具有可编程性强、电压适应性好、可配置性高、高速性能等特点,在系统设计中具有广泛的应用。相信随着未来科技的不断发展,未来GPIO会有更广阔的应用。
(此文仅是本人一些粗浅的认识与引用,如有错误,烦请指正!)