Exercice de Synthèse : Saisie d'un Code

Exercice de Synthèse : Saisie d'un Code

DOCUMENTATION


PROJET SOURCE

WORKSPACE_F411_HAL_STM32CUBE.zip


1 - Configuration des LEDs

Q1.1. Modifier le programme afin de permettre l’alumage et l’extinction des LEDs RGB de la carte Mbed.


2 - Configuration des Boutons : Interruptions Externes

Q2.1. Modifier le programme afin de déclencher une interruption Externe en appuyant sur le bouton ‘center’.
La fonction de callback associée à cette interruption doit alors mettre à 1 la variable globale pushButton.


3 - Clignotement d’une LED : configuration d’un Timer

Q3.1. Configurer le Timer 5 afin de déclencher une interruption toutes les 500ms.

Q3.2. Compléter la fonction de callback associée à cette interruption afin de faire clignoter la led Rouge.

Q3.3. Compléter la fonction void HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) afin de stopper le comptage du timer passé en paramètre.


4 - Configuration de l’UART

Q4.1. Configurer les broches pour utiliser UART2, et initialiser ce périphérique avec la fonction HAL_UART_Init()

Q4.2. Compléter la fonction HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) permettant d’envoyer Size caractères situés à l’adresse pData avec le périphérique huart

Q4.3. Compléter les fonctions uart_putc() et uart_puts permettant d’envoyer respectivement un caractère et une chaine de caractères se terminant par le caractère nul ( code ascii 0x00 )

Une fois ces fonctions correctement complétées, la fonction uart_printf doit être utilisable.

Q4.4. Vérifier le bon fonctionnement de la fonction uart_printf en affichant un message dans le terminal série ( avec gtkterm ou minicom ( minicom -D /dev/ttyACM0 -b 115200 )

La fonction HAL_UART_Receive_IT(UART_HandleTypeDef *huart) permet d’autoriser l’interruption liée à la réception d’un caractère pour le périphérique uart passé en paramètre.

Q4.5. Compléter la fonction HAL_UART_Receive_IT_Disable(UART_HandleTypeDef *huart) permettant de désactiver les interruptions liées à la réception d’un caractère.


5 - Comparaison de chaines de caractères

Q5.1. Compléter la fonction stringComp(uint8_t* buf1, uint8_t* buf2), afin de retourner 1 si les caractères placés à partir de l’adresse buf1 sont identiques à ceux placés à partir de l’adresse buf2 ( et 0 sinon ).

REMARQUE : On suppose que les chaines de caractères se terminent forcément par le caractère nul ( code ascii 0 ).


6 - Fonctionnement Global : Saisie d’un code via la liaison UART

Au démarrage ( état initial ) , la led rouge clignote toutes les 500ms.
L’appui sur le bouton central arrête ce clignotement, et authorise les interruptions en réception pour l’UART2.
Les leds RGB sont alors en jaune ( LED rouge et verte allumées ). Chaque caractère reçu est stocké dans le tableau buffer.
Une fois les 4 caractères réceptionnés :

  • Soit le code est correct, on affiche ‘CORRECT’ dans le terminal et la LED verte est allumée.
  • soit le code est faux, on affiche ‘FAUX’ dans le terminal et la LED rouge est allumée.

les interruptions en réception de UART2 sont désactivées.
On attent alors 2.5 secondes, et on repart à l’état initial.

Ce fonctionnement peut être décrit par un diagramme d’états :

machine_etat_code.svg

REMARQUE : Dans le diagramme d’états, ’=1’ est une transition inconditionnelle, on passe à l’état suivant sans tester les entrées.
La mise à jour de l’état courant se fait toutes les 50ms.

Q6.1. Coder la machine d’état correspondante, en utilisant un switch case.

enum{INIT, WAIT_PUSH_BUTTON, INIT_CODE, WAIT_CODE, WRONG_CODE, CORRECT_CODE, WAIT };

int main()
{
	static int state = INIT;
	...
	while(1)
	{
		switch(state)
		{

		case INIT : uart_printf(&huart2,"START \n\r");
					...
					break;

		case WAIT_PUSH_BUTTON : ...
					break;
		...

		default : break;
		}

		HAL_Delay(50);
	}

	return 0;
}