Ecole Nationale des Sciences de l’Informatique Université de la Manouba
A.U 2012-2013
Examen (Session Principale)Correction
Module : Systèmes à base de microcontrôleur Durée : 2H Enseignant : Mohamed MASMOUDI – Chadlia JERAD
Date : 14 - 11 - 2012 Classe : II3-SLE Documents non autorisés
Exercice 1 (8 points):
• Décrire la procédure d’amorçage (boot) dans le microcontrôleur STM32. (1 point)
Décrire le rôle de boot loader, les pins boot1 et boot0.
•
• Expliquer la différence entre les protocoles de communication synchrones et asynchrones. Citer trois exemples en indiquant si le protocole est synchrone ou asynchrone. (1 point) Le partage du signal de clk ; UART : asynchrone ; i2c, spi : synchrones. Le microcontrôleur STM32 adresse différentes mémoires en séquence. Expliquer ce mode d’adressage et préciser comment gérer les configurations des périphériques dans le STM32. (1 point) L’espace d’adressage est subdivisé entre les différentes mémoires du système y compris les registres de configuration des périphériques. Le STM32 est une cible logicielle, matérielle ou mixte? expliquer. (1 point) Mixte vu la présence de périphériques qui exécute des traitements matériel et le core ARM qui exécute le code logiciel.
•
• C’est quoi un FPU, expliquer son rôle. (1 point)
Floting Point Unit, accélérateur de calcul de virgule floattante.
• C’est quoi le CMSIS. (1 point)
Library d’abstraction hardware pour les cœurs cortex. • Citer les critères de choix d’un microcontrôleur. (2 point)
Performance (Cœur, fréquence, mémoires, périphériques, …), Architecture, Prix, packaging
Excercice 2 (12 points):
Le bus 1-Wire (aussi connu sous le nom de bus Dallas ou OneWire) est un bus conçu par Dallas Semiconductor qui permet de connecter (en série, parallèle ou en étoile) des composants avec seulement deux fils (un fil de données et un fil de masse).
Les opérations élémentaires pour communiquer à travers 1-wire sont décrites dans le « tableau 1 » et le chronogramme de la « figure 1 ».
Opération Reset
Description Envoyer un reset sur le bus et tous les équipements connectés seront des à commandes.
l’attente
Implémentation
• Mettre le bus à l’état bas, delay 480
μs.
• Relâcher le bus, attendre 70 μs. •
Lire l’info sur le bus:
o 0 = esclave présent, o 1 = pas d’esclave présent
Publicité
1/7
Write 0 bit
Write 1 bit
Read bit
Envoyer un 0 sur le bus pour un slot de temps Envoyer un 1 sur le bus pour un slot de temps Lire un bit depuis un esclave pour un slot de temps
• Attendre 410 μs.
Mettre le bus à l’état bas, attendre 60 μs. Mettre le bus à l’état haut, attendre 10 μs. Mettre le bus à l’état bas, attendre 6 μs. Mettre le bus à l’état haut, attendre 64 μs. Mettre le bus à l’état bas, attendre 6 μs. Relâcher le bus, attendre 9 μs. Lire l’info sur le bus dans un attendre 55 μs.
Tableau 1: Opérations élémentaires
Figure 1:Chronogramme des opération élémentaires sur le bus 1-wire
1. Complétez la fonction Init_ow () pour initialiser la broche PB9 comme broche de données du
bus 1-wire sachant que ce fils sera initialisé comme une sortie PUSH_PULL. (2 points)
void Init_ow() { GPIO_InitTypeDef GPIO_InitStructure; //Enable GPIOs clock RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE);
2/7
// deinitialize GPIOs registers GPIO_DeInit.(GPIOB); // Pins initialization GPIO_InitTypeDef x; x. GPIO_Pin = GPIO_Pin_9; x. GPIO_Speed = GPIO_Speed_50MHz; x. GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOB,& x) ; }
2. Ecrire les fonctions : (3 points) •
init_systick() : initialisation du systick avec la fonction SysTick_Config(SystemCoreClock / ……..) init_systick(){
SysTick_Config(SystemCoreClock / 1000000) ;
•
} systick_handler() : callback pour l’interruption du systick systick_handler() {
if (timeout)
timeout-- ;
}
• delay (n) : exécutant un delay bloquant de n µs.
delay (n){
}
timeout=n ; while (timeout) ;
3. Ecrire les fonctions suivantes (4 points):
Description Cette fonction configure le pin du 1-Wire come sortie et met la sortie à l’état bas. Cette fonction configure le pin du 1-Wire come sortie et met la sortie à l’état haut. Cette fonction configure la pin du 1-Wire come entrée et lit la valeur sur le bus. Cette fonction permet d’envoyer un bit sur le bus 1-wire Cette fonction permet de lire un bit sur le bus 1-wire Cette fonction permet de trasmettre un octet sur le bus 1-wire. Cette fonction permet de trasmettre un octet sur le bus 1-wire. Cette fonction permet de générer un reset sur le bus 1-Wire et détecte la présence d’un esclave.
Publicité
Nom de fonction drive_OW_low drive_OW_high read_OW OW_write_bit OW_read_bit OW_write_byte OW_read_byte OW_reset_pulse
drive_OW_low(){
GPIO_InitTypeDef x; x. GPIO_Pin = GPIO_Pin_9; x. GPIO_Speed = GPIO_Speed_50MHz; x. GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOB,& x) ; GPIO_ResetBits (GPIOB, GPIO_Pin_9) ;
} drive_OW_high(){
GPIO_InitTypeDef x; x. GPIO_Pin = GPIO_Pin_9; x. GPIO_Speed = GPIO_Speed_50MHz; x. GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOB,& x) ; GPIO_SetBits (GPIOB, GPIO_Pin_9) ;
3/7
} uint8_t read_OW(){
GPIO_InitTypeDef x; x. GPIO_Pin = GPIO_Pin_9; x. GPIO_Speed = GPIO_Speed_50MHz; x. GPIO_Mode= GPIO_Mode_IPU; GPIO_Init(GPIOB,& x) ; return GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_9) ;
} OW_write_bit(uint8_t out_bit){ drive_OW_low(); delay(6); if(out_bit)
drive_OW_high();
delay(54); drive_OW_high(); delay(10);
} uint8_t OW_read_bit(){
uint8_t returned; drive_OW_low(); delay(6); drive_OW_high(); delay(9); returned=read_OW(); delay(45); drive_OW_high(); delay(10); return returned;
} OW_write_byte(uint8_t out_byte){
uint8_t i; for (i=0;i<8;i++){
if(out_byte&(0x01<<i))
OW_write_bit(1);
else
OW_write_bit(0);
}
} uint8_t OW_read_byte(){
uint8_t returned=0; uint8_t i; for (i=0;i<8;i++){
if(OW_read_bit())
returned=returned|(0x01<<i);
} return returned;
} uint8_t OW_reset_pulse(){
uint8_t returned; drive_OW_low(); delay(480);
4/7
Publicité
drive_OW_high(); delay(70); returned=read_OW(); delay(410); drive_OW_high(); return returned;
} Les clés dallas appelés aussi I-BUTTON sont des clés d’identification pour des utilisateurs d’un système. Le fait de connecter la clé au lecteur permet de connecter les deux surfaces data et masse de la clé au data et masse du bus 1-Wire du lecteur et ce qui enchainera l’échange de données d’identification entre le lecteur et la clé.
L’identifiant de la clé dallas est codé sur 64 bits transmises successivement à la réception du code 0x33H depuis le lecteur.
Data
Masse
Clé Dallas
Figure 2: Système de lecture de clé Dallas
On se propose de réaliser un lecteur des clés dallas on se basant sur la librairie de communication 1- Wire déjà présenté.
Le lecteur lit l’identifiant depuis l’identifiant de l’i-button en interrogeant le bus 1–wire tout les 500 ms et transmet le code lu via USART et allume une LED en mettant la broche PA7 en état haut pour 3 secondes.
4. Ecrire la programme principal en utilisant les deux fonctions usart_init() et usart_sendData().
(3 points)
void main(){
uint8_t i; uint8_t key[8]; Init_ow(); usart_init(); //Initialisaton de la led RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef x; x. GPIO_Pin = GPIO_Pin_7; x. GPIO_Speed = GPIO_Speed_50MHz;
5/7
x. GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOA,& x) ; while(1){
delay(500000); if(OW_reset_pulse()){ /// vérifier la présence d'une clé chaque les 500 ms
OW_write_byte(0x33); for (i=0;i<8;i++)
key[i]=OW_read_byte();//lecture du clé sur 64 bits
usart_sendData(key); GPIO_SetBits (GPIOA, GPIO_Pin_7) ; delay(3000000); GPIO_ResetBits (GPIOA, GPIO_Pin_7) ;
}
}
}
6/7
7/7