Vous êtes sur la page 1sur 24

SYSTEMES EMBARQUES (3EM)

TP N°1 EN SYSTEMES EMBARQUES : Manipulation de la carte


STM32 : Les Ports d'E/S (GPIO)

I. Principe et fonctionnement
Une entrée / sortie est une broche (pin) sur laquelle on peut relier des éléments
électroniques externes au microcontrôleur. Ces pins sont appelés GPIO (General Purpose
Input Output). Les caractéristiques des GPIOs sont les suivantes :
 Un GPIO standard d’alimentation à 5V
 Un GPIOs délivre au maximum un courant de 25mA
 Le temps de montée en sortie est configurable (max 100 MHz)
 Tous les pins peuvent être programmés comme entrées analogiques
 Tous les pins peuvent être programmés en fonctions alternées (USARTx, TIMx,
I2Cx, SPIx,…)
 Toute entrée peut être configurée comme source d’interruption
 9 ports de GPIO standard (GPIOA..GPIOI) (1 port = 16 pines d’E/S)
Le GPIO est l'interface entre l'intérieur du µC et l'extérieur : il est donc nécessaire de
configurer chaque I/O en respectant les contraintes électriques extérieures sans qui non
seulement le comportement souhaité ne sera pas achevé, mais surtout, l’entrée-sortie
considérée peut être détruite.
Concernant la carte STM32F4, Chacune des entrées/ sorties peut être configurée
comme suit :
 Entrée (limites 0 / 3,3V)
– floating input : le courant demandée par l'IO est quasiment nul.
– Analog input : l'IO est reliée à un convertisseur analogique numérique ADC avec
précaution pour une immunité au bruit optimale,
– Pull up : en interne, une résistance d'environ 40k, est reliée entre l'IO et le +vdd
(3,3V),
– Pull down :en interne, une résistance d'environ 40k, est reliée entre l'IO et le GND
(0V).
 Sortie
– Output PushPull : l'IO est capable de fournir 0V ou 3,3V avec un courant maximum
d'environ +/- 20mA (attention : toutes les IO ne peuvent pas débiter en même temps ce
courant maximal, car il existe également un limite globale en courant pour le
microcontrôleur),

Année Universitaire : 2018-2019 Page |1


SYSTEMES EMBARQUES (3EM)
– Output OpenDrain : l'IO est capable de fournir 0V mais pas 3,3V. La tension 3,3V
doit être produite de manière externe. Cette configuration est intéressante par exemple
pour faire un bus multi-maître.
Pour ces deux cas (Push pull et Open drain) le niveau de tension de l'IO est fixé
directement par l'état logique du bit d'un registre particulier du périphérique GPIO.
Les deux configurations suivantes ont respectivement les mêmes spécifications électriques
que celles déjà vues, mais l'état est non plus fixé par le GPIO mais par un autre
périphérique associé à l'IO (Timer, ADC, USART...). Ce sont des configurations dites «
alternate function » :
– Alternate Output PushPull,
– Alternate Output Opendrain.
Au support du cours on trouvera une description sous forme de schéma électronique qui
éclaire chacune des configurations présentées. La programmation du GPIO se fait au
travers plusieurs registres :
– les registres de configuration CRL et CRH permettent de configurer l'IO,
– les registres d'utilisation IDR, ODR, BSR et BSRR permettent quant à eux de fixer le
niveau de chaque IO, ou de lire l'état logique de chaque IO.
II. Programmation des GPIOs
Nous proposons dans cet atelier deux manières de programmer les entrées sorties : soit à
travers l’interface CubeMX par l’utilisation de fonctions prédéfinies (HAL) soit à travers la
manipulation directe des registres des I/Os dans Keil.
Partie I : Programmation GPIO dans Keil
1. Création projet

 Lancez Keil µvision


 Créez un nouveau projet : File  New µVision Project
 Nommez votre projet et enregistrez-le dans votre répertoire de travail
 Choisissez ensuite la référence de votre carte STM32 (dans notre cas c’est la carte
STM32F407VG)

Année Universitaire : 2018-2019 Page |2


SYSTEMES EMBARQUES (3EM)

 Cochez ensuite les variables indiquées dans la figure ci-dessous.

 Créez ensuite le fichier main.c

Année Universitaire : 2018-2019 Page |3


SYSTEMES EMBARQUES (3EM)

2. Manipulations
1er exercice
On propose dans cette première manipulation d’allumer deux LEDs (la rouge et la bleue)
pendant une même durée de 1s : les LEDs s’allumeront toutes les 1 seconde et resteront
éteintes pendant une seconde. Référez-vous à la datasheet afin de pouvoir répondre aux
questions suivantes et rédiger votre programme.
a. Identifier les registres pour la configuration des GPIOs permettant de
commander les LEDs
b. Quelles sont les LEDs disponibles sur la carte STM32F4 ? Identifier
chaque pin et la couleur de la LED correspondante
c. Quel est le type qualifiant les registres en terme de mémoire (volatile ou
Const) ? Justifier votre réponse.
d. Déclarer en haut de votre programme main.c les registres choisis
e. Quel est la fonction à utiliser pour garder la LED éteinte ou allumée
pendant la durée choisie ? Déclarer la fonction dans votre programme
main.c
f. Calculer les valeurs en Hexadécimal à mettre dans les registres
correspondants.
g. Identifier le registre de l’activation de l’horloge et activer la
h. Ecrire le corps du programme main.c
i. Compiler et charger le programme sur la carte
2ème exercice
Clignotez les 4 LEDS en même temps
3ème exercice
Allumez les LEDs selon le chronogramme décrit dans la figure ci-dessous.

Année Universitaire : 2018-2019 Page |4


SYSTEMES EMBARQUES (3EM)

Partie II : Programmation GPIO par HAL

1. Création d’un projet sur Cubemx

Ouvrir le logiciel STM32 CubeMX.


Cliquer sur New project

Sélectionner le type de carte que vous utilisez en cliquant sur :


Discovery => STM32F4 => 32F407VG => Start Project :

Année Universitaire : 2018-2019 Page |5


SYSTEMES EMBARQUES (3EM)

A la question "Initialize all peripherals with their default mode ?", responder Yes :

Ceci a pour effet de configurer automatiquement tous les périphériques du microcontrôleur de


manière à ce que tous les composants présents sur la carte Discovery puissent fonctionné
(écran LCD, tactile, joystick, LEDs, ...). Ce n'est pas utile pour ce premier projet mais pour les
suivants .On obtient une vue semblable à celle ci-dessous :

Année Universitaire : 2018-2019 Page |6


SYSTEMES EMBARQUES (3EM)
On définit ici le mode d’entrée ou sortie de la broche.
Les Entrées.
 GPIO_MODE_INPUT Broche en entrée en mode flottant.
 GPIO_MODE_IT_RISING interruption sur front montant.
 GPIO_MODE_IT_FALLING interruption sur front descendant.
 GPIO_MODE_IT_RISING_FALLING Interruption sur les deux fronts.
 GPIO_MODE_EVT_RISING.
 GPIO_MODE_EVT_FALLINGGPIO_MODE_EVT_RISING_FALLING
Les Sorties.
 GPIO_MODE_OUTPUT_PP Broche en sortie en mode Push/Pull.
 GPIO_MODE_OUTPUT_OD Broche en sortie en drain ouvert.
 GPIO_MODE_AF_PP Fonction alternative en mode Push/Pull.
 GPIO_MODE_AF_OD Fonction alternative en mode drain ouvert.
 GPIO_MODE_ANALOG
Dans le menu "Project", cliquer sur "Settings..." :

Dans l’onglet "Project", donner un nom au projet et un emplacement.

Année Universitaire : 2018-2019 Page |7


SYSTEMES EMBARQUES (3EM)

Génération automatique du code

Pour terminer, cliquer sur le bouton "Generate source code based on user settings" :

Année Universitaire : 2018-2019 Page |8


SYSTEMES EMBARQUES (3EM)

Remarque : Il sera possible de retourner par la suite dans CubeMX afin d’activer d’autres
périphériques ou bien modifier la configuration.

Un projet sera créé sur Keil qui comporte toutes les bibliothèques et les configuration des
entrées/sorties que vous avez défini via l’interface graphique.

2. Configuration

Configurer les GPIOs en output push-pull pour commander les LEDs connectées aux
broches14 et 15

3. Les fonctions prédéfinis

HAL_GPIO_ReadPin
GPIO_PinState HAL_GPIO_ReadPin( GPIO_TypeDef*GPIOx, uint16_t GPIO_Pin )
typedefenum
{
GPIO_PIN_RESET = 0,

Année Universitaire : 2018-2019 Page |9


SYSTEMES EMBARQUES (3EM)
GPIO_PIN_SET
}GPIO_PinState;
Description: lit l’état de broche configurée en entrée.
Paramètres1: GPIOx: where x can be (A..I)
Paramètres2: GPIO_Pin: specifies the port bit to read.
GPIO_PIN = GPIO_PIN_x where
x can be (0..15).

Retour : GPIO_PinState = The input port pin


value.

Exemple: HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_0);


3)HAL_GPIO_WritePin
voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,
GPIO_PinStatePinState)

Description: Sets or clears the selected data port bit.


@param1: GPIOx: where x can be (A..I)
@param2: GPIO_Pin: specifies the port bit to be
written.
This parameter can be one of GPIO_PIN_x
where x can be (0..15).
@param3: PinState: specifies the value to be written to
the selected bit.
This parameter can be one of the
GPIO_PinState enum values:

@arg GPIO_PIN_RESET: to clear the port pin


@arg GPIO_PIN_SET: to set the port pin

Exemple:
HAL_GPIO_WritePin( GPIOD, GPIO_PIN_12|GPIO_PIN_14, GPIO_PIN_SET);
4) HAL_GPIO_TogglePin
voidHAL_GPIO_TogglePin( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIOx->ODR ^= GPIO_Pin;
}
Description Toggles the specified GPIO pins.

Année Universitaire : 2018-2019 P a g e | 10


SYSTEMES EMBARQUES (3EM)

@param1: GPIOx: where x can be (A..I)


@param2: GPIO_Pin: specifies the port bit to be written.
This parameter can be one of GPIO_PIN_x where x can be (0..15).

Exemple:
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
III. Les applications
Exemple 1 :
Clignoter la diode LED connectée à PD12 en utilisant les registres prédéfinis dans le HAL.
Exemple 2 :
Clignotez les 4 LEDS en même temps en utilisant le HAL ?

Année Universitaire : 2018-2019 P a g e | 11


SYSTEMES EMBARQUES (3EM)

TP N°2 :
Manipulation des GPIOs et EXTI

Application 1 : commande d’un moteur pas à pas


 Objectif

1. Comprendre le principe de fonctionnement d’un moteur pas à pas


2. Comprendre le fonctionnement du circuit ULN2003
3. Savoir implémenter la commande d’un moteur pas à pas avec le microcontrôleur

 Principe de fonctionnement

Le projet consiste à la commande d’un moteur pas à pas 4 phases en mode demi-
pas en utilisant le driver ULN2003 pour booster le courant dans les phases du moteur. La
carte STM32 sert à générer les signaux de commande du moteur pas à pas (8 commandes /
tour) cadencés par une fréquence.

PA0

PA1

PA4

PB0

Année Universitaire : 2018-2019 P a g e | 12


SYSTEMES EMBARQUES (3EM)
1er étape : Création du projet

2éme étape : Choisir les pins de la carte stm32 connectées aux entrées du notre moteur.

3éme étape :

Année Universitaire : 2018-2019 P a g e | 13


SYSTEMES EMBARQUES (3EM)

4éme étape : Configuration des paramètres

5eme étape : génération du code

Application 2 : 4 Leds et Bouton utilisateurs de STM32f4Discovery

Année Universitaire : 2018-2019 P a g e | 14


SYSTEMES EMBARQUES (3EM)
Application 3 : Clignoté les leds PD12 ,PD13,PD14 et PD15 en utilisant PA0 comme source
d’interruption
 Logique de fonctionnement par HAL
1) Configurer la broche en mode EXTI dans la function HAL_GPIO_Init
2) Relier la ligne d’interruption à NVIC par les deux fonctions
a. HAL_NVIC_SetPriority
b. HAL_NVIC_EnableIRQ
3) Implémenter la routine d’interruption dans le fichier main.c
HAL_GPIO_EXTI_Callback(). Cette fonction est imlplémentée en weak dans le fichier
stm32f4xx_hal_gpio.c:
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
4) On peut ne pas toucher à cette fonction et implémenter la routine d’interruption dans le
fichier stm32f4xx_it.c
void EXTI0_IRQHandler(void)
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
 Creation du project
Après la création d’un nouveau projet on définit la porte PA0 comme GPIO_EXTI

Année Universitaire : 2018-2019 P a g e | 15


SYSTEMES EMBARQUES (3EM)

Sous NVIC Configuration cocher EXTI line0 interrupt

Année Universitaire : 2018-2019 P a g e | 16


SYSTEMES EMBARQUES (3EM)

TP4 : TIMER et PWM


Objectif de TP :
Le but de cet atelier est d’initier l’apprenant à la manipulation des TIMERS en mode PWM
sur une carte programmable STM32F4Discovery.
Application1 : Commande d’un Servo Moteur :
A la différence d'un moteur continu, le Servomoteur ne tourne pas sur lui-même de façon
continu. Un servomoteur tourne certes sur un axe, mais suivant un angle allant généralement
de 0 à 180°. En réalité un servomoteur est un moteur continu équipé d'un réducteur (des
engrenages), dont l'objectif est de réduire la vitesse et d'augmenter le couple (la puissance) ; et
d’un potentiomètre qui permet au servomoteur de garder l’angle d’inclinaison choisit. On va
commander en rotation ce sevo moteur en utilisant la commande PWM (MLI en français). Le
signal PWM généré pour commander ce moteur doit avoir une fréquence de 50 Hz. Cela
signifie que le temps séparant deux fronts montants est de 20 ms.

Duré à l’état HAUT :


-Cette durée indique au servomoteur l’angle précis qui est souhaité par l’utilisateur.
- Un signal ayant une durée d’état HAUT de 1ms donnera un angle à 0°, le même signal avec
une durée d’état HAUT de 2ms donnera un angle au maximum de ce que peut admettre le
servomoteur.

1-Ecrire un algorithme qui permet de faire tourner un servo moteur « mg90 » à 0°, 90° et
180°.

Année Universitaire : 2018-2019 P a g e | 17


SYSTEMES EMBARQUES (3EM)

1-1-Cube Mx : Configuration des E/S


Activation de l’horloge et du TIMER2 en utilisant Channel 1 pour le signal PWM.

Année Universitaire : 2018-2019 P a g e | 18


SYSTEMES EMBARQUES (3EM)
1-2-Sous le block Clock configuration, on va modifier la fréquence à timer clock est 45MHz.

Maintenant, notre timer clock est 45MHz, et on a besoin une fréquence de sortie 50Hz. On va
appliquer la formule suivante afin de déterminer les variables du TIMER.

( ) (( ) )

Sous le block Clock configuration, cliquer sur TIM2 pour modifier sous Setting Parameters
les deux valeurs de Prescaler et du counter period.

Alors : ( ) (( )) =900000

On va diviser 900000 en Prescaler et du counter period.

Année Universitaire : 2018-2019 P a g e | 19


SYSTEMES EMBARQUES (3EM)

Sous NVIC Settings cocher: TIM2global interrupt

Générer le code Keil et écrivez votre programme.


Remarque
 Activation de PWM
 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
 Pour écrire la valeur du data cycle dans le registre CCR1
 htim2.Instance->CCR1=90;

Année Universitaire : 2018-2019 P a g e | 20


SYSTEMES EMBARQUES (3EM)

TP3 : ADC
Objectif
Principe de fonctionnement d’un périphérique ADC.

Etude théorique
 Fréquence de conversion de l’ADC est de 1 MHz
 Résolution configurable 6, 8, 10 ou 12-bit
 Plage de conversion VREF : 0 à 3.6 V telque :

VREF- ≤ VIN ≤ VREF+ (VREF+ et VREF- valables uniquement dans les packages
LQFP100 )

 Alimentation de fonctionnement : 2.4V à 3.6 V


 18 canaux multiplexés:

-16 voies externes

- 2 voies internes: connectées au capteur de température intégré dans le STM32F4 et une


référence interne (VREFINT = 1.2V)

 2 groupes de conversion :
- Conversion régulière : jusqu’à 16 voies
- Conversion injectée : jusqu’à 4 voies
 2 modes de conversion :
- Single : une seule conversion est effectuée
- Continue : L’ensemble des voies configurées de l’ADC sont converties sans arrêt.
 Séquenceur : Permet de définir l’ordre de conversion des différentes voies.
 Mode discontinu : Un sous ensemble des voies configurées n ≤8 est converti suite à
chaque ordre de conversion
 Période d’échantillonnage de l’entrée analogique
- ADCCLK, jusqu’à 14MHz, prise du PCLK2 à travers un pré-diviseur (Div2, Div4,
Div6 et Div8)
- Trois bits configurables, permettant de définir la période d’échantillionnage pour
chaque entrée.

Année Universitaire : 2018-2019 P a g e | 21


SYSTEMES EMBARQUES (3EM)

 Les APIs de l’ADC (HAL CubeMX-CMCIS)


HAL_ADC_Init
HAL_ADC_Start
HAL_ADC_PollForConversion /* attendre la fin de conversion */
 Exemple : while(HAL_ADC_PollForConversion(&hadc1,5 )!= HAL_OK);
HAL_ADC_GetValue /* lire la valeur convertie*/
 Exemple : val_convertie = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop

 Application
Convertir l’entrée analogique connectée à PA0 en utilisant le convertisseur ADC1.
1) Plateforme: STM32 F4 Discovery
2) CPU: STM32F407VG 8Mhz
3) entrées: PA0 entrée analogique;
4) sorties: PD12, PD13, PD14 et PD15
- LD4 (LED Verte) active si Vin<1v
- LD3 (LED Orange) active si 1v<Vin< 2v
- LD5 (LED Rouge) active si 2v<Vin< 2.6v
- LD6 (LED Bleue) active si Vin>2.6v

Année Universitaire : 2018-2019 P a g e | 22


SYSTEMES EMBARQUES (3EM)

Année Universitaire : 2018-2019 P a g e | 23


SYSTEMES EMBARQUES (3EM)

Année Universitaire : 2018-2019 P a g e | 24