1-STM32 GPIO Reg
1-STM32 GPIO Reg
1-STM32 GPIO Reg
2
INTRODUCTION
3
Objectifs
4
Plateforme embarquée à utiliser:
STM32 F4Discovery
5
Architecture de l’STM32
Architecture de type RISC (Reduced Instructions Set Computer) Bus des Instructions et
bus des Données sont séparés -> Architecture Harvard.
CPU CortexM4 fait le calcul à la cadence du Bus (AHB: ARM Hi-Speed Bus).
Les périphériques, moins rapides, sont montés sur les Bus APB1 et APB2.
Dans le cas d’un tansfert DMA (Direct Memory Acces) c-à-d d’une adresse mémoire ou
d’une périphérique vers une autre, le DMA devient le maître du bus AHB.
I-bus
Flash I/F
D-bus FLASH
CORTEX-M4
Master 1
System
BusMatrix
SRAM
Slave
APB2
Peripheral Bus APB2
AHB AHB-APB2
GP-DMA
Master 2 APB1
AHB-APB1
Peripheral Bus APB1
Arbiter Bridges
6
Architecture détaillée d’un STM32 F40x
CORTEXTM-M4 CPU
24 MHz
Flash I/F
256KB-512kB Power Supply
Reg 1.8V
Flash Memory
POR/PDR/PVD
Bridge
1 x 16-bit PWM Synchronized AC Timer
10 x 16-bit Timer
1 x CEC
ARM® Peripheral Bus
7
Tools and Software
• Outils de
développements
– IAR Embedded Workbench
IDE à utiliser:
– kEIL µVision IDE
http://www.keil.com/uvision/
– Raisonnance Ride7
– MikroC Pro for ARM
– CooCox (riche en exemples)
– Circle OS (couche applicative de
l’OS circleOS)
– CubeMX: Outil graphique L’outil de configuration à
permettant de configurer un STM32
utiliser:
et générer le code associé.
http://www.st.com/en/develop
ment-tools/stm32cubemx.html
– La plupart des outils sont bâtis
autour de CMSIS - Cortex
Microcontroller Software Interface
Standard:
http://www.keil.com/pack/doc/CM
SIS/General/html/index.html
8
8
9
• E/S bidirectionnels de STM32
GPIO standard (tolère une valeur de 5v en entrée) et génère une
sortie de 3v
GPIOs délivre un courant 25mA
Temps de montée en sorite configurable (max 100 MHz)
Toutes les pines peuvent être programmeés comme entrée
analogique
Toutes les pines peuvent être programmeés en fonctions alternés
(USARTx, TIMx, I2Cx, SPIx,…)
Toute entrée pourrait être configurée comme source d’interruption
9 ports de GPIO standard (GPIOA..GPIOI) (1 port = 16 pines d’E/S)
Push-Pull Open-Drain
Registres de contrôle des GPIOs
• Pour la manipulation des 9 GPIOx(x=A..I), nous avons recours à
l’utilisation des registres de contrôle suivants:
15
GPIO port mode register
(GPIOx_MODER) (x = A..I)
GPIO port output type register
(GPIOx_OTYPER) (x = A..I)
GPIO port output speed register
(GPIOx_OSPEEDR) (x = A..I)
GPIO port pull-up/pull-down register
(GPIOx_PUPDR) (x = A..I/)
20
GPIO port input data register
(GPIOx_IDR) (x = A..I)
GPIO port output data register
(GPIOx_ODR) (x = A..I)
Les Autres
Autres Registres
registres GPIOGPIO
24
L’adresse d’un registre d’un périphérique donnée est la somme de:
l’adresse de base d’un périphérique
l’adresse d’offset du registre
l’adresse de base d’un périphérique est définie dans le memory map (Table
10 page 71 de la datasheet STM32F40x)
Les adresses d’offset des registres sont définies dans la description des
registres du RM (Table 32 pages 203/204 du fichier « Reference Manual » de
STM32F40x)
26
@ d’offset des registres GPIOs
Table 32 pages 203/204 du « Reference Manual » de
STM32F40x
Suite …
Suite …
Exemples de calcul des adresses
?
• GPIOC_ODR
• GPIOA_AFRH
• GPIOB_PUPDR
30
30
Exemples de calcul des adresses
Calculer les adresses des registres suivants:
32
RCC ( Reset Clock Control) est le contrôleur de la circuiterie de Reset est
d’horloge.
Permet de synchroniser les trois bus du Cortex-M4 (AHB, APB1 et APB2) avec
le bus interne du système le bus matrix
Les GPIOs sont montés sur le bus AHB1. Tout GPIO(composant en général)
doit être activé par RCC avant utilisation.
36
Applications: 4 Leds et Bouton utilisateurs de
STM32f4Discovery
Principe de programmation des registres (1/5)
PROG = f(registres)
La programmation dans ce cas consiste à :
ETAPE 1: Définir les registres à utiliser: chaque registre est équivalent à
une adresse donc un pointeur en langage C
ETAPE 2: Initialiser ces pointeurs par les adresses adéquates
ETAPE 3: Lecture et/ou écriture des contenus des registres
- Lecture: lire l’état du système
- Ecriture: commander le système
Principe de programmation des registres (2/5)
ETAPE 1: Définir les adresses des registres
//RCC_AHB1ENR
volatile unsigned int * AHB1_ENR =(unsigned int*) 0x40023830;
//RCC_AHB1ENR
volatile unsigned int * AHB1_RSTR =(unsigned int*) 0x40023810;
int main() {
…..
// SET GPIOD DENIT ….
*AHB1_RSTR |= 1<<3; ….
// RESET GPIOD DENIT …..
*AHB1_RSTR &= ~(1<<3); …..
…..
// Enable GPIOD Clock
*AHB1_ENR |= 1<<3; // SPEED = 50 Mhz bits 25-24 = 0-1
*DSPEED &= 0xFCFFFFFF;
// Configuration MODREG *DSPEED |= 0x01000000;
// bits 25-24 = 01
*MODREG &= 0xFCFFFFFF; // Bits 25-24 = 00
*MODREG |= 0x01000000; *PUPPDR &= 0xFCFFFFFF;
// Bit 12 = 0
*DOTYPE &= ~(1<<12);
Principe de programmation des registres (5/5)
ETAPE 3 suite: Lecture/écriture dans les registres
while(1){
*DODR |= 1<<12;
tempo(0xffffff);
}
Code complet de l’application (1/2)
50
Interprétation des macros dans STM32F4xx.h
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00U)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000U)
#define PERIPH_BASE 0x40000000U
AHB1PERIPH_BASE sera remplacé par 0x40000000U + 0x00020000U = 0x40020000U. Le suffixe
U est utilisé pour forcer le compilateur à utiliser le type Unsigned int pour une constante.
GPIOD_BASE sera alors remplacé par 0x40020000U + 0x0C00U = 0x40020C00U
GPIOD par 0x40020C00U. Cette valeur sera convertie en une adresse sur GPIO_TypeDef:
#define GPIOD (GPIO_TypeDef *) 0x40020C00U
53
Exemple
• Modifier l’exemple de la première
partie:
54
Compléter ?