Microcontrôleur STM32 débutant 3-GPIO explication détaillée

GPIO (entrée/sortie à usage général) est une entrée et une sortie à usage général. Le GPIO est le périphérique le plus basique du microcontrôleur, et tout autre périphérique est indissociable du GPIO. Cet article explique en détail la structure interne et le principe de fonctionnement du GPIO, et joint un programme simple à apprendre pour les débutants.

Différent du micro-ordinateur à puce unique 51 (le micro-ordinateur à puce unique 51 peut contrôler directement le niveau haut et bas du port IO en écrivant P0 = 0xff ou P0 ^ 1 = 1), l'IO de STM32 doit être initialisé et l'horloge correspondante doit être initialisé avant utilisation, sinon le port IO ne sortira pas.

Regardez d'abord le schéma de structure interne du GPIO (ci-dessous)

 Le port IO a deux chemins, l'un est la sortie (I:in) et l'autre est l'entrée (O:out).

Nous appelons la partie qui contrôle l'entrée IO le pilote d'entrée (comme indiqué dans la case supérieure en pointillés de la figure ci-dessus), qui se compose d'un déclencheur Schottky et d'un ensemble de résistances pull-up et pull-down et de leurs commutateurs de commande. Lorsque le déclencheur Schottky est utilisé pour l'entrée numérique (c'est-à-dire 1 et 0), il maintient la stabilité du niveau (le principe ne sera pas développé), s'il est utilisé comme entrée analogique, le déclencheur Schottky sera sauté. L'état du commutateur et de la résistance de rappel à droite dépend du mode du port IO, qui sera expliqué en détail ci-dessous.

De même, nous appelons la partie qui contrôle la sortie IO le pilote de sortie (comme indiqué dans la case inférieure en pointillés de la figure ci-dessus), qui se compose d'un contrôleur de sortie et de deux tubes MOS (le tube supérieur est PMOS, connecté à VCC ; le le tube inférieur est NMOS, connecté à GND connecté) composition. Le contrôleur de sortie est utilisé pour contrôler l'état de commutation des deux tubes mos pour produire un niveau haut ou un niveau bas, et son état dépend également du mode d'IO, qui sera expliqué en détail ci-dessous.

La diode de protection sert à limiter le niveau du port IO entre Vss et Vdd.

Ensuite, nous présenterons en détail l'état de fonctionnement du GPIO dans chaque mode.

 Le GPIO du STM32 dispose de 8 modes (4 types d'entrée, 4 types de sortie), comme indiqué dans le tableau suivant :

 1. Entrée analogique AIN

Tout d'abord, en mode d'entrée (quel que soit le mode d'entrée), les deux transistors MOS du pilote de sortie sont tous à l'état déconnecté.

Le mode d'entrée analogique est utilisé pour convertir la tension analogique de 0-3,3 V (3,3 V est basé sur la tension d'alimentation du microcontrôleur, si la tension est de 3,2 V, elle est de 0-3,2 V) en 0-2 ^ 12 (prenez STM32F103C8T6 comme exemple, son ADC est de 12 bits, il est donc de 0 à 2 à la puissance 12) quantité numérique pour l'utilisation du processeur. Ce mode est requis pour l'acquisition de signaux analogiques, comme l'acquisition de température et d'humidité, l'acquisition de tension et de courant, etc.

 Dans ce mode, les commutateurs supérieur et inférieur du pilote d'entrée sont tous désactivés et le chemin analogique est indiqué par la flèche dans la figure ci-dessus.

La tension de l'IO est directement entrée dans le CAN sur puce.

2. Entrée flottante IN_FLOATING

Ce mode est utilisé pour l'entrée numérique et le CPU collectera le niveau du port IO.

Dans ce mode, les commutateurs supérieur et inférieur du pilote d'entrée sont tous déconnectés (à ce moment, le port IO est dans une configuration élevée, ce qui peut être considéré comme une déconnexion interne entre l'IO et le microcontrôleur), et le chemin du signal est indiqué par la flèche dans la figure ci-dessus. Pour faciliter la recherche, le pilote d'entrée est maintenant simplifié comme suit.

Dans ce mode, si le port IO est dans un état flottant (c'est-à-dire que le port IO n'est ni haut ni bas), la valeur collectée par le CPU sera également dans un état incertain, donc ce mode d'entrée nécessite une traction A externe Une résistance vers le haut ou vers le bas est requise pour une entrée stable (voir ci-dessous).

 Pour la méthode de résistance pull-up externe : lorsque l'interrupteur est éteint, le niveau IO sera tiré vers VCC, qui est un niveau élevé, et lorsque l'interrupteur est fermé, l'IO est directement connecté à GND et forcé à devenir un niveau faible. (hors 1 hors 0)

 Pour la méthode de résistance externe pull-down : lorsque l'interrupteur est éteint, le niveau d'IO sera tiré vers GND, c'est-à-dire le niveau bas, et lorsque l'interrupteur est fermé, IO est directement connecté à VCC, le forçant à devenir haut niveau. (hors 0 hors 1)

La logique de commutation des deux méthodes de connexion est juste opposée. La valeur de résistance de la résistance pull-up (pull-down) peut être de 1K à 10K (pas moins que le courant de dissipation maximum de VCC/broche).

La fonction de la résistance pull-up (pull-down) dans les deux connexions est de limiter le courant lorsque l'interrupteur est fermé. Sans ces deux résistances, VCC est court-circuité directement à GND lorsque l'interrupteur est fermé.

3. Tirez vers le bas et entrez IPD

Ce mode est identique à la méthode de résistance d'abaissement de l'entrée flottante, sauf que la résistance d'abaissement externe est omise et que la résistance d'abaissement sur puce est utilisée.

Dans ce mode, l'interrupteur pull-down sur puce reste fermé et l'interrupteur pull-up reste ouvert.

 Lorsque le commutateur externe est éteint, le niveau d'IO sera tiré vers VSS, c'est-à-dire le niveau bas, et lorsque le commutateur est fermé, IO est directement connecté à VCC, le forçant à devenir de haut niveau. (hors 0 hors 1)

4. Tirez vers le haut l'entrée IPU

Ce mode est opposé à l'entrée pull-down, et le principe de la connexion de la résistance pull-up de l'entrée flottante est le même. C'est-à-dire que le commutateur de pull-up sur puce reste fermé et le commutateur de pull-down reste ouvert.

  Lorsque le commutateur externe est éteint, le niveau d'IO sera tiré vers VDD, c'est-à-dire le niveau haut, et lorsque le commutateur est fermé, IO est directement connecté à GND, le forçant à devenir de niveau bas. (hors 1 hors 0)

Sa logique de commutation est à l'opposé de l'entrée pull-up.

5. Sortie de vidange ouverte OUT_OD

Encore une fois, en mode de sortie (quel que soit le mode d'entrée), les deux commutateurs du pilote d'entrée sont ouverts.

Pour la commodité de la recherche, le circuit de commande de sortie est simplifié comme suit (deux tubes MOS sont simplifiés en commutateurs) :

 En mode drain ouvert, le côté haut reste déconnecté.

Lorsque le port IO produit 1, le tube inférieur est déconnecté et l'IO est déconnecté du MCU ;

Lorsque l'IO sort 0, le commutateur inférieur est fermé, l'IO est directement connecté au VSS et la pince est réglée sur un niveau bas.

 L'observation constatera que lorsque le port IO produit 1, son état n'est pas de produire un niveau élevé (IO est déconnecté de l'intérieur du microcontrôleur, ce qui peut être considéré comme un état à haute impédance), et lorsqu'il produit 0, l'état est de produire un niveau bas. C'est la caractéristique de la sortie à drain ouvert : le mode de sortie à drain ouvert ne peut pas produire directement un niveau élevé, mais ne peut produire qu'un niveau bas (du point de vue du courant, le courant ne peut circuler que dans le port IO du microcontrôleur). C'est pourquoi la sortie à drain ouvert tire son nom : les deux seuls états sont le circuit ouvert ou le flux de courant.

Donc, si vous souhaitez utiliser ce mode pour piloter une lumière LED, il existe deux méthodes de connexion : la résistance de rappel externe et la connexion du puits.

 Lorsque le port IO sort 1, l'IO lui-même ne produit pas de niveau haut, mais le port IO peut produire un niveau haut via une résistance de rappel, de sorte que la LED est allumée. La résistance pull-up est également la résistance de limitation de courant de la LED.Dans cet état, sans la résistance pull-up, VCC sera directement ajouté aux deux extrémités de la LED, ce qui brûlera la LED.

Lorsque la sortie IO est à 0, le tube inférieur est allumé, le port IO est connecté à VSS, l'anode de la LED est au niveau bas, il n'y a pas de tension aux deux extrémités de la LED et elle s'éteint. Le courant circule de VCC à travers la résistance de rappel vers le port IO, puis vers VSS.

On peut constater que dans ce mode, peu importe si la sortie de sortie IO est 1 ou 0, et peu importe si la LED est allumée ou éteinte, il y aura du courant traversant la résistance de rappel, c'est-à-dire qu'elle consommera courant, et le courant sera plus grand lorsque la LED est éteinte.

 Ce mode semble plus simple que la connexion de la résistance de rappel. L'anode de la LED est connectée à VCC et la cathode est connectée au port IO.

Lorsque le port IO sort 1, le tube inférieur est déconnecté, la boucle de LED est ouverte, le courant ne peut pas circuler à travers la LED et la LED est éteinte.

Lorsque le port IO produit 0, le tube inférieur est fermé, la boucle de LED est fermée, le courant circule de VCC à travers la LED, puis passe dans le port IO du microcontrôleur à travers la LED, puis passe à VSS, et le La LED s'allume .

A cet égard, l'état de la LED est opposé à la logique du port IO dans le programme (1 éteint, 0 allumé). Lorsque la LED est éteinte, elle ne consomme aucune énergie et ne consomme de courant que lorsqu'elle est allumée.

La fonction de la résistance de limitation de courant est de limiter le courant traversant la LED lorsque la LED est allumée, afin de ne pas griller, et sa taille peut être calculée en fonction du courant de travail Vcc/LED.

6. Sortie push-pull OUT_PP

La sortie push-pull est l'un des modes les plus couramment utilisés. Il peut produire à la fois un niveau élevé et un niveau bas et possède une forte capacité de conduite.

Dans ce mode, l'état du tube supérieur et du tube inférieur est toujours inversé.

Lorsque le port IO produit 1, le tube supérieur est fermé, le tube inférieur est déconnecté et le port IO est directement connecté à VDD, qui est un niveau élevé ;

Lorsque le port IO sort 0, le tube supérieur est déconnecté, le tube inférieur est fermé et le port IO est directement connecté au VSS, qui est un niveau bas.

Dans ce mode, il existe deux méthodes de connexion de type actif et de type récepteur.

Méthode de connexion source, lorsque le port IO produit un niveau élevé, la LED s'allume. Le courant sort du port IO, traverse la résistance de limitation de courant et la LED vers GNG

 

 Connexion Sink, lorsque le port IO produit un niveau bas, la LED s'allume. Le courant circule à travers la résistance de limitation de courant, la LED s'écoule depuis le port IO, puis s'écoule vers VSS.

Dans ce mode, ne connectez pas directement les broches du port IO ensemble, car lorsque l'état de sortie du port IO est différent, le port IO sera court-circuité (comme indiqué ci-dessous), ce qui est facile à brûler le port IO.

 

7. Multiplexage de la sortie à drain ouvert AF_OD

La sortie de multiplexage à drain ouvert fait référence à la sortie à drain ouvert de la fonction de multiplexage, et le principe de fonctionnement est le même que celui de la sortie à drain ouvert. Les interfaces périphériques de STM32 (telles que IIC, interface de communication SPI, etc.) sont tous des ports IO multiplexés.En supposant que PB10 et PB11 sont utilisés comme interface de communication IIC, après avoir utilisé le mode de sortie à drain ouvert multiplexé, l'état de ces deux E/S seront entièrement contrôlées par La décision de sortie du périphérique interne n'est plus contrôlée par le registre de données de sortie GPIO. Il peut efficacement éviter que le mauvais fonctionnement du GPIO n'affecte la communication normale d'IIC.

 8. Sortie push-pull de multiplexage AF_PP

La sortie de multiplexage à drain ouvert fait référence à la sortie push-pull de la fonction de multiplexage, et le principe de fonctionnement est le même que celui de la sortie push-pull. C'est aussi une sortie pour les fonctions de multiplexage. L'utilisation spécifique du multiplexage push-pull ou du multiplexage à drain ouvert dépend de la situation. De même, le drain ouvert multiplexé ne peut pas produire directement un niveau élevé et une résistance de rappel externe est requise. Par conséquent, en utilisation réelle, le multiplexage push-pull est encore plus utilisé.

Les 8 modes de GPIO ont été introduits, et ce qui suit est un programme simple pour montrer comment utiliser le GPIO de STM32.

Consultez le manuel du périphérique STM32, GPIO a de nombreuses fonctions.

 Mais cet article ne parle que de l'utilisation de base du GPIO : initialisation du GPIO, réglage et réinitialisation du GPIO.

Comme mentionné précédemment, GPIO doit être initialisé avant utilisation.

Ce qui suit est une simple fonction d'initialisation GPIO, et la fonction de chaque ligne de programme est analysée ci-dessous.

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);	        //初始化
}

Ici, je définis une fonction void GPIO_Init(void) pour l'initialisation GPIO. Tant que la fonction est appelée dans la fonction principale, le port IO correspondant peut être initialisé.

GPIO_InitTypeDef GPIO_InitStructure:

Cette ligne de programme définit une structure nommée GPIO_InitStructure (ce nom peut être choisi librement), et le prototype de cette structure est GPIO_InitTypeDef (l'orthographe doit être exactement la même et ne peut pas être modifiée). GPIO_InitTypeDef est défini dans stm32f10x_gpio.h dans la bibliothèque de périphériques STM32 . Il se compose de trois membres : GPIO_Pin, GPIO_Speed ​​et GPIO_Mode, qui correspondent aux trois paramètres de valeur de broche, de vitesse et de mode.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ACTIVER):

Différent du micro-ordinateur monopuce 51, chaque périphérique de STM32 dispose d'un contrôleur d'horloge dédié.Si vous souhaitez utiliser le périphérique correspondant, vous devez activer le contrôleur d'horloge correspondant (la valeur par défaut n'est pas activée, le but est de réduire la puissance consommation), sinon l'opération Toute opération sur GPIO est invalide. En regardant le schéma de structure interne de STM32, le contrôleur d'horloge du port GPIO est APB2, donc cette ligne de programme est utilisée pour ouvrir le contrôleur d'horloge APB2 de GPIO.

Si vous souhaitez ouvrir plusieurs groupes en même temps, vous pouvez l'écrire sous la forme RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE) et séparer plusieurs groupes de GPIO avec |.

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; 

GPIO_InitStructure.GPIO_Speed ​​= GPIO_Speed_10MHz ;     

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP ;    

Une structure GPIO_InitStructure a été définie auparavant, et ces 3 lignes sont utilisées pour attribuer des valeurs aux 3 membres qui la composent tour à tour.

La première est la broche. Quelle broche vous souhaitez initialiser, sélectionnez quelle broche. Notez que l'identification de la broche ici n'est pas l'identification de la broche de la puce du microcontrôleur, mais le numéro de série de la broche dans son groupe. Par exemple, la broche 10 de STM32F103C8T6 est PA0. Si vous souhaitez initialiser cette broche, la valeur de la broche doit être attribuée à GPIO_Pin_0. De même, si vous souhaitez initialiser les mêmes paramètres pour plusieurs ports IO, vous pouvez écrire GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1 ;  toutes les deux broches sont séparées par |.

Si vous souhaitez initialiser les mêmes paramètres pour tous les ports IO du groupe, vous pouvez écrire GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;

Ensuite, il y a Speed, qui est une valeur de fréquence représentant la vitesse de retournement de niveau du port IO. Vous avez le choix entre 2 MHz, 10 MHz et 50 MHz. Si le port IO est utilisé pour la transmission de données (communication IIC, SPI, etc.) ou la transmission d'ondes PWM et d'autres scénarios nécessitant des signaux haute fréquence, sélectionnez généralement la vitesse maximale, c'est-à-dire 50 MHz. Bien sûr, les scénarios d'application courants peuvent également utiliser 50 MHz.

Le dernier est le mode port IO.Vous avez le choix entre 8 modes, qui ont été présentés en détail ci-dessus.

GPIO_Init(GPIOA,&GPIO_InitStructure);

Une fois les trois membres affectés, l'initialisation peut commencer. GPIO_Init est un programme empaqueté dans la bibliothèque de périphériques GPIO. Il a deux variables d'entrée, l'une est GPIO et l'autre est le paramètre dans GPIO_InitStructure. La fonction est d'initialiser GPIOA selon les paramètres de GPIO_InitStructure.

Si vous devez initialiser d'autres ports IO, vous pouvez également écrire selon la procédure ci-dessus.

Une fois l'initialisation terminée, le port IO peut être défini et réinitialisé.

Plusieurs méthodes de réglage et de réinitialisation sont répertoriées ci-dessous, qui peuvent être utilisées selon vos propres habitudes.

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

Parmi eux, la fonction GPIO_Write opère sur l'ensemble du groupe de GPIO.

Ce qui suit est un programme de clignotement de cycle simple de lumières LED, qui peut être utilisé comme référence pour les débutants.

#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
    }    
}

Après avoir appris les paramètres GPIO de base et les réinitialisations, les autres chapiteaux de lumière d'eau sont très simples, donc je ne les démontrerai pas ici.

Le contenu ci-dessus est une compréhension personnelle, s'il y a une erreur, veuillez me corriger

Je suppose que tu aimes

Origine blog.csdn.net/qq_55203246/article/details/123723102
conseillé
Classement