Vous êtes sur la page 1sur 34

Chapitre-II STM32

Programmation GPIO par HAL

Plan

Plan 2
Plan 2
Plan 2
Plan 2
2
2
Introduction 3
Introduction 3
Introduction 3

Introduction

Introduction 3
Introduction 3
Introduction 3
3
3

Objectifs

• Accéder aux registres GPIO (ou Autres) comme prédéfinis dans la bibliothèque HAL STM32

• Comprendre les APIs et les utiliser pour programmer les GPIOs

• Générer un projet de configuration par le logiciel STM32 Cube-MX

4
4

Présentation des APIs GPIAO

• Les APIs GPIO du HAL sont les suivants:

– HAL_GPIO_Init()

– HAL_GPIO_DeInit()

– HAL_GPIO_ReadPin()

– HAL_GPIO_WritePin()

– HAL_GPIO_TogglePin ().

• En plus des modes standards (input, output, analog), chaque broche (PINE) peut être configurée en mode

– EXTI

– EVENT.

• Lorsque le mode EXTI est utilisé:

– L’utilisateur doit appeler la fonction HAL_GPIO_EXTI_IRQHandler() dans le fichier stm32f4xx_it.c

– L’utilisateur doit implémenter la fonction HAL_GPIO_EXTI_Callback()

5
5
HAL_GPIO_INIT 6
HAL_GPIO_INIT 6
HAL_GPIO_INIT 6

HAL_GPIO_INIT

HAL_GPIO_INIT 6
HAL_GPIO_INIT 6
HAL_GPIO_INIT 6
6
6

Description du HAL_GPIO_Init

Function Name void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init) Function Description
Function
Name
void HAL_GPIO_Init (GPIO_TypeDef * GPIOx,
GPIO_InitTypeDef * GPIO_Init)
Function
Description
Initializes the GPIOx peripheral according to the specified
parameters in the GPIO_Init
 GPIOx: where x can be (A
I)
to select the GPIO peripheral
Parameters
 GPIO_Init: pointer to a GPIO_InitTypeDef structure that
contains the configuration information for the specified GPIO
peripheral.
Return
none
values
7

typedef struct { uint32_t Pin; uint32_t Mode; uint32_t Pull; uint32_t Speed; uint32_t Alternate; }GPIO_InitTypeDef;

GPIO_InitTypeDef

uint32_t GPIO_InitTypeDef::Pin Specifies the GPIO pins to be configured. This parameter can be any value of GPIO_pins_define

uint32_t GPIO_InitTypeDef::Mode Specifies the operating mode for the selected pins. This parameter can be a value of GPIO_mode_define

uint32_t GPIO_InitTypeDef::Pull Specifies the Pull-up or Pull-Down activation for the selected pins. This parameter can be a value of GPIO_pull_define

uint32_t GPIO_InitTypeDef::Speed Specifies the speed for the selected pins. This parameter can be a value of GPIO_speed_define

uint32_t GPIO_InitTypeDef::Alternate Peripheral to be connected to the selected pins. This parameter can be a value of GPIO_Alternate_function_selection

8
8

typedef struct {

uint32_t

Pin;

uint32_t

Mode;

uint32_t

Pull;

uint32_t

Speed;

uint32_t

Alternate;

}GPIO_InitTypeDef;

GPIO_InitTypeDef::PIN

#define

GPIO_PIN_0

((uint16_t)0x0001U)

#define

GPIO_PIN_1

((uint16_t)0x0002U)

#define

GPIO_PIN_2

((uint16_t)0x0004U)

#define

GPIO_PIN_3

((uint16_t)0x0008U)

#define

GPIO_PIN_4

((uint16_t)0x0010U)

#define

GPIO_PIN_5

((uint16_t)0x0020U)

#define

GPIO_PIN_6

((uint16_t)0x0040U)

#define

GPIO_PIN_7

((uint16_t)0x0080U)

#define

GPIO_PIN_8

((uint16_t)0x0100U)

#define

GPIO_PIN_9

((uint16_t)0x0200U)

#define

GPIO_PIN_10

((uint16_t)0x0400U)

#define

GPIO_PIN_11

((uint16_t)0x0800U)

#define

GPIO_PIN_12

((uint16_t)0x1000U)

#define

GPIO_PIN_13

((uint16_t)0x2000U)

#define

GPIO_PIN_14

((uint16_t)0x4000U)

#define

GPIO_PIN_15

((uint16_t)0x8000U)

#define

GPIO_PIN_All

((uint16_t)0xFFFFU)

9
9

typedef struct {

uint32_t

Pin;

uint32_t

Mode;

uint32_t

Pull;

uint32_t

Speed;

uint32_t

Alternate;

}GPIO_InitTypeDef;

GPIO_InitTypeDef::MODE

#define

GPIO_MODE_INPUT

#define

GPIO_MODE_OUTPUT_PP

#define

GPIO_MODE_OUTPUT_OD

#define

GPIO_MODE_AF_PP

#define

GPIO_MODE_AF_OD

#define

GPIO_MODE_ANALOG

#define

GPIO_MODE_IT_RISING

#define

GPIO_MODE_IT_FALLING

#define

GPIO_MODE_IT_RISING_FALLING

#define

GPIO_MODE_EVT_RISING

#define

GPIO_MODE_EVT_FALLING

#define

GPIO_MODE_EVT_RISING_FALLING

((uint32_t)0x00000000U)

((uint32_t)0x00000001U)

((uint32_t)0x00000011U)

((uint32_t)0x00000002U)

((uint32_t)0x00000012U)

((uint32_t)0x00000003U)

((uint32_t)0x10110000U)

((uint32_t)0x10210000U)

((uint32_t)0x10310000U)

((uint32_t)0x10120000U)

((uint32_t)0x10220000U)

((uint32_t)0x10320000U)

10
10

GPIO_InitTypeDef::Pull

typedef struct {

uint32_t

Pin;

uint32_t

Mode;

uint32_t

Pull;

uint32_t

Speed;

uint32_t

Alternate;

}GPIO_InitTypeDef;

/* No Pull-up or Pull-down */ #define GPIO_NOPULL ((uint32_t)0x00000000U ) /* Pull-up activation */ #define GPIO_PULLUP ((uint32_t)0x00000001U ) /*Pull-down activation */ #define GPIO_PULLDOWN ((uint32_t)0x00000002U)

11
11

GPIO_InitTypeDef::SPEED

typedef struct {

uint32_t

Pin;

uint32_t

Mode;

uint32_t

Pull;

uint32_t

Speed;

uint32_t

Alternate;

}GPIO_InitTypeDef;

/*1- IO works at 2 MHz */ #define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*2- range 12,5 MHz to 50 MHz,F407= 25Mhz */ #define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*3- range 25 MHz to 100 MHz , F407= 50Mhz */ #define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*4- range 50 MHz to 200 MHz, F407= 100Mhz */ */ #define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U)

12
12

GPIO_InitTypeDef:: Alternate

 

GPIO_AF0_RTC_50Hz

 
     

typedef struct {

GPIO_AF0_MCO

uint32_t

Pin;

GPIO_AF0_TAMPER

uint32_t

Mode;

GPIO_AF0_SWJ

uint32_t

Pull;

GPIO_AF0_TRACE

uint32_t

Speed;

GPIO_AF1_TIM1

uint32_t

Alternate;

……

}GPIO_InitTypeDef;

GPIO_AF3_TIM11

GPIO_AF4_I2C1

 

….

GPIO_AF4_I2C3

Peripheral to be connected to the selected pins. Possible values: GPIO_AFx_PPP, where AFx: is the alternate function index

GPIO_AF5_SPI1

GPIO_AF5_SPI2

……

PPP: is the peripheral instance Example: use GPIO_AF1_TIM1 to connect TIM1 IOs on AF1. These values are defined in the GPIO extended driver, since the AF mapping may change between product lines.

13
13

Exemples d’utilisation de HAL_GPIO_Init

1) Configurer GPIOs en output push-pull pour commander les LEDs connectées aux broches 12, 13,14 et 15

GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

2) Configurer PA0 en entrée EXTI avec front descendant

GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

3) Configurer USART3 Tx (PC10, mapped on AF7) en alternate function:

GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

= GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init( GPIOC, &GPIO_InitStruct);
HAL_GPIO_DeInit() 15
HAL_GPIO_DeInit() 15
HAL_GPIO_DeInit() 15

HAL_GPIO_DeInit()

HAL_GPIO_DeInit() 15
HAL_GPIO_DeInit() 15
HAL_GPIO_DeInit() 15
15
15

HAL_GPIO_DeInit

Cette fonction permet de remettre la broche GPIO_Pin passée en paramètre du port GPIOx à l’état de reset.

void HAL GPIO DeInit(GPIO TypeDef *GPIOx,

_

* Paramètre1:

* Paramètre2:

GPIO_PIN =

15/02/2019

_

_

uint32_t

GPIO_Pin)

GPIOx: where x can be (A I) GPIO_Pin: specifies the port bit to read. GPIO_PIN_x where x can be (0 15).

LAHBIB YOUNES

16 16
16
16
HAL_GPIO_ReadPin() 17
HAL_GPIO_ReadPin() 17
HAL_GPIO_ReadPin() 17

HAL_GPIO_ReadPin()

HAL_GPIO_ReadPin() 17
HAL_GPIO_ReadPin() 17
HAL_GPIO_ReadPin() 17
17
17

HAL_GPIO_ReadPin

GPIO_PinState HAL_GPIO_ReadPin( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

typedef enum

{

GPIO_PIN_RESET = 0, GPIO_PIN_SET }GPIO_PinState;

/**

* Description: lit l’état de broche configurée en entrée.

* Paramètres1:

* Paramètres2:

GPIOx: where x can be (A I)

GPIO_Pin: specifies the port bit to read.

* Retour :

*/

GPIO_PIN =

GPIO_PIN_x where x can be (0 15).

GPIO_PinState = The input port pin value.

18
18
HAL_GPIO_WritePin() 19
HAL_GPIO_WritePin() 19
HAL_GPIO_WritePin() 19

HAL_GPIO_WritePin()

HAL_GPIO_WritePin() 19
HAL_GPIO_WritePin() 19
HAL_GPIO_WritePin() 19
19
19

HAL_GPIO_WritePin

void HAL_GPIO_WritePin(GPIO_TypeDef*

uint16_t

GPIO_PinState

GPIOx,

GPIO_Pin,

PinState)

/**

Description: Sets or clears the selected data port bit.

* @param1:

* @param2: GPIO_Pin: specifies the port bit to be written.

* This parameter can be one of GPIO_PIN_x where x can be (0

* @param3: PinState: specifies the value to be written to the selected bit.

* This parameter can be one of the GPIO_PinState enum values:

* @arg GPIO_PIN_RESET: to clear the port pin

* @arg GPIO_PIN_SET: to set the port pin

* @retval None */

GPIOx: where x can be (A I)

20
20

Code de la fonction

Remarque: This function uses GPIOx_BSRR register to allow atomic read/modify accesses. In this way, there is no risk of an IRQ occurring between the read and the modify access.

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState){

if(PinState != GPIO_PIN_RESET)

{

GPIOx->BSRR = GPIO_Pin;

}

else

{

GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;

}

}

21
21
HAL_GPIO_TogglePin() 22
HAL_GPIO_TogglePin() 22
HAL_GPIO_TogglePin() 22

HAL_GPIO_TogglePin()

HAL_GPIO_TogglePin() 22
HAL_GPIO_TogglePin() 22
HAL_GPIO_TogglePin() 22
22
22

HAL_GPIO_TogglePin

void HAL_GPIO_TogglePin( GPIO_TypeDef*

{

uint16_t

GPIOx->ODR ^= GPIO_Pin;

}

GPIOx,

GPIO_Pin)

/** Description: Toggles the specified GPIO pins

* @param1:

* @param2: GPIO_Pin: specifies the port bit to be written.

GPIOx: where x can be (A I)

*

This parameter can be one of GPIO_PIN_x where x can be (0

*

@retval None

*/

23
23
Activation des horloges des GPIO 24
Activation des horloges des GPIO 24
Activation des horloges des GPIO 24

Activation des horloges des GPIO

Activation des horloges des GPIO 24
Activation des horloges des GPIO 24
Activation des horloges des GPIO 24
24
24

Les Macros d’activation/reset

Un ensemble de macros est défini dans le fichier stm32f4xx_hal_rcc.h. Ces macros permettent d’exécuter des opérations élémentaires dans les registres de RCC.

PPP_CLK_ENABLE:

PPP_CLK_DISABLE:

PPP_FORCE_RESET:

PPP_RELEASE_RESET:

enable the peripheral(PPP) clock

disable the peripheral PPP clock force peripheral reset

release peripheral reset

Les registres utilisés par ces macros sont AHB1RSTR et AHB1ENR pour les GPIO

25
25

PPP_CLK_ENABLE()/

PPP_CLK_DISABLE

#define

}while(0)

\

SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN); \

HAL_RCC_GPIOA_CLK_ENABLE()

do {

#define

HAL_RCC_GPIOA_CLK_DISABLE()

\

(RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN))

Pour chaque GPIO ces deux macros sont aussi définies.

26
26

PPP_FORCE_RESET()

et

PPP_RELEASE_RESET()

#define

HAL_RCC_GPIOB_FORCE_RESET()

\

(RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST))

#define

HAL_RCC_GPIOH_RELEASE_RESET()

\

(RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST))

Ces deux macros sont aussi définies pour tous les GPIOs

27
27
PROGRAMMATION AVEC LES APIS 2828
PROGRAMMATION AVEC LES APIS 2828
PROGRAMMATION AVEC LES APIS 2828

PROGRAMMATION AVEC LES APIS

PROGRAMMATION AVEC LES APIS 2828
PROGRAMMATION AVEC LES APIS 2828
PROGRAMMATION AVEC LES APIS 2828
2828
2828

Exemple

Clignoter la diode LED connectée à PD12 en utilisant les registres prédéfinis dans le HAL

2929
2929

Exemple …code

int main(void) {

GPIO_InitTypeDef

ma_structure;

HAL_RCC_GPIOD_FORCE_RESET();

HAL_RCC_GPIOD_RELEASE_RESET();

HAL_RCC_GPIOD_CLK_ENABLE();

ma_structure.Pin = GPIO_Pin_12; ma_structure.Mode = GPIO_MODE_OUTPUT_PP; ma_structure.Pull = GPIO_NOPULL; ma_structure.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOD, &ma_structure);

3030
3030

Suite

int main(void) { GPIO_InitTypeDef

ma_structure;

………… ………… HAL_GPIO_Init(GPIOD, &ma_structure);

HAL_GPIO_WritePin( GPIOD, GPIO_Pin_12, GPIO_PIN_SET);

HAL_Delay(500);

for(;;){ HAL_GPIO_TogglePin(GPIOD, GPIO_Pin_12);

HAL_Delay(300);

}

}

3131
3131
ClignotezClignotez lesles 44 LEDSLEDS enen mêmemême tempstemps enen utilisantutilisant lele HALHAL ??
ClignotezClignotez lesles 44 LEDSLEDS enen mêmemême tempstemps enen utilisantutilisant lele HALHAL ??

ClignotezClignotez lesles 44 LEDSLEDS enen mêmemême tempstemps enen utilisantutilisant lele HALHAL ??

ClignotezClignotez lesles 44 LEDSLEDS enen mêmemême tempstemps enen utilisantutilisant lele HALHAL ??
DéfilerDéfiler lesles 44 ledsleds enen utilisantutilisant lele HALHAL ??
DéfilerDéfiler lesles 44 ledsleds enen utilisantutilisant lele HALHAL ??

DéfilerDéfiler lesles 44 ledsleds enen utilisantutilisant lele HALHAL ??

DéfilerDéfiler lesles 44 ledsleds enen utilisantutilisant lele HALHAL ??
EnEn utilisantutilisant lele HAL,HAL, inverserinverser lesles ledsleds deuxdeux parpar deuxdeux àà chaquechaque
EnEn utilisantutilisant lele HAL,HAL, inverserinverser lesles ledsleds deuxdeux parpar deuxdeux àà chaquechaque

EnEn utilisantutilisant lele HAL,HAL, inverserinverser lesles ledsleds deuxdeux parpar deuxdeux àà chaquechaque appuieappuie sursur lele boutonbouton user?user?

lesles ledsleds deuxdeux parpar deuxdeux àà chaquechaque appuieappuie sursur lele boutonbouton user?user?