1. mustapha.hamdi@insat.rnu.tn
1/3
Examen : IIA5
Arch.SoC
Nom:…………………………..
Prénom :……………….……
Veuillez répondre sur ce document.
Il s’agit de programmer un système sur puce pour le diagnostic d’un robot autonome,
l’objectif étant de tester périodiquement les moteurs et enclencher des Leds en cas de
panne. Le SoC choisi est à base d’un Cortex M4 conçu par la firme ST. Le système sur puce
est illustré par le schéma synoptique suivant.
On donne les registres de control « GPIOx_MODER, RCC_APB1ENR, DAC_CR » pour le
DAC voir annexe. Sachant que les chaines de sorties sont via aux ports PortA, PA4 et PA5.
Compléter les instructions suivantes :
RCC->APB1ENR |=…..
DAC->CR |=…..
GPIOA->MODER |=….
Gestion d'interruption :
Le système sur puce est doté d'un gestionnaire d'interruption Nested Vectored Interrupt
Controller (NVIC).
Pour lire l’état des moteurs « fonctionnel ou en panne » on utilise des capteurs spécifiques.
La lecture de l’état de ces capteurs est une tâche qui s'exécute via deux méthodes, pour les
capteurs numériques, via le port GPIOA0, il s’agit de l’interruption
EXT0_IRQn. Pour les capteurs analogiques via un ADC, il s’agit de l’interruption
ADC_IRQn.
Le signal issu de l’interruption externe EXTI0 doit interrompre le programme principal en
mettant à 0 l’état de pins PD14 et PD15 pour allumer les LEDS correspondent en cas d’une
éventuelle panne moteur. Le signal issu de l’interruption ADC doit interrompre la fonction
main pour couverture le signal de sortie via à le DAC . Compléter le code suivant :
2. mustapha.hamdi@insat.rnu.tn
2/3
Examen : IIA5
Arch.SoC
Nom:…………………………..
Prénom :……………….……
void EXTI0_IRQHandler(void)
{
NVIC_ClearPendingIRQ(EXTI0_IRQn); //Clear the EXTI pending bits
EXTI->PR|=(1<<0);
GPIOD->………. ……………. // PD14 à 1
GPIOD->……….. ……………. // PD15 à 1
}
void ADC_IRQHandler(void) {
DAC->DHR12R1 = ……………
// note: DR : data register for ADC1, DHR12R1 :register for output data
}
Le NVIC donne la possibilité de définir la priorité entre deux interruptions par la variable priority
dans l'instruction : NVIC_SetPriority(Irqn, priority) , donner les instructions permettant de mettre
l’ADC en priorité : ………………………………………………………………………………………………..
………………………………………………………………………………………………..
Annexes :