Académique Documents
Professionnel Documents
Culture Documents
Frédéric Rousseau
IESE3 S6
2022–2023
C embarqué Fonctionnement et programmation Interruptions
Objectifs de la séance
I Types de données pour l’embarqué
I Opérations arithmétiques et logiques pour l’embarqué
I Principes de fonctionnement et de programmation
I Interruptions
I Une petite démo
#include <stdint.h>
. . .
int8_t ...; /∗ équivalent à char ∗/
uint8_t ...; /∗ équivalent à unsigned char ∗/
int16_t ...;
uint16_t ...;
int32_t ...; /∗ Valeur entre et -2 147 483 648 et 2 147 483 647 ∗/
uint32_t ...; /∗ Valeur entre 0 et 4 294 967 295 ∗/
int64_t ...;
uint64_t ...;
/∗ exemple ∗/
int32_t var1 = 12;
uint16_t var2;
Opérateurs de décalage en C
{ uint8_t x,y;
x = 0xa5;
y = x >> 6;
x = x << y; } /∗ équivalent à: x <<= y; ∗/
Attention :
I Ne pas confondre avec les opérateur booléens ! && ||
I Masque OU
I mise à 1 des bits 1 du masque
I xxxxxxxx OU 00000110 = xxxxx11x
I en langage C : x |= 0x06;
I Masque ET
I mise à 0 des bits 0 du masque
I xxxxxxxx ET 10101111 = x0x0xxxx
I en langage C : x &= 0xaf;
I plus couramment : x &= ~0x50;
I Masque OUex
I inversion des bits 1 du masque
I xxxxxxxx OUex 00101000 = xxx̄xx̄xxx
I en langage C : x ^= 0x28;
Test de bits
I Utilisation dans les tests :
I On utilise un masque ET pour mettre à 0 les bits non testés
I On peut éventuellement décaler les bits à tester
Exemple : la fonction _putchar de la carte STM32
char _putchar(uint8_t caractere) {
/∗ Wait until bit TXE of USART = 1 (TDR not busy) ∗/
while ((USART2.SR & 0x80) == 0)
;
/∗ Write data in USART Data Reg. ∗/
USART2.DR = caractere & 0x7F;
}
ms.a = 0;
ms.b = ’r’;
/∗ initialisation ∗/
struct MaStructure ms2 = {1, 3000000, ’z’};
. . .
extern volatile struct NVIC_registers NVIC;
extern volatile struct STK_registers SysTick;
extern volatile struct GPIO_registers GPIOA;
extern volatile struct USART_registers USART2;
. . .
Microcontrôleurs II - S6 — F. Rousseau Cours 6 IESE3 S6 — 2022–2023
C embarqué Fonctionnement et programmation Interruptions
Mapping en mémoire
Le fichier /link/stm32f446.ld contient les adresses associées à
chaque périphérique
. . .
NVIC = 0xE000E100;
SysTick = 0xE000E010;
. . .
GPIOA = 0x40020000;
. . .
USART2 = 0x40004400;
. . .
int main() {
. . .
/∗ Enable Systick 1 ms (1000 Hz) ∗/
SysTick_init(1000);
. . .
main:
push (lr)
Contenu du main /∗ enable GPIOC ∗/
I Valider les GPIOC (PC13) bl enable_GPIOC
I Valider le contrôleur /∗ Enable SYSCFG on APB2 ∗/
système SYSFIG sur le bl enable_SYSCFG
bus APB2
/∗ enable PC13 input from button ∗/
I Utiliser pour rediriger
bl enable_button2PC13
l’une des lignes d’entrée
extérieure vers les GPIO /∗ IRQ init from PC13 ∗/
bl init_IRQ_PC13
I Valider le bouton sur PC13
loop:
I Valider les interruptions sur b loop
PC13
pop {pc}
Initialisation et utilisation
I Le bouton poussoir est sur PB8 - init de GPIOB8
I L’initialisation se fait simplement par
int main() {
enable_GPIOB();
enable_SYSCFG();
int main() {
enable_GPIOB();
enable_SYSCFG();
/∗ Enable button on PB8 ∗/
button_init();
/∗ Enable interrupts (user button PB8)∗/
button_irq_init();
. . .
}
Extrait Wikipedia : Une variable volatile est une variable sur laquelle aucune
optimisation de compilation n’est appliquée. Le préfixe volatile est notamment
utilisé quand la variable d’un programme peut être modifiée par ailleurs.
Microcontrôleurs II - S6 — F. Rousseau Cours 6 IESE3 S6 — 2022–2023
C embarqué Fonctionnement et programmation Interruptions
char cr;
scanf("%c", &cr);
printf("%c\r\n", cr);
. . .
}