Programmation des périphériques du
Transcription
Programmation des périphériques du
Programmation des périphériques du microcontrôleur STM32F107VC Schéma de principe du microcontrôleur STM32F107VC Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 1 SOMMAIRE 1 Contrôleur d'horloges et de resets (RCC).................................................. 4 1.1 1.2 2 Activation des horloges .............................................................................................. 4 Reset des périphériques .............................................................................................. 4 Lignes d'entrée / sortie (GPIO) ................................................................... 5 2.1 Remise à l'état initial d'un port ................................................................................... 5 2.2 Initialisation du fonctionnement des lignes d'un port................................................. 5 2.3 Lecture d'un port......................................................................................................... 6 2.4 Lecture d'une ligne d'un port ...................................................................................... 6 2.5 Ecriture dans un port .................................................................................................. 7 2.6 Mise à 0 ou à 1 d'une ligne d'un port.......................................................................... 7 2.7 Ecriture dans une ligne d'un port................................................................................ 7 2.8 Guide d'utilisation des lignes d'E/S ............................................................................ 8 2.8.1 Marche à suivre pour initialiser des lignes d'E/S ............................................... 8 2.8.2 Consulter/modifier des lignes d'E/S ................................................................... 8 2.9 Redirection des lignes connectées en interne à des contrôleurs de périphériques du microcontrôleur (fonction alternative) ................................................................................... 8 3 Contrôleur d'interruptions (NVIC)............................................................ 9 3.1 3.2 3.3 3.4 Définition des niveaux de préemption et de sous priorité .......................................... 9 Définition de la priorité d'une interruption............................................................... 10 Procédures d'interruption.......................................................................................... 11 Guide d'utilisation du contrôleur d'interruptions...................................................... 11 4 Mémorisation des changements d'état des lignes et génération d'interruptions externes (EXTI) ...................................................................... 11 4.1 Remise à l'état initial du détecteur de changements d'état et de génération d'interruptions....................................................................................................................... 12 4.2 Choix de la ligne ...................................................................................................... 12 4.3 Programmation de la ligne ....................................................................................... 12 4.4 Indicateurs de changement d'état.............................................................................. 13 4.5 Interruptions lors de changements d'état .................................................................. 13 4.6 Guide d'utilisation des lignes d'E/S en mémorisation d'états ou en génération d'interruptions....................................................................................................................... 14 4.6.1 Marche à suivre pour initialiser des lignes d'E/S avec mémorisation d'état ou génération d'interruptions................................................................................................. 14 4.6.2 Consulter/modifier des états mémorisés ou des indicateurs d'interruption des lignes d'E/S....................................................................................................................... 14 5 Les timers (TIM) ............................................................................................ 14 5.1 Remise à l'état initial d'un timer ..................................................................................... 15 5.2 Initialisation de la base de temps.................................................................................... 15 5.3 Modification de la valeur du compteur .......................................................................... 16 5.4 Modification de la période ............................................................................................. 16 5.5 Mode unique ou répétitif ................................................................................................ 16 5.6 Lancement/arrêt d'un timer par programme ................................................................... 16 5.7 Lignes externes liées à un timer ..................................................................................... 17 5.8 Choix de l'horloge d'un timer ......................................................................................... 18 5.8.1 Horloge interne........................................................................................................ 18 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 2 5.8.2 Horloge externe ....................................................................................................... 18 5.9 Chaînage de timers ......................................................................................................... 18 5.10 Pilotage d'un timer par des lignes externes .................................................................. 20 5.11 Capture ......................................................................................................................... 20 5.12 Création de signaux de sortie ....................................................................................... 21 5.13 Tests de l'état d'un timer ............................................................................................... 23 5.14 Génération d'interrutions .............................................................................................. 24 5.15 Guide d'utilisation des timers ....................................................................................... 25 5.15.1 Marche à suivre pour initialiser les timers ............................................................ 25 5.15.2 Commander un timer par une ligne externe .......................................................... 26 5.15.3 Utiliser le mode de capture déclenchée par une ligne externe .............................. 26 5.15.4 Utiliser un timer pour générer des signaux sur une ligne externe ......................... 26 5.15.5 Chaîner deux timers .............................................................................................. 26 5.15.6 Consulter/modifier des états mémorisés ou des ITs de timers .............................. 27 6 Convertisseur Analogique / Numérique (ADC) .......................................... 27 6.1 Remise à l'état initial d'un convertisseur ........................................................................ 27 6.2 Initialisation d'un convertisseur...................................................................................... 27 6.3 Mise en marche/arrêt d'un convertisseur........................................................................ 28 6.4 Lignes d'entrée des convertisseurs ................................................................................. 28 6.5 Choix de l'entrée à convertir........................................................................................... 29 6.6 Lecture d'une mesure...................................................................................................... 29 6.7 Lancement de conversion par programme ..................................................................... 29 6.8 Déclenchement du convertisseur par commande externe .............................................. 30 6.9 Mise en place du contrôle de seuils analogiques............................................................ 30 6.10 Tests de l'état d'un convertisseur .................................................................................. 31 6.11 Gestion des interruptions d'un convertisseur................................................................ 31 6.12 Guide d'utilisation des convertisseurs .......................................................................... 32 6.12.1 Marche à suivre pour initialiser les convertisseurs A/N........................................ 32 6.12.2 Déclencher un convertisseur A/N par programme ................................................ 32 6.12.3 Déclencher un convertisseur A/N par un timer ..................................................... 32 6.12.4 Lire une mesure sur un convertisseur A/N............................................................ 32 6.12.5 Changer l'entrée à convertir................................................................................... 32 6.12.6 Utiliser le contrôle de seuils sur un convertisseur A/N ......................................... 33 6.12.7 Consulter/modifier des états mémorisés ou des ITs de convertisseurs A/N ......... 33 7 Convertisseur numérique / analogique (DAC) ............................................ 33 7.1 Remise à l'état initial d'un convertisseur ........................................................................ 33 7.2 Initialisation d'un convertisseur...................................................................................... 33 7.3 Lancement d'un convertisseur par programme............................................................... 35 7.4 Lignes de sortie des convertisseurs ................................................................................ 35 7.5 Ecriture d'une valeur dans un convertisseur................................................................... 35 7.6 Lecture de la valeur d'un convertisseur .......................................................................... 35 7.7 Guide d'utilisation des convertisseurs N/A .................................................................... 35 7.7.1 Marche à suivre pour initialiser les convertisseurs N/A ......................................... 35 7.7.2 Ecrire une valeur à convertir en analogique............................................................ 36 7.7.3 Lire la valeur actuellement convertie en analogique............................................... 36 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 3 1 Contrôleur d'horloges et de resets (RCC) Les périphériques du microcontrôleur sont pilotés par des horloges programmables. Au reset ces horloges ne sont pas envoyées aux périphériques. Avant d'utiliser un périphérique il faut donc en activer l'horloge. Il est également possible de faire un reset d'un périphérique par programme pour le remettre dans son état initial (celui qu'il a après un reset physique). 1.1 Activation des horloges Deux fonctions (selon le périphérique) permettent d'activer ou de désactiver l'horloge d'un périphérique. void RCC_APB2PeriphClockCmd(périphérique, nouvelEtat) • Le premier paramètre désigne le périphérique dont on veut activer ou désactiver l'horloge. Il peut prendre les valeurs décrites dans le tableau suivant : RCC_APB2Periph_AFIO RCC_APB2Periph_GPIOA RCC_APB2Periph_GPIOB RCC_APB2Periph_GPIOC RCC_APB2Periph_GPIOD RCC_APB2Periph_GPIOE RCC_APB2Periph_ADC1 RCC_APB2Periph_ADC2 RCC_APB2Periph_TIM1 • Horloge pour le contrôle des fonctions alternatives des lignes (mémorisation d'états, génération d'interruptions et redirection des lignes) Horloge pour GPIOA Horloge pour GPIOB Horloge pour GPIOC Horloge pour GPIOD Horloge pour GPIOE Horloge pour convertisseur analogique/numérique 1 Horloge pour convertisseur analogique/numérique 2 Horloge pour timer1 Le second paramètre indique si l'horloge de ce périphérique est activée ou désactivée. Il peut prendre les valeurs : ENABLE ou DISABLE void RCC_APB1PeriphClockCmd(périphérique, nouvelEtat) • Le premier paramètre désigne le périphérique dont on veut activer ou désactiver l'horloge. Il peut prendre les valeurs décrites dans le tableau suivant : RCC_APB1Periph_TIM2 RCC_APB1Periph_TIM3 RCC_APB1Periph_TIM4 RCC_APB1Periph_TIM5 RCC_APB1Periph_TIM6 RCC_APB1Periph_TIM7 RCC_APB1Periph_DAC • Horloge pour timer2 Horloge pour timer3 Horloge pour timer4 Horloge pour timer5 Horloge pour timer6 Horloge pour timer7 Horloge pour convertisseurs numérique/analogique Le second paramètre indique si l'horloge de ce périphérique est activée ou désactivée. Il peut prendre les valeurs : ENABLE ou DISABLE 1.2 Reset des périphériques Deux fonctions (selon le périphérique) permettent de mettre ou de sortir un périphérique en mode reset. void RCC_APB2PeriphResetCmd(périphérique, nouvelEtat) Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 4 • Le premier paramètre désigne le périphérique que l'on veut mettre en mode reset. Il peut • prendre mêmes valeurs que le 1er paramètre de la fonction RCC_APB2PeriphClockCmd Le second paramètre indique si le périphérique est mis en mode reset ou sorti du mode reset. Il peut prendre les valeurs ENABLE ou DISABLE void RCC_APB1PeriphResetCmd(périphérique, nouvelEtat) • Le premier paramètre désigne le périphérique dont on veut faire un reset. Il peut prendre • les mêmes valeurs que le premier paramètre de la fonction RCC_APB1PeriphClockCmd Le second paramètre indique si le périphérique est mis en mode reset ou sorti du mode reset. Il peut prendre les valeurs ENABLE ou DISABLE 2 Lignes d'entrée / sortie (GPIO) Le STM32F107VC dispose de 80 lignes d'entrée/sortie constituées en 5 ports de 16 bits chacun. Chaque ligne peut être indépendamment programmée comme entrée ou comme sortie numérique ou analogique. De plus, la plupart des lignes sont connectées en interne à des contrôleurs de périphériques du microcontrôleur qui les utilisent, selon le cas, comme entrée ou comme sortie. La plupart des lignes d'entrée/sortie des périphériques internes peuvent être redirigées vers deux lignes physiques au choix (fonction alternative directe ou redirigée). 2.1 Remise à l'état initial d'un port La fonction GPIO_DeInit permet de mettre un port dans son état initial (comme après un reset) Sa définition est la suivante : void GPIO_DeInit (port) • Le paramètre désigne le port à réinitialiser. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE 2.2 Initialisation du fonctionnement des lignes d'un port La fonction GPIO_Init permet d'initialiser les lignes d'un port. Elle utilise comme paramètre une structure de données de type GPIO_InitTypeDef dont les champs sont les suivants : uint16_t GPIOMode_TypeDef GPIO_Pin GPIO_Mode Avant d'être utilisée par GPIO_Init cette structure doit être initialisée par la fonction GPIO_StructInit définie comme suit : • Le paramètre est void GPIO_StructInit (structureDInitialisation *) un pointeur sur la structure de type GPIO_InitTypeDef à initialiser. Avant d'utiliser la fonction pour initialiser les lignes il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ GPIO_Pin , il désigne la ou les lignes du port à programmer. Les valeurs possibles pour ce champ sont : GPIO_Pin_0 à GPIO_Pin_15 ou GPIO_Pin_All, on peut également programmer plusieurs lignes de la même façon en une seule fois en indiquant dans ce paramètre plusieurs valeurs séparées par + Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 5 Champ GPIO_Mode , il indique le mode de fonctionnement désiré pour cette ou ces lignes. Il peut prendre les valeurs suivantes : Analogique GPIO_Mode_AIN GPIO_Mode_Out_OD GPIO_Mode_IN_FLOATING Numérique GPIO_Mode_IPD GPIO_Mode_IPU GPIO_Mode_Out_PP Fonction alternative GPIO_Mode_IN_FLOATING GPIO_Mode_AF_PP Ligne en entrée analogique Ligne en sortie analogique Ligne en entrée numérique sans état défini si elle n'est pas connectée Ligne en entrée numérique à 0 si elle n'est pas connectée Ligne en entrée numérique à 1 si elle n'est pas connectée Ligne en sortie numérique (0 ou 1) Ligne utilisée en entrée numérique pour sa fonction alternative Ligne utilisée en sortie numérique pour sa fonction alternative La fonction GPIO_Init est définie comme suit : void GPIO_Init (port, structureDInitialisation *) Le premier paramètre désigne le port à initialiser. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE • Le second paramètre est un pointeur sur une structure de type GPIO_InitTypeDef préparée par la fonction GPIO_StructInit puis dont les champs ont été remplis en fonction du fonctionnement désiré. • 2.3 Lecture d'un port La fonction GPIO_ReadInputData renvoie un entier sur 16 bits constitué par l'état des lignes en entrée de ce port (le ième bit de cet entier vaut 0 ou 1 selon l'état de la ième ligne de ce port), sa définition est la suivante : uint16_t GPIO_ReadInputData(port) • Le paramètre désigne le port à lire. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE La fonction GPIO_ReadOutputData renvoie un entier sur 16 bits constitué par l'état des lignes en sortie de ce port (le ième bit de cet entier vaut 0 ou 1 selon l'état de la ième ligne de ce port), sa définition est la suivante : uint16_t GPIO_ReadOutputData(port) • Le paramètre désigne le port à lire. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE 2.4 Lecture d'une ligne d'un port La fonction GPIO_ ReadInputDataBit renvoie 0 ou 1 selon l'état de la ligne en entrée de ce port désignée par le second paramètre, sa définition est la suivante : uint16_t GPIO_ ReadInputDataBit (port, ligne) • Le premier paramètre désigne le port dont on veut lire une ligne en entrée. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 6 • Le second paramètre désigne la ligne à lire. Il peut prendre les valeurs : GPIO_Pin_0 à GPIO_Pin_15 La fonction GPIO_ ReadOutputDataBit renvoie 0 ou 1 selon l'état de la ligne en sortie de ce port désignée par le second paramètre, sa définition est la suivante : uint16_t GPIO_ ReadOutputDataBit (port, ligne) Le premier paramètre désigne le port dont on veut lire une ligne en sortie. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE • Le second paramètre désigne la ligne à lire. Il peut prendre les valeurs : GPIO_Pin_0 à • GPIO_Pin_15 2.5 Ecriture dans un port La fonction GPIO_Write permet de modifier l'état des lignes en sortie, le second paramètre est un entier dont la valeur du ième bit définit l'état de la ième ligne de ce port, sa définition est la suivante : void GPIO_Write(port, valeur) Le premier paramètre désigne le port dans lequel on veut écrire. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE • Le second paramètre est la valeur à écrire dans ce port (0 à 65535) • 2.6 Mise à 0 ou à 1 d'une ligne d'un port Les fonctions GPIO_SetBits et GPIO_ResetBits permettent de modifier l'état des lignes en sortie (resp. mise à 1 ou à 0), leurs définitions sont les suivantes : void GPIO_SetBits(port, lignes) void GPIO_ResetBits(port, lignes) Le premier paramètre désigne le port dont on veut modifier les lignes. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE • Le second paramètre désigne les lignes à modifier. Il peut prendre les valeurs : GPIO_Pin_0 à GPIO_Pin_15 ou GPIO_Pin_All, on peut également modifier plusieurs lignes en une seule fois en indiquant dans ce paramètre plusieurs valeurs séparées par + • 2.7 Ecriture dans une ligne d'un port La fonction GPIO_WriteBit permet de modifier l'état des lignes en sortie, sa définition est la suivante : void GPIO_WriteBit(port, lignes, valeur) Le premier paramètre désigne le port dans les lignes duquel on veut écrire. Il peut prendre les valeurs : GPIOA , GPIOB , GPIOC , GPIOD ou GPIOE • Le deuxième paramètre désigne la ligne à écrire. Il peut prendre les valeurs : GPIO_Pin_0 à GPIO_Pin_15 ou GPIO_Pin_All, on peut également modifier plusieurs lignes en une seule fois en indiquant dans ce paramètre plusieurs valeurs séparées par + • Le dernier paramètre indique la valeur à donner à ces lignes. Il peut prendre les valeurs : • Bit_RESET ou Bit_SET Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 7 2.8 Guide d'utilisation des lignes d'E/S 2.8.1 Marche à suivre pour initialiser des lignes d'E/S 1. 2. 3. 4. 5. Déclarer une variable de type GPIO_InitTypeDef Activer l'horloge du port par la fonction RCC_APB2PeriphClockCmd Réinitialiser ce port par la fonction GPIO_DeInit Initialiser la variable de type GPIO_InitTypeDef par la fonction GPIO_StructInit Dans cette variable indiquer la ou les lignes à programmer et le mode (entrée/sortie numérique/analogique/alternative) 6. programmer cette ou ces lignes par la fonction GPIO_Init 7. recommencer les étapes 5 et 6 pour les autres lignes du même port ayant un mode différent 8. recommencer les étapes 2 à 7 pour chaque port Remarque : lors de l'étape 5 on peut désigner plusieurs lignes si elles doivent être programmées dans le même mode. 2.8.2 Consulter/modifier des lignes d'E/S − Lecture de toutes les lignes en entrée d'un port par la fonction : GPIO_ReadInputData − Lecture de toutes les lignes en sortie d'un port par la fonction : GPIO_ReadOutputData − Lecture d'une ligne en entrée par la fonction : GPIO_ ReadInputDataBit − Lecture d'une ligne en sortie par la fonction : GPIO_ ReadOutputDataBit Ecriture de toutes les lignes en sortie d'un port par la fonction : GPIO_Write − Ecriture d'une ou de plusieurs lignes en sortie par l'une des fonctions : GPIO_SetBits ou GPIO_ResetBits ou GPIO_WriteBit − 2.9 Redirection des lignes connectées en interne à des contrôleurs de périphériques du microcontrôleur (fonction alternative) Les lignes utilisées comme entrées/sorties de contrôleurs de périphériques internes peuvent être redirigées. La fonction GPIO_PinRemapConfig permet de le faire. Sa définition est la suivante : void GPIO_PinRemapConfig(redirection, nouvelEtat) • Le premier paramètre désigne le périphérique dont les lignes sont redirigées. Les valeurs possibles sont indiquées dans le tableau ci dessous : Valeur GPIO_PartialRemap_TIM1 GPIO_FullRemap_TIM1 Ligne TIM1_BKIN TIM1_CH1N TIM1_CH2N TIM1_CH3N TIM1_ETR TIM1_CH1 TIM1_CH2 TIM1_CH3 TIM1_CH4 TIM1_BKIN TIM1_CH1N Sans redirection Avec redirection PB12 PB13 PB14 PB15 PA12 PA8 PA9 PA10 PA11 PB12 PB13 PA6 PA7 PB0 PB1 PE7 PE9 PE11 PE13 PE14 PE15 PE8 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 8 GPIO_PartialRemap1_TIM2 GPIO_PartialRemap2_TIM2 GPIO_FullRemap_TIM2 GPIO_PartialRemap_TIM3 GPIO_FullRemap_TIM3 GPIO_Remap_TIM4 GPIO_Remap_PD01 TIM1_CH2N TIM1_CH3N TIM2_CH1 = TIM2_ETR TIM2_CH2 TIM2_CH3 TIM2_CH4 TIM2_CH1 = TIM2_ETR TIM2_CH2 TIM2_CH3 TIM2_CH4 TIM3_CH1 TIM3_CH2 TIM3_CH1 TIM3_CH2 TIM3_CH3 TIM3_CH4 TIM4_CH1 TIM4_CH2 TIM4_CH3 TIM4_CH4 PD0 PD1 TIM5_CH4 PB14 PB15 PA0 PA1 PA2 PA3 PA0 PA1 PA2 PA3 PA6 PA7 PA6 PA7 PB0 PB1 PB6 PB7 PB8 PB9 lignes normales PA3 GPIO_Remap_TIM5CH4_LSI • PE10 PE12 PA15 PB3 PB10 PB11 PA15 PB3 PB10 PB11 PB4 PB5 PC6 PC7 PC8 PC9 PD12 PD13 PD14 PD15 OSC_IN OSC_OUT horloge interne pour calibration Le second paramètre indique si la redirection est faite ou pas. Les valeurs possibles de ce paramètre sont : ENABLE ou DISABLE 3 Contrôleur d'interruptions (NVIC) Les interruptions liées aux périphériques du microcontrôleur utilisent 16 niveaux de priorité. Ces niveaux peuvent être découpés en niveaux de préemption et sous niveaux de priorité. Une interruption de niveau de préemption N sera prise en compte même si le processeur est en train d'exécuter une procédure d'interruption de niveau supérieur à N. Tandis que la sous priorité est utilisée pour classer les interruptions en attente. 3.1 Définition des niveaux de préemption et de sous priorité La fonction suivante permet de découper les 16 priorités en niveaux de préemption et sous niveaux de priorité. Ce découpage s'applique à toutes les interruptions de périphériques. void NVIC_PriorityGroupConfig(groupesDePriorité) • Le paramètre désigne le découpage choisi. Les valeurs possibles sont décrites dans le tableau suivant : Niveaux de sous Description préemption priorité NVIC_PriorityGroup_0 0 0-15 NVIC_PriorityGroup_1 0-1 0-7 pas de niveaux de préemption 4 bits pour la sous priorité 1 bit pour la préemption 3 bits pour la sous priorité Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 9 NVIC_PriorityGroup_2 0-3 0-3 NVIC_PriorityGroup_3 0-7 0-1 NVIC_PriorityGroup_4 0-15 0 2 bits pour la préemption 2 bits pour la sous priorité 3 bits pour la préemption 1 bit pour la sous priorité 4 bits pour la préemption pas de sous priorité 3.2 Définition de la priorité d'une interruption Chaque interruption utilisée doit être affectée d'un niveau de préemption et d'un sous niveau de priorité en accord avec le choix de découpage fait par la fonction précédente. La fonction NVIC_Init permet de définir ces niveaux. Elle utilise comme paramètre une structure de données de type NVIC_InitTypeDef dont les champs sont les suivants : uint8_t uint8_t uint8_t FunctionalState NVIC_IRQChannel NVIC_IRQChannelPreemptionPriority NVIC_IRQChannelSubPriority NVIC_IRQChannelCmd Champ NVIC_IRQChannel, il indique l'interruption à programmer. Les valeurs possibles sont données dans le tableau suivant : ADC1_2_IRQn EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn EXTI9_5_IRQn EXTI15_10_IRQn TIM1_BRK_IRQn TIM1_UP_IRQn TIM1_TRG_COM_IRQn TIM1_CC_IRQn TIM2_IRQn TIM3_IRQn TIM4_IRQn TIM5_IRQn TIM6_IRQn TIM7_IRQn interruption globale pour ADC1 et ADC2 Interruption de la ligne externe 0 Interruption de la ligne externe 1 Interruption de la ligne externe 2 Interruption de la ligne externe 3 Interruption de la ligne externe 4 Interruptions des lignes externes 5 à 9 Interruptions des lignes externes 10 à 15 Interruption de Break de TIM1 Interruption de débordement de TIM1 Interruption trigger et communication de TIM1 Interruption de Capture Compare de TIM1 Interruption de TIM2 Interruption de TIM3 Interruption de TIM4 Interruption de TIM5 Interruption de TIM6 Interruption de TIM7 Champ NVIC_IRQChannelPreemptionPriority, il définit le niveau de préemption. Les valeurs possibles sont de 0 à 1, 2, 4 ou 15 selon le choix de découpage fait. Champ NVIC _IRQChannelSubPriority, il définit le niveau de sous priorité. Les valeurs possibles sont de 0 à 1, 2, 4 ou 15 selon le choix de découpage fait. Champ FunctionalState , il indique si cette interruption est générée ou pas vers le microcontrôleur. Les valeurs possibles sont : ENABLE ou DISABLE void NVIC_Init(structureDInitialisation *) • Le paramètre est un pointeur sur une structure de type NVIC_InitTypeDef dont les champs ont été remplis. Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 10 3.3 Procédures d'interruption Lorsqu'une interruption a été activée, sa prise en compte est faite par une procédure d'interruption dont le nom correspond à cette interruption. Les noms de ces procédures sont imposés et définis dans le tableau suivant : Cause de l'interruption Interruption nom de la procédure IT globale pour ADC1 et ADC2 IT de la ligne externe 0 IT de la ligne externe 1 IT de la ligne externe 2 IT de la ligne externe 3 IT de la ligne externe 4 ITs des lignes externes 9 à 15 ITs des lignes externes 10 à 15 IT de Break de TIM1 IT de débordement de TIM1 IT trigger et communication de TIM1 IT de Capture Compare de TIM1 IT de TIM2 IT de TIM3 IT de TIM4 IT de TIM5 IT de TIM6 IT de TIM7 ADC1_2_IRQn EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn EXTI9_5_IRQn EXTI15_10_IRQn TIM1_BRK_IRQn TIM1_UP_IRQn TIM1_TRG_COM_IRQn TIM1_CC_IRQn TIM2_IRQn TIM3_IRQn TIM4_IRQn TIM5_IRQn TIM6_IRQn TIM7_IRQn ADC1_2_IRQHandler EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler TIM1_BRK_IRQHandler TIM1_UP_IRQHandler TIM1_TRG_COM_IRQHandler TIM1_CC_IRQHandler TIM2_IRQHandler TIM3_IRQHandler TIM4_IRQHandler TIM5_IRQHandler TIM6_IRQHandler TIM7_IRQHandler 3.4 Guide d'utilisation du contrôleur d'interruptions 1. Déclarer une variable de type NVIC_InitTypeDef 2. Programmer le découpage entre préemption et priorités par la fonction NVIC_PriorityGroupConfig 3. Initialiser la variable de type NVIC_InitTypeDef avec l'interruption à programmer, le niveau de préemption, le niveau de priorité et activer ou désactiver l'IT 4. Programmer l'IT par la fonction NVIC_Init 5. Recommencer les étapes 3 et 4 pour chaque IT à programmer Les procédures d'interruption ont des noms prédéfinis du type : xxx_IRQHandler (voir tableau en 3.3). 4 Mémorisation des changements d'état des lignes et génération d'interruptions externes (EXTI) Il est parfois nécessaire de déclencher une action lorsqu'une ligne change d'état (passe de 0 à 1 ou de 1 à 0). Si un programme teste l'état d'une ligne et la trouve à 0, puis, plus tard, revient tester l'état de cette ligne et la trouve toujours à 0, comment savoir si entre ces deux tests elle n'est pas passée à 1 ? Pour résoudre ce problème les ports peuvent être programmés pour mémoriser de tels changements d'état. Un indicateur est alors positionné que le programme pourra lire puis effacer. De même les ports peuvent être programmés pour générer une interruption lors d'un changement d'état. Les lignes utilisées doivent avoir été programmées en mode entrée (GPIO_Mode_IN_FLOATING, GPIO_Mode_IPD ou GPIO_Mode_IPU) (voir 2.2). Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 11 4.1 Remise à l'état initial du détecteur de changements d'état et de génération d'interruptions La fonction suivante permet de mettre le détecteur de changements d'état et de génération d'interruptions dans son état initial (comme après un reset). Sa définition est la suivante : void EXTI_DeInit () 4.2 Choix de la ligne La fonction suivante permet de choisir la ligne dont on veut mémoriser les changements d'état ou que l'on veut utiliser en génération d'interruption : void GPIO_EXTILineConfig(port, ligne) • Le premier paramètre désigne le port dont on veut programmer une ligne. Il peut prendre les valeurs : GPIO_PortSourceGPIOA à GPIO_PortSourceGPIOE • Le deuxième paramètre désigne la ligne choisie. Les valeurs possibles sont : GPIO_PinSource0 à GPIO_PinSource15 4.3 Programmation de la ligne La fonction EXTI_Init permet d'initialiser les lignes d'un port pour détecter des changements d'état. Elle utilise comme paramètre une structure de données de type EXTI_InitTypeDef dont les champs sont les suivants : uint32_t EXTIMode_TypeDef EXTITrigger_TypeDef FunctionalState EXTI_Line EXTI_Mode EXTI_Trigger EXTI_LineCmd Avant d'être utilisée par EXTI_Init cette structure doit être initialisée par la fonction EXTI_StructInit définie comme suit : • Le paramètre est void EXTI_StructInit(structureDInitialisation *) un pointeur sur la structure de type EXTI_InitTypeDef à initialiser. Avant d'utiliser la fonction pour programmer les lignes il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ EXTI_Line, il désigne la ou les lignes du port à programmer. Les valeurs possibles pour ce champ sont : EXTI_Line0 à EXTI_Line15. On peut programmer plusieurs lignes en même temps en mettant dans ce paramètre plusieurs valeurs séparées par des + Champ EXTI_Mode, il indique si la ligne est programmée pour positionner un indicateur ou pour générer une interruption. Les valeurs possibles sont : EXTI_Mode_Event ou EXTI_Mode_Interrupt Champ EXTI_Trigger, il indique quels changements d'état sont pris en compte. Les valeurs possibles sont décrites dans le tableau ci-dessous : EXTI_Trigger_Falling EXTI_Trigger_Rising EXTI_Trigger_Rising_Falling Détection des fronts descendants (passages de 1 à 0) Détection des fronts montants (passages de 0 à 1) Détection de tous les changements (passages de 1 à 0 et de 0 à 1) Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 12 Champ EXTI_LineCmd, il permet d'activer ou de désactiver la détection de changement d'état sur la ligne. Les valeurs possibles sont : ENABLE ou DISABLE void EXTI_Init (structureDInitialisation *) • Le paramètre est un pointeur sur une structure de type EXTI_InitTypeDef préalablement initialisée par la fonction EXTI_StructInit puis dont les différents champs ont été remplis en fonction du fonctionnement désiré. 4.4 Indicateurs de changement d'état La fonction suivante permet de tester l'indicateur de changement d'état d'une ligne : FlagStatus EXTI_GetFlagStatus(ligne) • Le paramètre désigne la ligne du port dont on veut tester l'indicateur de changement d'état. Les valeurs possibles pour ce champ sont : EXTI_Line0 à EXTI_Line15. • La valeur renvoyée par la fonction est l'état de cet indicateur. Les valeurs possibles sont : SET ou RESET La fonction suivante permet d'effacer l'indicateur de changement d'état d'une ligne : void EXTI_ClearFlag(ligne) • Le paramètre désigne la ligne du port dont on veut effacer l'indicateur de changement d'état. Les valeurs possibles pour ce champ sont : EXTI_Line0 à EXTI_Line15. 4.5 Interruptions lors de changements d'état Une interruption peut être générée lors d'un changement d'état. Les procédures d'interruption associées sont EXTI0_IRQHandler pour les lignes 0 à EXTI4_IRQHandler pour les lignes 4, EXTI9_5_IRQHandler pour les lignes 5 à 9 qui sont regroupées en une seule interruption et EXTI15_10_IRQHandler pour les lignes 10 à 15 qui sont regroupées en une seule interruption (voir 3). La fonction suivante permet de tester si une interruption de changement d'état d'une ligne a été levée : ITStatus EXTI_GetITStatus(ligne) • Le paramètre désigne la ligne du port dont on veut tester l'interruption. Les valeurs possibles pour ce champ sont : EXTI_Line0 à EXTI_Line15. • La valeur renvoyée par la fonction est l'état de cette interruption. Les valeurs possibles sont : SET ou RESET La fonction suivante permet d'effacer l'indicateur d'interruption d'une ligne : void EXTI_ClearITPendingBit(ligne) • Le paramètre désigne la ligne du port dont on veut effacer l'interruption. Les valeurs possibles pour ce champ sont : EXTI_Line0 à EXTI_Line15. Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 13 4.6 Guide d'utilisation des lignes d'E/S en mémorisation d'états ou en génération d'interruptions 4.6.1 Marche à suivre pour initialiser des lignes d'E/S avec mémorisation d'état ou génération d'interruptions 1. Idem étape 1 du 2.8.1. 2. Déclarer une variable de type EXTI_InitTypeDef 3. Activer l'horloge du dispositif de mémorisation d'états et de génération d'ITs (AFIO) par la fonction RCC_APB2PeriphClockCmd 4. Initialiser le dispositif de mémorisation d'états ou de génération d'ITs par la fonction EXTI_DeInit 5. Programmer en entrée numérique la ligne utilisée (idem étapes 2 à 6 du 2.8.1). 6. Initialiser la variable de type EXTI_InitTypeDef par la fonction EXTI_StructInit 7. Dans la variable de type EXTI_InitTypeDef indiquer la ligne, le mode (mémorisation d'état ou génération d'IT), le front déclenchant et l'activer ou la désactiver 8. Programmer la détection par la fonction EXTI_Init 9. Choisir la ligne à utiliser par la fonction GPIO_EXTILineConfig 10. Recommencer les étapes 5 à 9 pour les autres lignes 4.6.2 Consulter/modifier des états mémorisés ou des indicateurs d'interruption des lignes d'E/S − Lecture de l'état mémorisé d'une ligne en entrée par la fonction EXTI_GetFlagStatus − Effacement de l'état mémorisé d'une ligne en entrée par la fonction EXTI_ClearFlag − Lecture de l'indicateur d'IT d'une ligne en entrée par la fonction EXTI_GetITStatus − Effacement de l'indicateur d'IT d'une ligne en entrée par la fonction EXTI_ClearITPendingBit 5 Les timers (TIM) Le STM32F107VC dispose de 7 timers. Les timers TIM2 à TIM5 sont des timers d'usage général. Les timers TIM6 et TIM7 sont des timers possédant moins de fonctionnalités. Le timer TIM1 est une version plus complète. Les fonctionnalités sont les suivantes : Fonctionnalité Compteur sur 16 bits Comptage en incrémentation ou décrémentation Rechargement automatique Pré division d'horloge Entrées pour capture Sorties pour génération de signaux Mode cycle unique Sorties complémentaires Contrôle du timer par lignes externes Interconnexion avec d'autres timers Horloge externe Déclenchement des convertisseurs A/N TIM1 OUI OUI OUI OUI OUI OUI OUI OUI OUI OUI OUI OUI TIM2 à TIM5 OUI OUI OUI OUI OUI OUI OUI NON OUI OUI OUI OUI sauf T5 TIM6 et TIM7 OUI OUI OUI OUI NON NON NON NON NON NON NON NON Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 14 5.1 Remise à l'état initial d'un timer La fonction TIM_DeInit permet de mettre un timer dans son état initial (comme après un reset) Sa définition est la suivante : void TIM_DeInit(timer) • Le paramètre désigne le timer à réinitialiser. Il peut prendre les valeurs : TIM1 à TIM7 5.2 Initialisation de la base de temps La fonction TIM_TimeBaseInit permet d'initialiser la base de temps d'un timer. Elle utilise comme paramètre une structure de données de type TIM_TimeBaseInitTypeDef dont les champs sont les suivants : uint16_t TIM_Prescaler uint16_t TIM_Period uint16_t TIM_CounterMode Avant d'être utilisée par TIM_TimeBaseInit cette structure doit être initialisée par la fonction TIM_TimeBaseStructInit définie comme suit : void TIM_TimeBaseStructInit(structureDInitialisation *) paramètre est un pointeur sur la structure de type TIM_TimeBaseInitTypeDef • Le initialiser. à Avant d'utiliser la fonction pour initialiser la base de temps d'un timer il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ TIM_Prescaler, il définit la division d'horloge à appliquer au timer. Les valeurs possibles pour ce champ sont 0 à 65535. La fréquence de l'horloge est divisée par cette valeur+1 de sorte qu'une valeur de 0 provoque une division de la fréquence d'horloge par 1 c'est-à-dire pas de division d'horloge. Champ TIM_Period, il définit la limite de comptage du timer (période). Les valeurs possibles pour ce champ sont 0 à 65535. Le timer parcours les valeurs de 0 à cette limite incluse. Champ TIM_CounterMode, il définit le mode de comptage du timer. Les valeurs possibles pour ce champ sont indiquées dans le tableau suivant : TIM_CounterMode_Up TIM_CounterMode_Down TIM_CounterMode_CenterAligned1 TIM_CounterMode_CenterAligned2 TIM_CounterMode_CenterAligned3 Le timer compte de 0 à TIM_Period. Le débordement est signalé au top d'horloge suivant lorsqu'il a atteint la valeur TIM_Period Le timer compte de TIM_Period à 0. Le débordement est signalé au top d'horloge suivant lorsqu'il a atteint la valeur 0 Le timer compte de 0 à TIM_Period puis de TIM_Period à 0. Le débordement est signalé lorsqu'il atteint la valeur TIM_Period Le timer compte de 0 à TIM_Period puis de TIM_Period à 0. Le débordement est signalé lorsqu'il atteint la valeur 0 Le timer compte de 0 à TIM_Period puis de TIM_Period à 0. Le débordement est signalé lorsqu'il atteint la valeur TIM_Period et lorsqu'il atteint la valeur 0 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 15 La fonction TIM_TimeBaseInit est définie comme suit : void TIM_TimeBaseInit(timer, structureDInitialisation *) • Le premier paramètre désigne le timer à initialiser. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre est un pointeur sur une structure de type TIM_TimeBaseInitTypeDef préparée par la fonction TIM_TimeBaseStructInit puis dont les champs ont été remplis en fonction du fonctionnement désiré. Remarque : la durée maximale que l'on peut atteindre en utilisant l'horloge interne à 72MHz (voir 0) est de 59,6 secondes (TIM_Prescaler à 65535 et TIM_Period à 65535). 5.3 Modification de la valeur du compteur Le compteur du timer évolue lorsque le timer fonctionne, il est possible d'en changer la valeur (en général on le fait lorsqu'il est arrêté) par la fonction : void TIM_SetCounter(timer, nouvelleValeur) Le premier paramètre désigne le timer dont on veut modifier le compteur. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre définit la nouvelle valeur du compteur du timer. Les valeurs possibles pour ce champ sont 0 à 65535. • 5.4 Modification de la période La période du timer, normalement définie par le champ TIM_Period lors de l'initialisation de la base de temps du timer, peut être modifiée sans refaire une initialisation complète de la base de temps par la fonction : void TIM_SetAutoreload(timer, nouvellePeriode) Le premier paramètre désigne le timer dont on veut modifier la période. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre définit la nouvelle limite de comptage du timer. Les valeurs possibles pour ce champ sont 0 à 65535. • 5.5 Mode unique ou répétitif Quel que soit le mode choisi le timer peut n'effectuer l'opération qu'une seule fois ou la répéter lorsqu'il a fini. Ce fonctionnement est programmé par la fonction suivante : void TIM_SelectOnePulseMode(timer, répétition) • Le premier paramètre désigne le timer à initialiser. Il peut prendre les valeurs : TIM1 à • Le second paramètre indique le choix de la répétition ou non. Les valeurs possibles sont : TIM_OPMode_Single ou TIM_OPMode_Repetitive TIM7 5.6 Lancement/arrêt d'un timer par programme void TIM_Cmd(timer, nouvelEtat) • Le premier paramètre désigne le timer à lancer ou arrêter. Il peut prendre les valeurs : TIM1 à TIM7 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 16 • Le second paramètre indique si le timer est lancé ou arrêté. Les valeurs possibles sont : ENABLE ou DISABLE 5.7 Lignes externes liées à un timer − Les timer 3 et 4 possèdent 5 lignes permettant de les piloter. Il s'agit des lignes CH1 à CH4 et de la ligne ETR. − Le timer 2 possède 4 lignes permettant de le piloter. Il s'agit des lignes CH1 à CH4 (la ligne ETR est la même que la ligne CH1). − Le timer 5 possède 4 lignes permettant de le piloter. Il s'agit des lignes CH1 à CH4 (il n'a pas de ligne ETR). − Le timer 1 possède les mêmes lignes que les timers 3 et 4 auxquelles viennent s'ajouter 4 lignes supplémentaires qui sont des lignes complémentaires CH1N à CH3N et la ligne de commande des sorties BKIN. − Les timers 6 et 7 n'ont pas de lignes permettant de les piloter. − Les lignes CH1 et CH2 peuvent être utilisées comme des entrées (reset, commande marche/arrêt, déclenchement et horloge externe) − Les lignes CH1 à CH4 peuvent être utilisées comme des sorties lorsque le timer sert à générer des signaux. − La ligne ETR ne peut être utilisée qu'en entrée (reset, commande marche/arrêt, déclenchement et horloge externe). Elle permet des réglages plus précis du fonctionnement que les lignes CH1 et CH2. Le tableau suivant indique les lignes physiques reliées aux timers. Ces lignes peuvent être redirigées (voir 2.9) : CH1 direct redirigé TIM1 TIM2 TIM3 PA8 PA0 PA6 (1) PE9 PC6 (2) PB4 PD12 CH2 direct redirigé PA9 PA1 PA7 PB6 PB7 PA0 PA1 (1) redirection totale de TIM1 (2) redirection partielle de TIM3 TIM4 TIM5 (1) PE11 PB3 PC7 (2) PB5 PD13 CH3 direct redirigé (1) CH4 direct redirigé (1) ETR direct redirigé PA10 PA2 PB0 PE13 PB10 PC8 PA11 PA3 PB1 PE14 PB11 PC9 PA12 PA0 PD2 PB8 PA2 PD14 PB9 PA3 PD15 PE0 (1) PE7 Les lignes spécifiques au timer 1 sont décrites dans le tableau suivant : TIM1 CHIN CH2N CH3N BKIN direct redirigé direct redirigé direct redirigé direct redirigé redirection partielle PB13 redirection totale PA7 PE8 PB14 PB0 PE10 PB15 PB1 PE12 PB12 PA6 PE15 Les lignes utilisées comme entrées pour les timers doivent avoir été programmées en mode GPIO_Mode_IN_FLOATING (voir 2.2 ). Les lignes utilisées comme sorties pour les timers doivent avoir été programmées en mode GPIO_Mode_AF_PP (voir 2.2 ). Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 17 5.8 Choix de l'horloge d'un timer Les choix possibles pour l'horloge d'un timer sont les suivants : Utilisation de l'horloge interne du microcontrôleur (72MHz) Horloge provenant de l'une des entrées CH1 ou CH2 du timer (front montant) Horloge provenant de l'entrée ETR du timer (choix du front montant ou descendant) et possibilité d'ajouter une pré division par 1 , 2 , 4 ou 8 Horloge provenant d'un autre timer (chaînage) 5.8.1 Horloge interne La fonction suivante permet de choisir de faire fonctionner un timer à partir de l'horloge du microcontrôleur (72MHz) : void TIM_InternalClockConfig(timer) • Le paramètre désigne le timer pour lequel on veut utiliser l'horloge interne. Il peut prendre les valeurs : TIM1 à TIM7 5.8.2 Horloge externe Pour utiliser les lignes CH1 ou CH2 comme horloges externes la fonction est la suivante : void TIM_ITRxExternalClockConfig(timer, ligneDHorloge) • Le premier paramètre désigne le timer à initialiser. Il peut prendre les valeurs : TIM1 à TIM5 • Le second paramètre désigne la ligne utilisée comme horloge externe (le front actif est le front montant). Les valeurs possibles sont décrites dans le tableau suivant : TIM_TS_TI1F_ED TIM_TS_TI1FP1 TIM_TS_TI2FP2 ligne CH1 directe ligne CH1 après filtrage interne ligne CH2 après filtrage interne Pour utiliser la ligne ETR comme horloge externe la fonction est la suivante : void TIM_ETRConfig(timer, prédivisionDHorloge, frontsDHorloge, filtrageDHorloge) • Le premier paramètre désigne le timer à initialiser. Il peut prendre les valeurs : TIM1 à TIM5 • Le deuxième paramètre permet d'appliquer une pré-division de cette horloge par 1, 2, 4 ou 8. Les valeurs possibles sont : TIM_ExtTRGPSC_OFF, TIM_ExtTRGPSC_DIV2 , TIM_ExtTRGPSC_DIV4 ou TIM_ExtTRGPSC_DIV8 • Le troisième paramètre indique si le timer compte sur les fronts descendants ou montants de cette horloge. Les valeurs possibles sont respectivement : TIM_ExtTRGPolarity_Inverted ou TIM_ExtTRGPolarity_NonInverted • Le dernier paramètre correspond au filtrage appliqué à cette ligne (plus la valeur est élevée plus la ligne est filtrée). Les valeurs possibles sont 0 à 15. Pour utiliser un autre timer comme horloge externe il faut utiliser le chaînage de timers (voir 5.9). 5.9 Chaînage de timers Les timers sont, a priori, indépendants. Lorsque l'on désire les chaîner il faut en désigner un comme maître (celui qui pilote) et l'autre comme esclave (celui qui est piloté). Le chaînage Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 18 permet de piloter un timer par un autre (reset, commande marche/arrêt, déclenchement ou horloge). Toutes les combinaisons de maître / esclave ne sont pas possibles : − Le timer 2 ne peut être piloté que par le 1, le 3 ou le 4 − Le timer 3 ne peut être piloté que par le 1, le 2, le 4 ou le 5 − Le timer 4 ne peut être piloté que par le 1, le 2 ou le 3 − Le timer 5 ne peut être piloté que par le 2, le 3 ou le 4 Pour établir le lien entre le maître et l'esclave (qui pilote qui) on utilise la fonction suivante : void TIM_ITRxExternalClockConfig(timerEsclave, timerMaître) • Le premier paramètre désigne le timer esclave à piloter. Il peut prendre les valeurs : TIM2 à TIM5 • Le second paramètre désigne le timer maître. Les valeurs possibles sont décrites dans le tableau suivant (les colonnes du tableau correspondent au timer esclave, les valeurs dans les cases indiquent quel est le timer maître) : timer esclave : TIM2 TIM3 TIM4 TIM5 TIM_TS_ITR0 TIM_TS_ITR1 TIM_TS_ITR2 TIM_TS_ITR3 TIM1 TIM3 TIM4 TIM1 TIM2 TIM5 TIM4 TIM1 TIM2 TIM3 TIM2 TIM3 TIM4 Le timer maître doit être programmé pour piloter le timer esclave. Ceci est obtenu par la fonction suivante : void TIM_SelectOutputTrigger(timerMaître, EvénementDePilotage) • • Le premier paramètre désigne le timer maître. Il peut prendre les valeurs : TIM1 à TIM5 Le deuxième paramètre indique quel événement du timer maître est transmis au timer esclave. Les valeurs possibles sont décrites dans le tableau ci-dessous : TIM_TRGOSource_Reset TIM_TRGOSource_Enable TIM_TRGOSource_Update TIM_TRGOSource_OC1Ref TIM_TRGOSource_OC2Ref TIM_TRGOSource_OC3Ref TIM_TRGOSource_OC4Ref Evénement d'initialisation du timer Evénement de mise en marche du timer Evénement de rechargement du timer Evénement de capture déclenchée par CH1 ou activation du signal de sortie sur CH1 Evénement de capture déclenchée par CH2 ou activation du signal de sortie sur CH2 Evénement de capture déclenchée par CH3 ou activation du signal de sortie sur CH3 Evénement de capture déclenchée par CH4 ou activation du signal de sortie sur CH4 Le timer esclave doit être programmé pour être piloté par le timer maître. Ceci est obtenu par la fonction suivante : void TIM_SelectSlaveMode(timerEsclave, commandePilotée) • • Le premier paramètre désigne le timer esclave. Il peut prendre les valeurs : TIM2 à TIM5 Le deuxième paramètre indique comment le timer esclave est piloté par le timer maître. les valeurs possibles sont décrites dans le tableau ci-dessous : TIM_SlaveMode_Reset TIM_SlaveMode_Gated Le maître pilote le reset du timer esclave (front montant) Le maître pilote la commande marche/arrêt du timer esclave (niveau 1) Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 19 TIM_SlaveMode_Trigger TIM_SlaveMode_External1 Le maître pilote le démarrage du timer esclave (front montant) Le maître pilote l'horloge du timer esclave (front montant) Par exemple pour que le timer 2 utilise comme horloge les événements de rechargement du timer 3, on fera : TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR2); // TIM3 pilote TIM2 TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); // l'évt transmis par TIM3 est le débordement TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); // TIM2 utilise cet événement comme horloge Remarque : la durée maximale que l'on peut atteindre, à partir de l'horloge interne à 72MHz, en chaînant deux timers est de 2 965 333 jours soit un peu plus de 8000 ans (TIM_Prescaler à 65535 et TIM_Period à 65535 sur le timer maître et le timer esclave). 5.10 Pilotage d'un timer par des lignes externes Les lignes CH1 et CH2 peuvent être utilisées pour piloter un timer (reset, commande marche / arrêt et déclenchement). Pour cela il faut choisir la ligne à utiliser puis configurer le timer pour qu'il soit piloté par cette ligne. Le choix de la ligne de pilotage se fait par la fonction suivante : TIM_SelectInputTrigger(timer, ligne) • • Le premier paramètre désigne le timer à piloter. Il peut prendre les valeurs : TIM1 à TIM5 Le second paramètre indique la ligne choisie. Les valeurs possibles sont décrites dans le tableau ci-dessous : TIM_TS_TI1F_ED TIM_TS_TI1FP1 TIM_TS_TI2FP2 ligne CH1 ligne CH1 après filtrage interne ligne CH2 après filtrage interne La désignation de ce que pilote cette ligne se fait par la fonction suivante : void TIM_SelectSlaveMode(timer, commandePilotée) • • Le premier paramètre désigne le timer piloté. Il peut prendre les valeurs : TIM1 à TIM5 Le deuxième paramètre indique comment le timer est piloté par la ligne. les valeurs possibles sont décrites dans le tableau ci-dessous : TIM_SlaveMode_Reset TIM_SlaveMode_Gated TIM_SlaveMode_Trigger La ligne pilote le reset du timer (front montant) La ligne pilote la commande marche/arrêt du timer (niveau 1) La ligne pilote le démarrage du timer (front montant) 5.11 Capture La capture consiste à copier la valeur du compteur du timer dans l'un des registres CCR1 à CCR4 lors de la détection d'un ou plusieurs fronts (montants ou descendants) sur l'entrée choisie (CH1 à CH4). Un indicateur est positionné ou une interruption peut être générée à chaque capture. Le choix de la ligne d'entrée et du mode de capture se fait par la fonction TIM_ICInit qui prend en paramètre un pointeur sur une structure de type TIM_ICInitTypeDef qui doit avoir au préalable été initialisée puis dont les champs sont remplis. La structure TIM_ICInitTypeDef possède les champs suivants : uint16_t TIM_Channel Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 20 uint16_t TIM_ICPolarity uint16_t TIM_ICPrescaler Avant d'être utilisée par TIM_ICInit cette structure doit être initialisée par la fonction : void TIM_ICStructInit(structureDInitialisation *) • Le paramètre est un pointeur sur la structure à initialiser. Avant d'utiliser la fonction pour initialiser une ligne de capture il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ TIM_Channel, il indique la ligne d'entrée (CH1 à CH4) et donc le registre dans lequel est mise la valeur capturée. Les valeurs possibles sont : TIM_Channel_1 à TIM_Channel_4 Champ TIM_ICPolarity, il indique le front (montant ou descendant) actif de cette ligne. Les valeurs possibles sont : TIM_ICPolarity_Rising ou TIM_ICPolarity_Falling Champ TIM_ICPrescaler, il indique le nombre de fronts à détecter sur la ligne avant de déclencher la capture (1, 2, 4 ou 8). Les valeurs possibles sont : TIM_ICPSC_DIV1 , TIM_ICPSC_DIV2 , TIM_ICPSC_DIV4 ou TIM_ICPSC_DIV8 L'initialisation de la ligne se fait alors par la fonction : void TIM_ICInit(timer, structureDInitialisation *) Le premier paramètre désigne le timer dont on veut capturer la valeur. Il peut prendre les valeurs : TIM1 à TIM5 • Le second paramètre est un pointeur sur la structure initialisée. • Lors d'une capture, la valeur capturée est placée dans le registre lié à la ligne choisie par le champ TIM_Channel. Pour lire cette valeur on utilise, en fonction du registre, les fonctions : uint16_t TIM_GetCapture1(timer) uint16_t TIM_GetCapture2(timer) uint16_t TIM_GetCapture3(timer) uint16_t TIM_GetCapture4(timer) • Le paramètre désigne le timer dont on veut lire la valeur capturée. Il peut prendre les valeurs : TIM1 à TIM5 • La valeur de retour est la dernière valeur capturée 5.12 Création de signaux de sortie Un timer peut générer un signal de sortie sur les lignes CH1 à CH4. Selon que le timer a été programmé en mode unique ou répétitif (voir 0) le signal peut être répété ou non. La ligne utilisée pour cette sortie doit avoir été initialisée en entrée numérique (voir 2.2). Signal simple : quand le timer atteint la valeur contenue dans l'un des registres CCR1 à CCR4 la sortie prend l'état choisi (0 ou 1). Ceci permet de faire changer l'état d'une ligne après un délai donné puisque le signal devient actif quand le timer atteint CCRi (delai). Que le timer soit mis ou non en mode répétitif ne change rien : la sortie ne bascule que la première fois que le timer atteint CCRi et reste dans cet état. Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 21 Signal carré : La sortie change d'état chaque fois que le timer atteint la valeur définie comme période. La fréquence est donc déterminée par le double de cette valeur. Signal à modulation de largeur d'implusion : La fréquence est déterminée par la valeur définie comme période du timer et le rapport cyclique par l'un des registres CCR1 à CCR4. Le choix de la ligne de sortie se fait par les fonctions TIM_OCxInit (où x vaut 1, 2, 3 ou 4 selon la ligne de sortie choisie) qui prennent en paramètre un pointeur sur une structure de type TIM_OCInitTypeDef qui doit avoir au préalable été initialisée puis dont les champs ont été remplis. La structure TIM_OCInitTypeDef possède les champs suivants : uint16_t uint16_t uint16_t uint16_t TIM_OCMode TIM_OutputState TIM_Pulse TIM_OCPolarity Avant d'être utilisée par les fonctions TIM_OCxInit cette structure doit être initialisée par la fonction : void TIM_OCStructInit(structureDInitialisation *) • Le paramètre est un pointeur sur la structure à initialiser. Avant d'utiliser la fonction pour initialiser une ligne de génération de signaux il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ TIM_OCMode, il indique le mode de fonctionnement de la ligne de sortie. Les valeurs possibles sont décrites par le tableau ci-dessous : TIM_OCMode_Timing TIM_OCMode_Active TIM_OCMode_Toggle TIM_OCMode_PWM1 La sortie n'est pas utilisée Mode signal simple : le signal de sortie prend la valeur définie par le champ TIM_OCPolarity quand le timer atteint la valeur de CCRi Mode signal carré : le signal de sortie change d'état chaque fois que le timer atteint la valeur définie comme période. Le champ TIM_Pulse ne sert à rien dans ce mode. La valeur initiale du signal de sortie est définie par le champ TIM_OCPolarity Mode modulation de largeur d'impulsion : − Si le timer est mis en mode incrémentation la sortie prend la valeur définie par le champ TIM_OCPolarity tant que le timer est < CCRi puis est inversée jusqu'à ce que le timer atteigne la valeur de la période du timer. − Si le timer est mis en mode décrémentation la sortie prend la valeur inverse de celle définie par le champ TIM_OCPolarity tant que le timer est > CCRi puis prend la valeur définie par le champ TIM_OCPolarity jusqu'à ce que le timer atteigne 0. − Si le timer est mis en mode centré le signal de sortie prend la valeur définie par le champ TIM_OCPolarity tant que le timer est < CCRi et la valeur inverse quand il est ≥ CCRi Champ TIM_OutputState, il permet de relier la sortie du timer à la ligne physique ou pas. Les valeurs possibles sont : TIM_OutputState_Disable ou TIM_OutputState_Enable Remarque : pour le timer 1, la sortie doit en plus être activée par l'appel de la fonction : TIM_CtrlPWMOutputs(TIM1, ENABLE); Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 22 Champ TIM_Pulse, il contient la valeur à mettre dans le registre CCRi. Les valeurs possibles sont 0 à 65535. Champ TIM_OCPolarity, il permet de choisir le niveau (0 ou 1) présent sur la ligne de sortie lorsqu'elle est active. Les valeurs possibles sont : TIM_OCPolarity_High ou TIM_OCPolarity_Low Selon la ligne choisie (CH1 à CH4), l'initialisation de la ligne se fait alors par l'une des fonctions : void TIM_OC1Init(timer, structureDInitialisation *) void TIM_OC2Init(timer, structureDInitialisation *) void TIM_OC3Init(timer, structureDInitialisation *) void TIM_OC4Init(timer, structureDInitialisation *) • • Le premier paramètre désigne le timer utilisé. Il peut prendre les valeurs : TIM1 à TIM5 Le second paramètre est un pointeur sur la structure initialisée. Le contenu des registres CCRi utilisés pour la génération de signaux peut être modifié sans réinitialiser les lignes par les fonctions : void TIM_SetCompare1(timer, nouvelleValeurDeCCR1) void TIM_SetCompare2(timer, nouvelleValeurDeCCR2) void TIM_SetCompare3(timer, nouvelleValeurDeCCR3) void TIM_SetCompare4(timer, nouvelleValeurDeCCR4) Le premier paramètre désigne le timer dont on veut modifier le contenu du registre CCRi. Il peut prendre les valeurs : TIM1 à TIM5 • Le second paramètre définit la nouvelle valeur à mettre dans le registre CCRi. Les valeurs possibles sont 0 à 65535. • 5.13 Tests de l'état d'un timer Le contenu d'un timer peut être lu même lorsqu'il est en fonctionnement par la fonction : uint16_t TIM_GetCounter(timer) Le paramètre désigne le timer à lire. Il peut prendre les valeurs : TIM1 à TIM7 • La valeur de retour est le contenu du compteur du timer au moment de la lecture • Lors de certains événements des indicateurs peuvent être positionnés par le timer. Ces indicateurs pourront par la suite être testés par programme pour savoir quels événements se sont produits. La fonction permettant de définir les événements que le timer doit mémoriser dans ces indicateurs est la suivante : void TIM_GenerateEvent(timer, événement) Le premier paramètre désigne le timer pour lequel on veut que les événements soient mémorisés. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre désigne le ou les événements à mémoriser. Les valeurs possibles sont décrites dans le tableau suivant (plusieurs valeurs peuvent être sélectionnées en même temps en les séparant par des | ) : • TIM_EventSource_Update TIM_EventSource_CC1 Rechargement du timer Evénement déclenchant une capture sur CH1 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 23 TIM_EventSource_CC2 TIM_EventSource_CC3 TIM_EventSource_CC4 TIM_EventSource_Trigger Ou quand le timer atteint la valeur contenue dans CCR1 Evénement déclenchant une capture sur CH2 Ou quand le timer atteint la valeur contenue dans CCR2 Evénement déclenchant une capture sur CH3 Ou quand le timer atteint la valeur contenue dans CCR3 Evénement déclenchant une capture sur CH4 Ou quand le timer atteint la valeur contenue dans CCR4 Evénement de commande du timer (déclenchement, marche/arrêt ou reset) L'état de ces indicateurs peut être lu par la fonction : FlagStatus TIM_GetFlagStatus(timer, indicateurDEvénement) Le premier paramètre désigne le timer pour lequel on veut lire un indicateur. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre désigne l'indicateur à lire. Les valeurs possibles sont décrites dans le tableau suivant: • TIM_FLAG_Update TIM_FLAG_CC1 TIM_FLAG_CC2 TIM_FLAG_CC3 TIM_FLAG_CC4 TIM_FLAG_Trigger Rechargement du timer Evénement déclenchant une capture sur CH1 Ou quand le timer atteint la valeur contenue dans CCR1 Evénement déclenchant une capture sur CH2 Ou quand le timer atteint la valeur contenue dans CCR2 Evénement déclenchant une capture sur CH3 Ou quand le timer atteint la valeur contenue dans CCR3 Evénement déclenchant une capture sur CH4 Ou quand le timer atteint la valeur contenue dans CCR4 Evénement de commande du timer (déclenchement, marche/arrêt ou reset) • La valeur en retour indique l'état de cet indicateur. Les valeurs possibles sont : SET ou RESET. Les indicateurs peuvent être effacés par la fonction : void TIM_ClearFlag(timer, indicateurDEvénement) Le premier paramètre désigne le timer pour lequel on veut effacer les indicateurs. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre désigne l'indicateur à effacer. Les valeurs possibles sont celles du second paramètre de la fonction précédente. Il est possible d'effacer plusieurs indicateurs à le fois en plaçant plusieurs valeurs séparées par des + . • 5.14 Génération d'interrutions Lors de certains événements des interruptions peuvent être générées par le timer. Les procédures associées sont décrites en 3. La fonction permettant de choisir les événements pour lesquels le timer doit générer des interruptions est la suivante : void TIM_ITConfig(timer, interrution, nouvelEtat) • Le premier paramètre désigne le timer pour lequel on veut activer ou désactiver les interruptions. Il peut prendre les valeurs : TIM1 à TIM7 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 24 • Le deuxième paramètre désigne l'interruption à activer ou désactiver. Les valeurs possibles sont décrites dans le tableau suivant: TIM_IT_Update TIM_IT_CC1 TIM_IT_CC2 TIM_IT_CC3 TIM_IT_CC4 TIM_IT_Trigger Rechargement du timer Evénement déclenchant une capture sur CH1 Ou quand le timer atteint la valeur contenue dans CCR1 Evénement déclenchant une capture sur CH2 Ou quand le timer atteint la valeur contenue dans CCR2 Evénement déclenchant une capture sur CH3 Ou quand le timer atteint la valeur contenue dans CCR3 Evénement déclenchant une capture sur CH4 Ou quand le timer atteint la valeur contenue dans CCR4 Evénement de commande du timer (déclenchement, marche/arrêt ou reset) • Le dernier paramètre indique si l'interruption doit être activée ou désactivée. Les valeurs possibles sont ENABLE ou DISABLE. L'état de ces interruptions peut être testé par la fonction : ITStatus TIM_GetITStatus(timer, interruption) Le premier paramètre désigne le timer pour lequel on veut tester l'état des interruptions. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre désigne l'interruption à tester. Les valeurs possibles sont les mêmes que pour le deuxième paramètre de la fonction précédente. • La valeur en retour indique l'état de cette interruption. Les valeurs possibles sont : SET ou RESET. • Lorsqu'une interruption est prise en compte, son état doit être effacé, ceci est fait par la fonction : void TIM_ClearITPendingBit(timer, interruption) Le premier paramètre désigne le timer pour lequel on veut effacer l'état des interruptions. Il peut prendre les valeurs : TIM1 à TIM7 • Le second paramètre désigne l'interruption à effacer. Les valeurs possibles sont les mêmes que pour le deuxième paramètre de la fonction précédente. • 5.15 Guide d'utilisation des timers 5.15.1 Marche à suivre pour initialiser les timers 1. Déclarer une variable de type TIM_TimeBaseInit 2. Initialiser le timer par la fonction : TIM_DeInit 3. Activer l'horloge du timer par la fonction RCC_APB1PeriphClockCmd pour le timer1 ou RCC_APB2PeriphClockCmd pour les autres timers. 4. Initialiser la variable de type TIM_TimeBaseInit par la fonction TIM_TimeBaseStructInit 5. Définir dans la variable de type TIM_TimeBaseInit les paramètres du timer : division d'horloge, période (valeur limite) et mode de comptage 6. Programmer le timer par la fonction TIM_TimeBaseInit 7. Choisir le mode répétitif ou non par la fonction TIM_SelectOnePulseMode 8. Choisir d'utiliser une horloge interne ou externe par l'une des fonctions : − TIM_InternalClockConfig pour l'horloge interne Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 25 − TIM_ITRxExternalClockConfig pour une horloge pilotée par la ligne CH1 (avec ou sans filtrage) ou par la ligne CH2 − TIM_ETRConfig pour une horloge pilotée par la ligne ETR 9. Autoriser, si nécessaire, la mémorisation de certains états du timer par la fonction TIM_GenerateEvent 10. Autoriser, si nécessaire, la génération de certaines ITs par la fonction TIM_ITConfig 11. Recommencer les étapes 2 à 10 pour chaque timer à programmer 12. Lancer chaque timer par la fonction TIM_Cmd 5.15.2 Commander un timer par une ligne externe 1. Suivre les étapes 1 à 10 comme en 5.15.1 2. Choisir la ligne de commande (CH1 ou CH2) par la fonction TIM_SelectInputTrigger 3. Choisir la fonction à commander par la fonction TIM_SelectSlaveMode La ligne utilisée pour la commande du timer doit avoir été programmée en mode ). GPIO_Mode_IN_FLOATING (voir 2.2 5.15.3 Utiliser le mode de capture déclenchée par une ligne externe 1. 2. 3. 4. Déclarer une variable de type TIM_ICInitTypeDef Suivre les étapes 1 à 10 comme en 5.15.1 Initialiser la variable de type TIM_ICInitTypeDef par la fonction TIM_ICStructInit Définir dans la variable de type TIM_ICInitTypeDef la ligne de commande (CH1 à CH4), le front de déclenchement de la commande et le nombre d'événements pour activer la commande (1, 2, 4 ou 8) 5. Programmer la capture par la fonction TIM_ICInit La ligne utilisée pour la GPIO_Mode_IN_FLOATING (voir 2.2 capture ). doit avoir été programmée en mode 5.15.4 Utiliser un timer pour générer des signaux sur une ligne externe 1. 2. 3. 4. Déclarer une variable de type TIM_OCInitTypeDef Suivre les étapes 1 à 10 comme en 5.15.1 Initialiser la variable de type TIM_OCInitTypeDef par la fonction TIM_OCStructInit Définir dans la variable de type TIM_OCInitTypeDef le type de signal (mono coup, carré, MLI), l'envoi ou non du signal généré sur la ligne de sortie, la largeur d'impulsion (sauf pour le signal carré) et la polarité (niveau actif 0/1) 5. Programmer la capture par l'une des fonctions TIM_OC1Init à TIM_OC4Init selon la ligne de sortie choisie (CH1 à CH4) La ligne utilisée comme sortie doit avoir été programmée en mode GPIO_Mode_AF_PP (voir 2.2 ). 5.15.5 Chaîner deux timers 1. Suivre les étapes 1 à 10 comme en 5.15.1 pour chacun des deux timers 2. Indiquer quel est le timer maître (celui qui pilote l'autre) et quel est le timer esclave (celui qui est piloté) par la fonction TIM_ITRxExternalClockConfig Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 26 3. Pour le timer maître indiquer l'événement utilisé pour piloter l'autre timer par la fonction TIM_SelectOutputTrigger 4. Pour le timer esclave indiquer la commande pilotée par l'autre timer par la fonction TIM_SelectSlaveMode 5.15.6 Consulter/modifier des états mémorisés ou des ITs de timers − Lecture de l'état mémorisé d'un timer par la fonction : TIM_GetFlagStatus − Effacement de l'état mémorisé d'un timer par la fonction : TIM_ClearFlag − Lecture de l'indicateur d'IT d'un timer par la fonction : TIM_GetITStatus − Effacement de l'indicateur d'IT d'un timer par la fonction : TIM_ClearITPendingBit 6 Convertisseur Analogique / Numérique (ADC) Le microcontrôleur possède 2 convertisseurs analogique/numérique. Ils peuvent être utilisés pour faire des mesures en mode continu ou non. Le déclenchement d'une mesure peut être fait par programme ou par un timer (à intervalles réguliers). Il est également possible de définir des seuils minimaux et maximaux, lorsque la valeur mesurée sort de ces seuils le convertisseur positionne un indicateur et peut lever une interruption. 6.1 Remise à l'état initial d'un convertisseur La fonction ADC_DeInit permet de mettre un convertisseur dans son état initial (comme après un reset). Sa définition est la suivante : void ADC_DeInit(convertisseur) • Le paramètre désigne le convertisseur. Les valeurs possibles sont : ADC1 ou ADC2 6.2 Initialisation d'un convertisseur La fonction ADC_Init permet d'initialiser un convertisseur. Elle utilise comme paramètre une structure de données de type ADC_InitTypeDef dont les champs sont les suivants : FunctionalState uint32_t ADC_ContinuousConvMode; ADC_ExternalTrigConv; Avant d'être utilisée par ADC_Init cette structure doit être initialisée par la fonction ADC_StructInit définie comme suit : • Le paramètre est void ADC_StructInit(structureDInitialisation *) un pointeur sur la structure de type ADC_InitTypeDef à initialiser. Avant d'utiliser la fonction pour initialiser un convertisseur il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ ADC_ContinuousConvMode, il indique si le convertisseur effectue des mesures en continu ou pas. Les valeurs possibles sont : ENABLE ou DISABLE. En mode continu dès qu'une mesure est terminée le convertisseur redémarre la suivante. Ce mode n'est donc utilisable qu'avec un déclenchement par programme (voir second paramètre). Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 27 Champ ADC_ExternalTrigConv, il indique comment sont déclenchées les conversions (par programme ou par un timer). Les valeurs possibles sont décrites dans le tableau ci-dessous : ADC_ExternalTrigConv_T1_CC3 ADC_ExternalTrigConv_None ADC_ExternalTrigConv_T1_CC1 ADC_ExternalTrigConv_T1_CC2 ADC_ExternalTrigConv_T2_CC2 ADC_ExternalTrigConv_T3_TRGO ADC_ExternalTrigConv_T4_CC4 Déclenchement par TIM1_CH3 Déclenchement par programme Déclenchement par TIM1_CH1 Déclenchement par TIM1_CH2 Déclenchement par TIM2_CH2 Déclenchement par le trigger du TIM3 Déclenchement par TIM4_CH4 Remarque : Lorsque les conversions sont déclenchées par timer le premier paramètre doit être DISABLE. void ADC_Init(convertisseur, structureDInitialisation *) Le premier paramètre désigne le convertisseur à initialiser. Il peut prendre les valeurs : ADC1 ou ADC2 • Le second paramètre est un pointeur sur une structure de type ADC_InitTypeDef préparée par la fonction ADC_StructInit puis dont les champs ont été remplis en fonction du fonctionnement désiré. • 6.3 Mise en marche/arrêt d'un convertisseur Elle se fait par la fonction : void ADC_Cmd(convertisseur, nouvelEtat) Le premier paramètre désigne le convertisseur à lancer ou arrêter. Il peut prendre les valeurs : ADC1 ou ADC2 • Le second paramètre indique si le convertisseur est mis en marche ou arrêté. Les valeurs possibles sont : ENABLE ou DISABLE • 6.4 Lignes d'entrée des convertisseurs Les deux convertisseurs partagent les mêmes lignes d'entrée. Ils ont 18 canaux d'entrée les 16 premiers sont connectés à 16 lignes d'entrée externes et les deux derniers à deux entrées internes correspondant à un capteur de température et à une tension de référence de 3,3V. Les 16 lignes utilisables comme entrées externes sont les suivantes : canal 0 canal 1 canal 2 canal 3 canal 4 canal 5 canal 6 canal 7 canal 8 canal 9 canal 10 canal 11 canal 12 canal 13 canal 14 canal 15 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PC0 PC1 PC2 PC3 PC4 PC5 Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 28 Les lignes utilisées comme entrées des convertisseurs doivent être programmées en mode analogique (GPIO_Mode_AIN) (voir 2.2). 6.5 Choix de l'entrée à convertir Il faut définir la ligne sur laquelle est effectuée la mesure et la façon dont le convertisseur effectue cette mesure. void ADC_RegularChannelConfig(convertisseur, canalDEntrée, 1, tempsDEchantillonage) • Le premier paramètre désigne le convertisseur dont on configure l'entrée. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre indique l'entrée du convertisseur configurée. Les valeurs possibles sont : ADC_Channel_0 à ADC_Channel_15 , ADC_Channel_TempSensor , ADC_Channel_Vrefint Le troisième paramètre doit être à 1 (ce paramètre n'a de sens que dans un mode de fonctionnement particulier que nous n'utiliserons pas). • Le dernier paramètre indique le nombre de cycles d'horloges attendus avant que la mesure ne soit faite pour assurer que le signal d'entrée soit stable. Les valeurs possibles sont celles décrites dans le tableau suivant : • ADC_SampleTime_1Cycles5 ADC_SampleTime_7Cycles5 ADC_SampleTime_13Cycles5 ADC_SampleTime_28Cycles5 ADC_SampleTime_41Cycles5 ADC_SampleTime_55Cycles5 ADC_SampleTime_71Cycles5 ADC_SampleTime_239Cycles5 1.5 cycles 7.5 cycles 13.5 cycles 28.5 cycles 41.5 cycles 55.5 cycles 71.5 cycles 239.5 cycles 6.6 Lecture d'une mesure Les valeurs mesurées sont sur 12 bits (0 à 4095) pour une tension d'entrée comprise entre 0 et 3,3V. La fonction suivante permet de récupérer la dernière mesure faite : uint16_t ADC_GetConversionValue(convertisseur) Le paramètre désigne le convertisseur dont on lit la mesure. Il peut prendre les valeurs : ADC1 ou ADC2 • La valeur de retour est la dernière mesure faite (elle doit être mise en forme par un ET avec la valeur 0x0FFF) • 6.7 Lancement de conversion par programme Lorsque le champ ADC_ExternalTrigConv a été initialisé pour un déclenchement par programme, ce déclenchement est fait par la fonction : void ADC_SoftwareStartConvCmd(convertisseur, nouvelEtat) Le premier paramètre désigne le convertisseur à lancer. Il peut prendre les valeurs : ADC1 ou ADC2 • Le second paramètre indique si le convertisseur est lancé ou pas. Les valeurs possibles sont : ENABLE ou DISABLE • Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 29 6.8 Déclenchement du convertisseur par commande externe Lorsque le champ ADC_ExternalTrigConv a été initialisé pour un déclenchement externe (par timer), ce déclenchement est activé par la fonction : void ADC_ExternalTrigConvCmd(convertisseur, nouvelEtat) Le premier paramètre désigne le convertisseur dont on configure le déclenchement. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre active ou désactive le déclenchement externe. Les valeurs possibles sont : ENABLE ou DISABLE • Le timer utilisé pour déclencher les mesures doit être programmé : − Pour sa base de temps par la fonction TIM_BaseInit (division d'horloge, mode et période) − Pour produire un signal de sortie sur le canal adéquat par la fonction TIM-OCxInit en choisissant le mode TIM_OCMode_PWM1, une durée d'impulsion de 1 et en validant la sortie avec un niveau actif à 1). La ligne physique reliée au timer n'a pas besoin d'être programmée pour sa fonction alternative en mode numérique sauf si elle est également utilisée comme sortie. 6.9 Mise en place du contrôle de seuils analogiques Il est possible de définir des seuils minimaux et maximaux, lorsque la valeur mesurée sort de ces seuils le convertisseur positionne un indicateur et peut lever une interruption. La fonction utilisée pour mettre en place ce contrôle de seuil est : void ADC_AnalogWatchdogCmd(convertisseur, entréesConcernées) Le premier paramètre désigne le convertisseur dont on configure le contrôle de seuils. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre indique comment s'applique le contrôle de seuils. Les valeurs possibles sont données dans le tableau ci-dessous : • ADC_AnalogWatchdog_SingleRegEnable ADC_AnalogWatchdog_None Contrôle de seuil sur l'entrée Pas de contrôle de seuil La définition des seuils se fait par la fonction suivante : void ADC_AnalogWatchdogThresholdsConfig(convertisseur, seuilHaut, seuilBas) Le premier paramètre désigne le convertisseur dont on configure les seuils. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre définit le seuil maximal (valeur entre 0 et 4095) • Le troisième paramètre définit le seuil minimal (valeur entre 0 et 4095) • La fonction suivante permet d'indiquer l'entrée à contrôler : void ADC_AnalogWatchdogSingleChannelConfig(convertisseur, canalContrôlé) Le premier paramètre désigne le convertisseur dont on configure l'entrée contrôlée. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre indique la ligne à contrôler. Les valeurs possibles sont : ADC_Channel_0 à ADC_Channel_17 • Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 30 6.10 Tests de l'état d'un convertisseur La fonction suivante permet de lire l'état d'un convertisseur : FlagStatus ADC_GetFlagStatus(convertisseur, étatALire) Le premier paramètre désigne le convertisseur dont on teste l'état. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre désigne l'état à lire. Les valeurs possibles sont : • ADC_FLAG_AWD ADC_FLAG_EOC ADC_FLAG_STRT Lecture de l'indicateur de dépassement des seuils de contrôle Lecture de l'indicateur de fin de conversion Lecture de l'indicateur de début de conversion • La valeur en retour indique l'état de cet indicateur. Les valeurs possibles sont : SET ou RESET. Lorsqu'un indicateur a été lu il est possible de l'effacer par la fonction : void ADC_ClearFlag(convertisseur, étatAEffacer) • Les deux paramètres sont les mêmes que pour la fonction précédente 6.11 Gestion des interruptions d'un convertisseur On peut programmer les convertisseurs pour qu'ils génèrent une interruption en fin de conversion ou lorsque les seuils de contrôle ont été dépassés. Les procédures associées sont décrites en 3. Le choix des motifs d'interruption est fait par la fonction suivante : void ADC_ITConfig(convertisseur, interruption, nouvelEtat) Le premier paramètre désigne le convertisseur dont on configure les interruptions. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre désigne le motif d'interruption choisi (on peut activer ou désactiver les deux interruptions en même temps en mettant dans ce paramètre les deux valeurs possibles séparées par + ). Les valeurs possibles sont : • ADC_IT_EOC ADC_IT_AWD Interruption causée par une fin de conversion Interruption causée par un dépassement des seuils de contrôle • Le dernier paramètre indique si l'on veut activer ou désactiver cette interruption. Les valeurs possibles sont : ENABLE ou DISABLE Lorsqu'une interruption se produit, on peut consulter la raison pour laquelle elle a eu lieu grâce à la fonction : ITStatus ADC_GetITStatus(convertisseur, interruption) Le premier paramètre désigne le convertisseur dont on teste une interruption. Il peut prendre les valeurs : ADC1 ou ADC2 • Le deuxième paramètre désigne le motif d'interruption testé (mêmes valeurs que pour le deuxième paramètre de la fonction précédente). • La valeur renvoyée par cette fonction indique si l'interruption testée a eu lieu ou pas. Les valeurs possibles sont SET ou RESET. • Enfin pour effacer un indicateur d'interruption on utilise la fonction : Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 31 void ADC_ClearITPendingBit(convertisseur, interruption) • Les deux paramètres sont les mêmes que pour la fonction précédente. 6.12 Guide d'utilisation des convertisseurs 6.12.1 Marche à suivre pour initialiser les convertisseurs A/N 1. 2. 3. 4. 5. Déclarer une variable de type ADC_InitTypeDef Activer l'horloge du convertisseur par la fonction RCC_APB2PeriphClockCmd Réinitialiser ce convertisseur par la fonction ADC_DeInit Initialiser la variable de type ADC_InitTypeDef par la fonction ADC_StructInit Dans cette variable indiquer le mode mono/multi mesures et l'utilisation ou pas d'un déclenchement par timer 6. Programmer le convertisseur par la fonction ADC_Init 7. Choisir la ligne d'entrée et programmer le temps de conversion par la fonction ADC_RegularChannelConfig 8. Autoriser si nécessaire la génération de certaines ITs par la fonction ADC_ITConfig 9. Activer le convertisseur par la commande ADC_Cmd Les lignes utilisées comme entrées des convertisseurs doivent être programmées en mode analogique (GPIO_Mode_AIN) (voir 2.2). 6.12.2 Déclencher un convertisseur A/N par programme − La conversion est lancée par la fonction ADC_SoftwareStartConvCmd. Si le mode de conversion est continu le convertisseur recommencera automatiquement une mesure dès que la précédente sera terminée, sinon il devra être relancé par la fonction ADC_SoftwareStartConvCmd. 6.12.3 Déclencher un convertisseur A/N par un timer 1. Programmer le timer de déclenchement pour générer un signal sur l'une de ses sorties en mode PWM1 avec une largeur d'impulsion de 1 au niveau haut (voir chapitre sur les timers). Le timer et la sortie choisis doivent correspondre aux commandes possibles du convertisseur. 2. Suivre les étapes 1 à 9 comme en 6.12.1 Marche à suivre pour initialiser les convertisseurs A/N. Le convertisseur doit être mis en mode mono mesure puisqu'il est relancé par le timer. 3. Autoriser la commande du convertisseur par ce timer par la fonction ADC_ExternalTrigConvCmd 4. Activer le convertisseur par la commande ADC_Cmd 6.12.4 Lire une mesure sur un convertisseur A/N − Elle se fait par la fonction : ADC_GetConversionValue comme seulement 12 bits sont significatifs la valeur renvoyée par cette fonction doit être ajustée par une opération de ET avec 0x0FFF 6.12.5 Changer l'entrée à convertir − On peut changer la ligne d'entrée et programmer le temps de conversion sur cette ligne par la fonction ADC_RegularChannelConfig. Si le convertisseur est en mode mono Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 32 mesure, le changement de l'entrée ne peut être que fait lorsque la conversion en cours est terminée. S'il est en mode continu, il faut l'arrêter par la fonction ADC_SoftwareStartConvCmd avant de changer l'entrée. 6.12.6 Utiliser le contrôle de seuils sur un convertisseur A/N 1. Suivre les étapes 1 à 9 comme en 6.12.1. 2. Choisir comment s'applique le contrôle de seuil par la fonction ADC_AnalogWatchdogCmd 3. Définir l'entrée sur laquelle s'applique le contrôle de seuils par la fonction ADC_AnalogWatchdogSingleChannelConfig 4. Définir les seuils haut et bas par la fonction ADC_AnalogWatchdogThresholdsConfig 5. Activer le convertisseur par la commande ADC_Cmd 6.12.7 Consulter/modifier des états mémorisés ou des ITs de convertisseurs A/N − Lecture de l'état mémorisé d'un convertisseur par la fonction : ADC_GetFlagStatus − Effacement de l'état mémorisé d'un convertisseur par la fonction : ADC_ClearFlag − Lecture de l'indicateur d'IT d'un convertisseur par la fonction : ADC_GetITStatus − Effacement de l'indicateur d'IT d'un convertisseur par la fonction : ADC_ClearITPendingBit 7 Convertisseur numérique / analogique (DAC) Le STM32F107VC dispose de 2 convertisseurs numérique/analogique. Ils permettent de générer des niveaux analogiques. Le DAC peut également être programmé pour ajouter au signal produit un niveau de bruit ou un signal triangulaire. 7.1 Remise à l'état initial d'un convertisseur La fonction DAC_DeInit permet de mettre un convertisseur dans son état initial (comme après un reset). Sa définition est la suivante : void DAC_DeInit(convertisseur) • Le premier paramètre désigne le convertisseur. Les valeurs possibles sont : DAC_Channel_1 ou DAC_Channel_2 7.2 Initialisation d'un convertisseur La fonction DAC_Init permet d'initialiser un convertisseur. Elle utilise comme paramètre une structure de données de type DAC_InitTypeDef dont les champs sont les suivants : uint32_t DAC_WaveGeneration uint32_t DAC_LFSRUnmask_TriangleAmplitude uint32_t DAC_OutputBuffer Avant d'être utilisée par DAC_Init cette structure doit être initialisée par la fonction DAC_StructInit définie comme suit : void DAC_StructInit(structureDInitialisation *) Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 33 • Le paramètre est un pointeur sur la structure de type DAC_InitTypeDef à initialiser. Avant d'utiliser la fonction pour initialiser un convertisseur il faut remplir les champs de cette structure en utilisant valeurs suivantes : Champ DAC_WaveGeneration, il indique si le convertisseur ajoute un bruit ou un signal triangulaire au signal produit. Les valeurs possibles sont décrites dans le tableau suivant : DAC_WaveGeneration_None DAC_WaveGeneration_Noise DAC_WaveGeneration_Triangle Aucun signal n'est ajouté Ajout d'un bruit Ajout d'un signal triangulaire Champ DAC_LFSRUnmask_TriangleAmplitude, il indique le niveau de bruit ou de signal triangulaire ajouté au signal produit. Le signal ajouté modifie un ou plusieurs bits de la valeur écrite dans le DAC, ce paramètre permet de choisir le nombre de bits modifiés donc l'amplitude du signal ajouté. Les valeurs possibles sont décrites dans le tableau suivant : DAC_LFSRUnmask_Bit0 DAC_LFSRUnmask_Bit1_0 DAC_LFSRUnmask_Bit2_0 DAC_LFSRUnmask_Bit3_0 DAC_LFSRUnmask_Bit4_0 DAC_LFSRUnmask_Bit5_0 DAC_LFSRUnmask_Bit6_0 DAC_LFSRUnmask_Bit7_0 DAC_LFSRUnmask_Bit8_0 DAC_LFSRUnmask_Bit9_0 DAC_LFSRUnmask_Bit10_0 DAC_LFSRUnmask_Bit11_0 DAC_TriangleAmplitude_1 DAC_TriangleAmplitude_3 DAC_TriangleAmplitude_7 DAC_TriangleAmplitude_15 DAC_TriangleAmplitude_31 DAC_TriangleAmplitude_63 DAC_TriangleAmplitude_127 DAC_TriangleAmplitude_255 DAC_TriangleAmplitude_511 DAC_TriangleAmplitude_1023 DAC_TriangleAmplitude_2047 DAC_TriangleAmplitude_4095 Ajout de bruit : seul le bit 0 est modifié Ajout de bruit : seuls les bits 0 et 1 sont modifiés Ajout de bruit : les bits 0 à 2 sont modifiés Ajout de bruit : les bits 0 à 3 sont modifiés Ajout de bruit : les bits 0 à 4 sont modifiés Ajout de bruit : les bits 0 à 5 sont modifiés Ajout de bruit : les bits 0 à 6 sont modifiés Ajout de bruit : les bits 0 à 7 sont modifiés Ajout de bruit : les bits 0 à 8 sont modifiés Ajout de bruit : les bits 0 à 9 sont modifiés Ajout de bruit : les bits 0 à 10 sont modifiés Ajout de bruit : les bits 0 à 11 sont modifiés Ajout d'un signal triangulaire d'amplitude 1 Ajout d'un signal triangulaire d'amplitude 3 Ajout d'un signal triangulaire d'amplitude 7 Ajout d'un signal triangulaire d'amplitude 15 Ajout d'un signal triangulaire d'amplitude 31 Ajout d'un signal triangulaire d'amplitude 63 Ajout d'un signal triangulaire d'amplitude 127 Ajout d'un signal triangulaire d'amplitude 255 Ajout d'un signal triangulaire d'amplitude 511 Ajout d'un signal triangulaire d'amplitude 1023 Ajout d'un signal triangulaire d'amplitude 2047 Génération d'un signal triangulaire d'amplitude 4095 Champ DAC_OutputBuffer, il permet d'activer ou non l'amplificateur placé en sortie du DAC. Les valeurs possibles sont : DAC_OutputBuffer_Enable ou DAC_OutputBuffer_Disable void DAC_Init(convertisseur, structureDInitialisation *) Le premier paramètre désigne le convertisseur à initialiser. Il peut prendre les valeurs : DAC_Channel_1 ou DAC_Channel_2 • Le second paramètre est un pointeur sur une structure de type DAC_InitTypeDef préparée par la fonction DAC_StructInit puis dont les champs ont été remplis en fonction du fonctionnement désiré. • Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 34 7.3 Lancement d'un convertisseur par programme Le lancement d'un convertisseur se fait par la fonction suivante : void DAC_Cmd(convertisseur, nouvelEtat) Le premier paramètre désigne le convertisseur à lancer. Il peut prendre les valeurs : DAC_Channel_1 ou DAC_Channel_2 • Le second paramètre indique si le convertisseur est lancé ou pas. Les valeurs possibles sont : ENABLE ou DISABLE • 7.4 Lignes de sortie des convertisseurs DAC1 sur DAC2 sur PA4 PA5 Les lignes utilisées comme sorties analogiques doivent être programmées en mode sortie analogique (voir 2.2). 7.5 Ecriture d'une valeur dans un convertisseur Elle se fait par les fonctions : void DAC_SetChannel1Data(tailleEtAlignement, valeur) void DAC_SetChannel2Data(tailleEtAlignement, valeur) • Le premier paramètre indique la taille et la façon dont sont alignées les valeurs écrites dans le DAC. Il peut prendre les valeurs décrites dans le tableau suivant : DAC_Align_12b_R DAC_Align_12b_L DAC_Align_8b_R Données écrites sur 12 bits cadrés à droite Données écrites sur 12 bits cadrés à gauche Données écrites sur 8 bits cadrés à droite • Le second paramètre contient la valeur à écrire qui est contenue dans un mot de 16 bits et doit correspondre au format décrit par le premier paramètre. 7.6 Lecture de la valeur d'un convertisseur On peut lire la valeur actuellement contenue dans un convertisseur par la fonction : uint16_t DAC_GetDataOutputValue(convertisseur) Le paramètre désigne le convertisseur à lire. Il peut prendre les valeurs : DAC_Channel_1 ou DAC_Channel_2 • La valeur de retour est celle contenue dans ce convertisseur. • 7.7 Guide d'utilisation des convertisseurs N/A 7.7.1 Marche à suivre pour initialiser les convertisseurs N/A 1. 2. 3. 4. 5. Déclarer une variable de type DAC_InitTypeDef Activer l'horloge du convertisseur par la fonction RCC_APB1PeriphClockCmd Réinitialiser ce convertisseur par la fonction DAC_DeInit Initialiser la variable de type DAC_InitTypeDef par la fonction DAC_StructInit Dans cette variable indiquer si un amplificateur est ou pas placé en sortie et si un signal doit être ajouté. Dans ce cas indiquer s'il s'agit d'un signal de bruit ou d'un signal triangulaire et quelle est son amplitude Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 35 6. Programmer le convertisseur par la fonction DAC_Init 7. Activer le convertisseur par la commande DAC_Cmd 8. Recommencer les étapes 3 à 7 pour chaque convertisseur Les lignes utilisées comme sorties analogiques doivent être programmées en mode sortie analogique (voir 2.2). 7.7.2 Ecrire une valeur à convertir en analogique − L'écriture de la valeur à convertir se fait par la fonction DAC_SetChannel1Data ou DAC_SetChannel2Data selon le convertisseur, cette fonction permet également de préciser la taille et l'alignement de la valeur. 7.7.3 Lire la valeur actuellement convertie en analogique − La lecture de la valeur actuellement convertie se fait par la fonction DAC_GetDataOutputValue Programmation des périphériques du microcontrôleur STM32F107VC M. Dalmau – IUT de Bayonne Pays-Basque 36