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