Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

EXERCICE: Interfaçage Clavier/STM32

Inputs: PA1 : PullDown, PA5..2: NoPull, All outputs use Low speed / Push Pull / Pull Down
Exercice: Interfaçage STM32/Clavier

1 – Déterminer les registres à utiliser

Registre GPIOA GPIOB


(PA0..PA5: (ouptuts)
inputs)
MODER YES YES
OTYPER NO YES
OSPEEDR NO YES
PUPDR YES YES
IDR YES NO
ODR No YES
BSRR No YES
1 – Déterminer les registres à utiliser - les adresses

Reg : Offset GPIOA : 0x40020000


MODER : 0x00 GPIOB : 0x40020400
OTYPER : 0x04
Registre GPIOA GPIOB OSPEEDR: 0x08
MODER YES YES PUPDR : 0x0C
OTYPER NO YES IDR : 0x10 Registre GPIOA GPIOB

OSPEEDR NO YES ODR : 0x14 MODER 0x40020000 0x40020400

PUPDR YES YES BSRR : 0x18 OTYPER NO 0x40020404

IDR YES No
OSPEEDR NO 0x40020408

ODR No YES
PUPDR 0x4002000C 0x4002040C

BSRR No YES
IDR 0x40020010 No
ODR No 0x40020414
BSRR No 0x40020418
1 – Déterminer les registres à utiliser - Déclaration (code)

Registre GPIOA GPIOB #define GPIOA_MODER (uint32_t*) 0x40020000


#define GPIOA_PUPDR (uint32_t*) 0x4002000C
MODER 0x40020000 0x40020400
#define GPIOA_IDR (uint32_t*) 0x40020010
OTYPER NO 0x40020404

OSPEEDR NO 0x40020408 #define GPIOB_MODER (uint32_t*) 0x40020000

PUPDR 0x4002000C 0x4002040C #define GPIOB_OTYPER (uint32_t*) 0x40020004


#define GPIOB_OSPEEDR (uint32_t*) 0x40020008
IDR 0x40020010 No
#define GPIOB_PUPDR (uint32_t*) 0x4002000C
ODR No 0x40020414
#define GPIOB_ODR (uint32_t*) 0x40020014
BSRR No 0x40020418
#define GPIOB_BSRR (uint32_t*) 0x40020018
2 – Configuration & Initialisation (GPIOA)

INPUT:00
PullDown: 10
NoPull : 00

PA5 PA4 PA3 PA2 PA1


MODER 31..30 5..4 3..2 1..0
*GPIOA_MODER&= ~ ( 0x03FFu <<2)
(GPIOA) 00 00 00 00 00

PA5 PA4 PA3 PA2 PA1


PUPDR
31..30 5..4 3..2 1..0 *GPIOA_PUPDR &= ~ ( 0x03u <<2)
(GPIOA)
00 00 00 00 10 *GPIOA_PUPDR |= 0x02<<2

*GPIOA_PUPDR &= ~ ( 0xFFu <<4)


OUTPUT:01
2 – Configuration & Initialisation (GPIOB) PullDown: 10
Low_Spped : 00
Output PP :0

PB8 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0


31.. 19.. 17.. 15.. 13.. 11.. 9..8 7..6 5..4 3..2 1..0 &= ~ ( 0x03FFFFu)
30 18 16 14 12 10
MODER 01 01 01 01 01 01 01 01
01 |= 0x015555

PB8 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0


31.. 19.. 17.. 15.. 13.. 11.. 9..8 7..6 5..4 3..2 1..0 &= ~ ( 0x03FFFFu)
30 PUPDR 18 16 14 12 10

10 10 10 10 10 10 10 10 10 |= 0x2AAAA

PB8 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0


31.. 19.. 17.. 15.. 13.. 11.. 9..8 7..6 5..4 3..2 1..0
30 18 16 14 12 10 &= ~ ( 0x3FFFFu)
OSPEEDR
00 00 00 00 00 00 00 00 00

PB8 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0


8 7 6 5 4 3 2 1 0
OTYPER &= ~ ( 0x1FFu)
0 0 0 0 0 0 0 0 0
3 – Fonctionnement While (1)
{
If (*GPIOA_IDR & 0x01)
Non {
Eteindre Test appui *GPIOB_BSRR = 0x1<<8;
Led (PA0)
uint8_t touche = (*GPIOA & 0x003C) >>2;
Oui
if (touche = = code)
Allumer Led (PA1) {
*GPIOB_BSRR = 0x3F;
*GPIOB_BSRR = 0x0C <<16;
Lire Touche }
else
Non
{
Afficher Touche =
‘H’ code? *GPIOB_BSRR = 0x76;
Oui *GPIOB_BSRR = 0x89<<16;
}
Afficher ‘0’
}
else
*GPIOB_BSRR = 0x01<<24; //8+16
}
4 – Solution complète
#define GPIOA_MODER (uint32_t*) 0x40020000
While (1)
#define GPIOA_PUPDR (uint32_t*) 0x4002000C {
#define GPIOA_IDR (uint32_t*) 0x40020010 If (*GPIOA_IDR & 0x01)
#define GPIOB_MODER (uint32_t*) 0x40020000 {
*GPIOB_BSRR = 0x1<<8;
#define GPIOB_OTYPER (uint32_t*) 0x40020004
uint8_t touche = (*GPIOA & 0x003C) >>2;
#define GPIOB_OSPEEDR (uint32_t*) 0x40020008
if (touche = = code)
#define GPIOB_PUPDR (uint32_t*) 0x4002000C {
#define GPIOB_ODR (uint32_t*) 0x40020014 *GPIOB_BSRR = 0x3F;
#define GPIOB_BSRR (uint32_t*) 0x40020018 *GPIOB_BSRR = 0x0C <<16;
}
main
{ else
*GPIOA_MODER&= ~ ( 0x03FFu <<2); {
*GPIOA_PUPDR &= ~ ( 0x03u <<2); *GPIOB_BSRR = 0x76;
*GPIOA_PUPDR |= 0x02<<2;
*GPIOB_BSRR = 0x89<<16;
*GPIOA_PUPDR &= ~ ( 0xFFu <<4);
}
*GPIOB_MODER &= ~ ( 0x03FFFFu); }
*GPIOB_MODER |= 0x015555; else
*GPIOB_PUPDR &= ~ ( 0x03FFFFu);
*GPIOB_PUPDR |= 0x2AAAA;
*GPIOB_BSRR = 0x01<<24; //8+16
*GPIOB_OSPEEDR &= ~ ( 0x3FFFFu); }
*GPIOB_OTYPER &= ~ ( 0x1FFu);

You might also like