Microcontrolador STM32 principiante 3-GPIO explicación detallada

GPIO (entrada/salida de uso general) es una entrada y salida de uso general. GPIO es el periférico más básico del microcontrolador, y cualquier otro periférico es inseparable de GPIO. Este artículo explicará en detalle la estructura interna y el principio de funcionamiento de GPIO, y adjuntará un programa simple para que lo aprendan los principiantes.

A diferencia de la microcomputadora de un solo chip 51 (la microcomputadora de un solo chip 51 puede controlar directamente el nivel alto y bajo del puerto IO escribiendo P0 = 0xff o P0 ^ 1 = 1), la IO de STM32 debe inicializarse y el reloj correspondiente debe ser inicializado antes de su uso, de lo contrario, el puerto IO no tendrá salida.

Primero mire el diagrama de la estructura interna de GPIO (abajo)

 El puerto IO tiene dos rutas, una es de salida (I:in) y la otra es de entrada (O:out).

A la parte que controla la entrada de E/S la llamamos controlador de entrada (como se muestra en el cuadro punteado superior de la figura anterior), que consta de un disparador Schottky y un conjunto de resistencias pull-up y pull-down y sus interruptores de control. Cuando se usa el disparador Schottky para entrada digital (es decir, 1 y 0), mantiene la estabilidad del nivel (no se elaborará el principio), si se usa como entrada analógica, se salta el disparador Schottky. El estado del interruptor y la resistencia pull-up de la derecha depende del modo del puerto IO, que se explicará en detalle a continuación.

De manera similar, a la parte que controla la salida de E/S la llamamos controlador de salida (como se muestra en el cuadro punteado inferior de la figura anterior), que consta de un controlador de salida y dos válvulas MOS (la válvula superior es PMOS, conectada a VCC; la válvula el tubo inferior es NMOS, conectado a GND conectado) composición. El controlador de salida se usa para controlar el estado del interruptor de los dos tubos mos para emitir un nivel alto o bajo, y su estado también depende del modo de IO, que se explicará en detalle a continuación.

El diodo de protección se utiliza para limitar el nivel del puerto IO entre Vss y Vdd.

A continuación, presentaremos en detalle el estado de funcionamiento de GPIO en cada modo.

 El GPIO de STM32 tiene 8 modos (4 tipos de entrada, 4 tipos de salida), como se muestra en la siguiente tabla:

 1. Entrada analógica AIN

En primer lugar, en el modo de entrada (sin importar el modo de entrada), los dos transistores MOS del controlador de salida están todos en estado desconectado.

El modo de entrada analógica se utiliza para convertir el voltaje analógico de 0-3,3 V (3,3 V se basa en el voltaje de la fuente de alimentación del microcontrolador, si el voltaje es de 3,2 V, es de 0-3,2 V) en 0-2^12 (tome STM32F103C8T6 como ejemplo, su ADC es de 12 bits, por lo que es de 0 a 2 a la potencia 12) cantidad digital para uso de CPU. Este modo es necesario para la adquisición de señales analógicas, como la adquisición de temperatura y humedad, adquisición de voltaje y corriente, etc.

 En este modo, los interruptores superior e inferior del controlador de entrada están todos apagados y la ruta analógica se muestra con la flecha en la figura anterior.

El voltaje del IO se ingresa directamente al ADC en el chip.

2. Entrada flotante IN_FLOATING

Este modo se utiliza para la entrada digital y la CPU recopilará el nivel del puerto IO.

En este modo, los interruptores superior e inferior del controlador de entrada están todos desconectados (en este momento, el puerto IO está en una configuración alta, lo que puede considerarse como una desconexión interna entre el IO y el microcontrolador), y la ruta de la señal se muestra con la flecha en la figura anterior. Para facilitar la investigación, el controlador de entrada ahora se simplifica de la siguiente manera.

En este modo, si el puerto de E/S está en estado flotante (es decir, el puerto de E/S no es ni alto ni bajo), el valor recopilado por la CPU también estará en un estado incierto, por lo que este modo de entrada requiere una extracción A externa. Se requiere una resistencia ascendente o descendente para una entrada estable (ver a continuación).

 Para el método de resistencia pull-up externa: cuando se apaga el interruptor, el nivel de E/S se llevará a VCC, que es un nivel alto, y cuando se cierra el interruptor, el E/S se conecta directamente a GND y se fuerza a convertirse en un nivel bajo. (de 1 de 0)

 Para el método de resistencia desplegable externa: cuando el interruptor está apagado, el nivel de IO se llevará a GND, es decir, nivel bajo, y cuando el interruptor está cerrado, IO está directamente conectado a VCC, lo que lo obliga a convertirse en nivel alto. (apagado 0 apagado 1)

La lógica de conmutación de los dos métodos de conexión es justo opuesta. El valor de resistencia de la resistencia pull-up (pull-down) puede ser de 1K-10K (no menos que la corriente de sumidero máxima de VCC/pin).

La función de la resistencia pull-up (pull-down) en ambas conexiones es limitar la corriente cuando el interruptor está cerrado. Sin estas dos resistencias, VCC se cortocircuita directamente a GND cuando el interruptor está cerrado.

3. Tire hacia abajo e ingrese IPD

Este modo es el mismo que el método de resistencia desplegable de entrada flotante, excepto que se omite la resistencia desplegable externa y se utiliza la resistencia desplegable en el chip.

En este modo, el interruptor desplegable en el chip permanece cerrado y el interruptor desplegable permanece abierto.

 Cuando se apaga el interruptor externo, el nivel de IO se llevará a VSS, es decir, a un nivel bajo, y cuando se cierra el interruptor, IO se conecta directamente a VCC, lo que lo obliga a convertirse en un nivel alto. (apagado 0 apagado 1)

4. Tire hacia arriba de la entrada IPU

Este modo es opuesto a la entrada desplegable, y el principio de la conexión de la resistencia pull-up de la entrada flotante es el mismo. Es decir, el interruptor desplegable en el chip permanece cerrado y el interruptor desplegable permanece abierto.

  Cuando se apaga el interruptor externo, el nivel de IO se llevará a VDD, es decir, nivel alto, y cuando se cierra el interruptor, IO se conecta directamente a GND, lo que lo obliga a convertirse en un nivel bajo. (de 1 de 0)

Su lógica de conmutación es la opuesta a la entrada pull-up.

5. Salida de drenaje abierto OUT_OD

Nuevamente, en el modo de salida (independientemente del modo de entrada), ambos interruptores del controlador de entrada están abiertos.

Para facilitar la investigación, el circuito del controlador de salida se simplifica de la siguiente manera (dos tubos MOS se simplifican en interruptores):

 En el modo de drenaje abierto, el lado alto permanece desconectado.

Cuando el puerto IO emite 1, el tubo inferior se desconecta y el IO se desconecta de la MCU;

Cuando el IO emite 0, el interruptor inferior está cerrado, el IO está conectado directamente a VSS y la abrazadera se establece en un nivel bajo.

 La observación encontrará que cuando el puerto IO emite 1, su estado no es de alto nivel de salida (IO está desconectado del interior del microcontrolador, lo que puede considerarse como un estado de alta impedancia), y cuando emite 0, el estado es para dar salida a un nivel bajo. Esta es la característica de la salida de drenaje abierto: el modo de salida de drenaje abierto no puede generar directamente un nivel alto, sino solo un nivel bajo (desde la perspectiva de la corriente, la corriente solo puede fluir hacia el puerto IO del microcontrolador). Es por eso que la salida de drenaje abierto recibe su nombre: los únicos dos estados son circuito abierto o flujo de corriente.

Entonces, si desea utilizar este modo para encender una luz LED, existen dos métodos de conexión: resistencia pull-up externa y conexión de sumidero.

 Cuando el puerto IO emite 1, el IO en sí mismo no emite un nivel alto, pero el puerto IO puede generar un nivel alto a través de una resistencia pull-up, por lo que el LED está encendido. La resistencia pull-up también es la resistencia limitadora de corriente del LED.En este estado, sin la resistencia pull-up, VCC se agregará directamente a ambos extremos del LED, lo que quemará el LED.

Cuando la salida IO es 0, el tubo inferior está encendido, el puerto IO está conectado a VSS, el ánodo del LED está en un nivel bajo, no hay voltaje en ambos extremos del LED y se apaga. La corriente fluye desde VCC a través de la resistencia pull-up al puerto IO y luego a VSS.

Se puede encontrar que en este modo, sin importar si la salida IO es 1 o 0, y sin importar si el LED está encendido o apagado, habrá corriente fluyendo a través de la resistencia pull-up, es decir, consumirá actual, y la corriente será mayor cuando el LED esté apagado.

 Este modo parece más simple que la conexión de la resistencia pull-up. El ánodo del LED está conectado a VCC y el cátodo está conectado al puerto IO.

Cuando el puerto IO emite 1, el tubo inferior está desconectado, el bucle LED está abierto, la corriente no puede fluir a través del LED y el LED está apagado.

Cuando el puerto IO emite 0, el tubo inferior está cerrado, el bucle LED está cerrado, la corriente fluye desde VCC a través del LED y luego fluye hacia el puerto IO del microcontrolador a través del LED, y luego fluye a VSS, y el El LED se enciende .

En este sentido, el estado del LED es opuesto a la lógica del puerto IO en el programa (1 apagado, 0 encendido). Cuando el LED está apagado, no consume energía y solo consume corriente cuando está encendido.

La función de la resistencia limitadora de corriente es limitar la corriente que fluye a través del LED cuando el LED está encendido, para que no se queme, y su tamaño se puede calcular de acuerdo con la corriente de trabajo Vcc/LED.

6. Salida push-pull OUT_PP

La salida push-pull es uno de los modos más utilizados. Puede generar tanto nivel alto como bajo, y tiene una gran capacidad de conducción.

En este modo, el estado del tubo superior y del tubo inferior siempre se invierte.

Cuando el puerto IO emite 1, el tubo superior está cerrado, el tubo inferior está desconectado y el puerto IO está conectado directamente a VDD, que es un nivel alto;

Cuando el puerto IO emite 0, el tubo superior se desconecta, el tubo inferior se cierra y el puerto IO se conecta directamente a VSS, que es un nivel bajo.

En este modo, hay dos métodos de conexión de tipo activo y tipo fregadero.

Método de conexión de fuente, cuando el puerto IO emite un nivel alto, el LED se ilumina. La corriente sale del puerto IO, fluye a través de la resistencia limitadora de corriente y el LED a GNG

 

 Conexión del fregadero, cuando el puerto IO emite un nivel bajo, el LED se ilumina. La corriente fluye a través de la resistencia limitadora de corriente, el LED fluye desde el puerto IO y luego fluye hacia VSS.

En este modo, no conecte directamente los pines del puerto IO, porque cuando el estado de salida del puerto IO es diferente, el puerto IO se cortocircuitará (como se muestra a continuación), lo que es fácil de quemar el puerto IO.

 

7. Multiplexación de salida de drenaje abierto AF_OD

La salida de drenaje abierto de multiplexación se refiere a la salida de drenaje abierto de la función de multiplexación, y el principio de funcionamiento es el mismo que el de la salida de drenaje abierto. Las interfaces periféricas de STM32 (como IIC, interfaz de comunicación SPI, etc.) son todos puertos IO multiplexados. Suponiendo que PB10 y PB11 se utilizan como interfaz de comunicación IIC, después de usar el modo de salida de drenaje abierto multiplexado, el estado de estos dos IO estarán completamente controlados por La decisión de salida periférica interna ya no está controlada por el registro de datos de salida GPIO. Puede evitar efectivamente que el mal funcionamiento de GPIO afecte la comunicación normal de IIC.

 8. Multiplexación de salida push-pull AF_PP

La salida de drenaje abierto de multiplexación se refiere a la salida push-pull de la función de multiplexación, y el principio de funcionamiento es el mismo que el de la salida push-pull. También es una salida para funciones de multiplexación. El uso específico de multiplexación push-pull o multiplexación de drenaje abierto depende de la situación. De manera similar, el drenaje abierto multiplexado no puede emitir directamente un nivel alto y se requiere una resistencia pull-up externa. Por lo tanto, en el uso real, la multiplexación push-pull todavía se usa más.

Se han introducido los 8 modos de GPIO, y el siguiente es un programa simple para demostrar cómo usar el GPIO de STM32.

Consulte el manual del periférico STM32, GPIO tiene muchas funciones.

 Pero este artículo solo habla sobre el uso básico de GPIO: inicialización de GPIO, configuración y reinicio de GPIO.

Como se mencionó anteriormente, GPIO debe inicializarse antes de su uso.

La siguiente es una función de inicialización GPIO simple, y la función de cada línea de programa se analiza a continuación.

void GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;        //定义一个GPIO初始化参数的结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //启用GPIOB的时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //选择要初始化的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;      //设置IO速度
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP;       //设置IO模式
	GPIO_Init(GPIOA,&GPIO_InitStructure);	        //初始化
}

Aquí defino una función void GPIO_Init(void) para la inicialización de GPIO. Siempre que se llame a la función en la función principal, se puede inicializar el puerto IO correspondiente.

GPIO_InitTypeDef GPIO_InitStructure:

Esta línea de programa define una estructura denominada GPIO_InitStructure (este nombre se puede elegir libremente), y el prototipo de esta estructura es GPIO_InitTypeDef (la ortografía debe ser exactamente la misma y no se puede cambiar). GPIO_InitTypeDef se define en stm32f10x_gpio.h en la biblioteca de periféricos STM 32. Consta de tres miembros: GPIO_Pin, GPIO_Speed ​​y GPIO_Mode, que corresponden a los tres parámetros de valor Pin, velocidad y modo.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , HABILITAR):

A diferencia de 51 microcomputadoras de un solo chip, cada periférico de STM32 tiene un controlador de reloj dedicado.Si desea usar el periférico correspondiente, debe encender el controlador de reloj correspondiente (el valor predeterminado no está encendido, el propósito es reducir la energía consumo), de lo contrario, Cualquier operación en GPIO no es válida. Mirando el diagrama de estructura interna de STM32, el controlador de reloj del puerto GPIO es APB2, por lo que esta línea de programa se usa para abrir el controlador de reloj APB2 de GPIO.

Si desea abrir varios grupos al mismo tiempo, puede escribirlo como RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE) y separar varios grupos de GPIO con |.

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 

GPIO_InitStructure.GPIO_Speed ​​= GPIO_Speed_10MHz;     

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP;    

Anteriormente se ha definido una estructura GPIO_InitStructure, y estas 3 líneas se utilizan para asignar valores a los 3 miembros en ella a su vez.

El primero es el Pin. Qué pin desea inicializar, seleccione qué pin. Tenga en cuenta que la identificación del pin aquí no es la identificación del pin del chip del microcontrolador, sino el número de serie del pin en su grupo. Por ejemplo, el pin 10 de STM32F103C8T6 es PA0. Si desea inicializar este pin, el valor del pin debe asignarse como GPIO_Pin_0. De manera similar, si desea inicializar los mismos parámetros para múltiples puertos IO, puede escribir GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;  cada dos pines están separados por |.

Si desea inicializar los mismos parámetros para todos los puertos IO del grupo, puede escribir GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

Luego está Speed, que es un valor de frecuencia que representa la velocidad de cambio de nivel del puerto IO. Hay 2 MHz, 10 MHz y 50 MHz para elegir. Si el puerto IO se usa para transmisión de datos (IIC, comunicación SPI, etc.) o transmisión de ondas PWM y otros escenarios que requieren señales de alta frecuencia, generalmente seleccione la velocidad máxima, es decir, 50 MHz. Por supuesto, los escenarios de aplicaciones comunes también pueden usar 50 MHz.

El último es el modo de puerto IO Hay 8 modos para elegir, que se han presentado en detalle anteriormente.

GPIO_Init(GPIOA,&GPIO_InitStructure);

Una vez asignados los tres miembros, puede comenzar la inicialización. GPIO_Init es un programa empaquetado en la biblioteca de periféricos GPIO Tiene dos variables de entrada, una es GPIO y la otra es el parámetro en GPIO_InitStructure. La función es inicializar GPIOA según los parámetros en GPIO_InitStructure.

Si necesita inicializar otros puertos IO, también puede escribir de acuerdo con el procedimiento anterior.

Una vez completada la inicialización, el puerto IO se puede configurar y restablecer.

A continuación se enumeran varios métodos de configuración y restablecimiento, que se pueden utilizar de acuerdo con sus propios hábitos.

GPIO_SetBits(GPIOA, GPIO_Pin_0);         //PA0输出1
GPIO_ResetBits(GPIOA, GPIO_Pin_0);       //PA0输出0


GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);     //PA0输出1
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);   //PA0输出0


GPIO_Write(GPIOA, 0x1);             //PA0输出1
GPIO_Write(GPIOA, 0x0);             //PA0输出1

Entre ellos, la función GPIO_Write opera en todo el grupo de GPIO.

El siguiente es un programa de parpadeo de ciclo simple de luces LED, que puede usarse como referencia para principiantes.

#include<stm32f10x.h>                //STM32头文件
#include<stm32f10x_gpio.h>           //GPIO头文件
#include<stm32f10x_rcc.h>            //RCC时钟头文件

void GPIO_Init(void)            //GPIO初始化子函数
{
	GPIO_InitTypeDef GPIO_InitStructure;                    //定义一个GPIO初始化参数的结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //启用GPIOB的时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               //选择要初始化的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;       //设置IO速度
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP;            //设置IO模式
	GPIO_Init(GPIOA,&GPIO_InitStructure);	                //按以上参数初始化GPIO
}

void Delay_ms(int Time)        //延时函数
{
	int i=0;
	while(Time--)
	{
		i=8000;
		while(i--);
	}
	return;
}

void main(void)            //主函数
{
    GPIO_Init;                                    //初始化GPIO
    while(1)
    {
         GPIO_SetBits(GPIOA, GPIO_Pin_0);         //PA0输出1
         Delay_ms(500);                            //延时500ms
         GPIO_ResetBits(GPIOA, GPIO_Pin_0);       //PA0输出0
         Delay_ms(500);                            //延时500ms
    }    
}

Después de aprender las configuraciones y restablecimientos básicos de GPIO, otras marquesinas de luces de agua son muy simples, por lo que no las demostraré aquí.

El contenido anterior es una comprensión personal, si hay algún error, corríjame

Supongo que te gusta

Origin blog.csdn.net/qq_55203246/article/details/123723102
Recomendado
Clasificación