3A S2 ESIEA Paris
2018/2019
Examen
SYS3044 Microprocesseurs, périphériques et applications
C. TRABELSI
(Durée : 1h30)
L’usage de tout autre document ou dispositif électronique est
interdit
Exercice 1 : Questions de cours (10 points)
1. Quelle est la différence entre un capteur et un actuateur ? Donner un exemple de chaque
type.
2. On veut allumer une led connectée sur la pin PA5 (pin 5 du port GPIOA), donner les
instructions en langage C qui permettent de le faire en accédant aux registres MODER et
ODR. On suppose que l’horloge du port GPIOA est déjà activée.
Examen -- SYS3044 Microprocesseurs, périphériques et applications 1/8
3. Expliquer le problème de rebonds qu’on peut avoir sur une entrée d’un microcontrôleur
(un bouton poussoir par exemple) et donner une solution à ce problème.
4. Quelle est l’utilité d’une résistance de tirage connectée à un bouton poussoir dans un
système à microcontrôleur ?
5. Un capteur de distance analogique infrarouge est connecté en entrée au microcontrôleur.
Pour être compréhensible par ce dernier, la tension donnée par le capteur passe par un
connvertisseur analogique numérique. On suppose que ce convertisseur a une résolution de
8 bits avec une plage de conversion de 0-3.3V. Si le capteur lui donne en entrée une tension
de 1V, quelle serait sa sortie numérique ?
6. Dans le microcontrôleur Cortex-M0+, les horloges des modules utilisés (ports, timers, etc.)
sont activées par le programme et ne sont pas actives par défaut. Quel est l’avantage de cette
solution ?
Examen -- SYS3044 Microprocesseurs, périphériques et applications 2/8
7. Ecrire une boucle qui permet de générer un signal PWM sur la pin PB6 (qui n’est pas une
pin PWM) avec une fréquence de 100Hz et un duty cycle de 50% en utilisant la fonction
LL_mDelay() et le registre ODR.
8. Soit un timer cadencé par une horloge de 16MHz, quelle valeur il faut charger dans son
registre d'auto-reload (registre de comptage) pour générer un signal PWM d’une fréquence
de 10KHz ? Quelle valeur il faut charger dans son registre de comparaison pour générer un
signal PWM avec un duty cycle de 20% ?
9. Pour commander un servomoteur initialement à la position 0° et lui dire de se mettre à la
position 90°, on a envoyé un signal périodique d’une période de 20ms avec des impulsions
d’une durée de 2ms. Sachant que servomoteur a une vitesse de 0.1s/30°, combien
d’impulsions au minium il faut envoyer pour atteindre la position 90° ?
10. A la différence d’un servomoteur commandé en boucle fermée, un moteur pas à pas est
commandé en boucle ouverte. Expliquer.
Examen -- SYS3044 Microprocesseurs, périphériques et applications 3/8
Exercice 2 : Programmation C sur le Microcontrôleur Cortex-M0+
(10 points)
1. Soit le fichier « led.h » suivant vu en cours/TDAO :
#include "stm32l053xx.h"
typedef struct
{
GPIO_TypeDef * gpioPort;
uint8_t pin;
}LED_TypeDef;
void Led_init(LED_TypeDef *led, GPIO_TypeDef * port, uint16_t pn);
void Led_turnOn(LED_TypeDef *led); //allumer la led
void Led_turnOff(LED_TypeDef *led); //éteindre la led
void Led_toggle(LED_TypeDef *led); //inverser l’état de la led
uint8_t Led_isOn(LED_TypeDef *led);
uint8_t Led_isOff(LED_TypeDef *led);
Donner le code des fonctions suivantes en utilisant le registre ODR du GPIO de la led:
a. void Led_turnOn(LED_TypeDef *led);
b. void Led_turnOff(LED_TypeDef *led);
c. void Led_toggle(LED_TypeDef *led);
Examen -- SYS3044 Microprocesseurs, périphériques et applications 4/8
2. Soit le fichier « button.h » suivant vu en cours/TDAO :
#include "stm32l053xx.h"
#include "stm32l0xx_ll_exti.h"
typedef struct
{
GPIO_TypeDef * gpioPort;
uint8_t pin;
uint8_t pull;
}BUTTON_TypeDef;
void Button_init(BUTTON_TypeDef *button, GPIO_TypeDef * port, uint8_t pn, uint8_t
pl);//,uint32_t *nb_port);
uint8_t Button_State(BUTTON_TypeDef *button);
void Button_enableIRQ(BUTTON_TypeDef *button,uint8_t trigger);
Donner le code de la fonction uint8_t Button_State(BUTTON_TypeDef *button) en utilisant le
registre IDR du GPIO du bouton. Cette fonction retourne 1 si le niveau du signal reçu par le
bouton est le niveau haut sinon 0:
3. Soit la fonction « Bouton_Led_Polling » suivante qui permet de scruter l’état d’un
bouton passé en paramètre et configuré en pull-up et d’inverser l’état de la led passée en
paramètre à chaque appui sur ce bouton. Compléter les deux instructions if de ce code et
ajouter une dernière instruction pour mettre à jour l’état du bouton.
void Bouton_Led_Polling(uint8_t *last_button_state, LED_TypeDef *led, BUTTON_TypeDef
*bouton){
uint8_t current_button_state;
//lire l’état courant
current_button_state = Button_State(bouton);
//si front descendant (bouton appuyé)
if ( ) {
Led_toggle(led);
//suppression des rebonds
LL_mDelay(20);
}
//si front montant (bouton relâché)
if ( ){
//suppression des rebonds
LL_mDelay(20);
}
//mise à jour de l’état précédent du bouton
;
}
Examen -- SYS3044 Microprocesseurs, périphériques et applications 5/8
4. On souhaite gérer un deuxième bouton par interruption. Ce bouton est censé être déclaré
avec la variable globale bouton2 et configuré en pull-down. A chaque appui sur le bouton,
une led changera d’état. On suppose que dans la fonction main, l’interruption sur le bouton
sera configurée pour être déclenchée sur front montant et descendant. Voici le gestionnaire
d’interruption associé à ce bouton :
void EXTI2_3_IRQHandler() {
1. if ( EXTI->PR & (1 << [Link])) {
2. if (Button_State(&bouton2) != 0) {
3. Led_toggle(&led2);
4. }
5. LL_mDelay(20);
6. EXTI->PR |= (1 << [Link]);
7. }
8. }
a. Pourquoi le gestionnaire d’interruption a un nom qui contient les termes EXTI, 2 et 3 ?
b. A quoi sert le test fait dans la ligne 1 du gestionnaire d’interruption ci-dessus ?
c. A quoi sert le test fait dans la ligne 2?
d. A quoi sert le délai dans la ligne 5 ?
e. A quoi sert la commande de la ligne 6 ?
Examen -- SYS3044 Microprocesseurs, périphériques et applications 6/8
Annexe: Documentation de quelques registres
Examen -- SYS3044 Microprocesseurs, périphériques et applications 7/8
Examen -- SYS3044 Microprocesseurs, périphériques et applications 8/8