Vous êtes sur la page 1sur 34

Chapitre-II STM32

Programmation GPIO par HAL


Plan

2
Introduction

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
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
HAL_GPIO_INIT

6
Description du HAL_GPIO_Init
Function void HAL_GPIO_Init (GPIO_TypeDef * GPIOx,
Name GPIO_InitTypeDef * GPIO_Init)

Function Initializes the GPIOx peripheral according to the specified


Description 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
GPIO_InitTypeDef
 uint32_t GPIO_InitTypeDef::Pin
Specifies the GPIO pins to be configured. This parameter can be
any value of GPIO_pins_define
typedef struct {
 uint32_t GPIO_InitTypeDef::Mode
uint32_t Pin;
Specifies the operating mode for the selected pins. This
uint32_t Mode; parameter can be a value of GPIO_mode_define
uint32_t Pull;  uint32_t GPIO_InitTypeDef::Pull
uint32_t Speed; Specifies the Pull-up or Pull-Down activation for the selected pins.
uint32_t Alternate; This parameter can be a value of GPIO_pull_define
}GPIO_InitTypeDef;  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
typedef struct {
uint32_t
uint32_t
Pin;
Mode;
GPIO_InitTypeDef::PIN
uint32_t Pull;
uint32_t Speed;
uint32_t Alternate;
}GPIO_InitTypeDef;

#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
GPIO_InitTypeDef::MODE
typedef struct {
uint32_t Pin;
uint32_t Mode;
uint32_t Pull;
uint32_t Speed;
uint32_t Alternate;
}GPIO_InitTypeDef;

#define GPIO_MODE_INPUT ((uint32_t)0x00000000U)


#define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001U)
#define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011U)
#define GPIO_MODE_AF_PP ((uint32_t)0x00000002U)
#define GPIO_MODE_AF_OD ((uint32_t)0x00000012U)
#define GPIO_MODE_ANALOG ((uint32_t)0x00000003U)
#define GPIO_MODE_IT_RISING ((uint32_t)0x10110000U)
#define GPIO_MODE_IT_FALLING ((uint32_t)0x10210000U)
#define GPIO_MODE_IT_RISING_FALLING ((uint32_t)0x10310000U)
#define GPIO_MODE_EVT_RISING ((uint32_t)0x10120000U)
#define GPIO_MODE_EVT_FALLING ((uint32_t)0x10220000U)
#define GPIO_MODE_EVT_RISING_FALLING ((uint32_t)0x10320000U)

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
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
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. GPIO_AF5_SPI1
 Possible values: GPIO_AFx_PPP, where GPIO_AF5_SPI2
 AFx: is the alternate function index ……
 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
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);
HAL_GPIO_DeInit()

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,


uint32_t GPIO_Pin)

* Paramètre1: GPIOx: where x can be (A..I)


* Paramètre2: GPIO_Pin: specifies the port bit to read.
GPIO_PIN = GPIO_PIN_x where x can be (0..15).

15/02/2019 LAHBIB YOUNES 16


16
HAL_GPIO_ReadPin()

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: GPIOx: where x can be (A..I)
* Paramètres2: GPIO_Pin: specifies the port bit to read.
GPIO_PIN = GPIO_PIN_x where x can be (0..15).
* Retour : GPIO_PinState = The input port pin value.
*/
18
HAL_GPIO_WritePin()

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

/**
Description: Sets or clears the selected data port bit.
* @param1: GPIOx: where x can be (A..I)
* @param2: GPIO_Pin: specifies the port bit to be written.
* This parameter can be one of GPIO_PIN_x where x can be (0..15).
* @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
*/
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
HAL_GPIO_TogglePin()

22
HAL_GPIO_TogglePin
void HAL_GPIO_TogglePin( GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin)
{

GPIOx->ODR ^= GPIO_Pin;
}

/**
Description: Toggles the specified GPIO pins..
* @param1: GPIOx: where x can be (A..I)
* @param2: GPIO_Pin: specifies the port bit to be written.
* This parameter can be one of GPIO_PIN_x where x can be (0..15).
* @retval None
*/

23
Activation des horloges des GPIO

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: enable the peripheral(PPP) clock


 __PPP_CLK_DISABLE: disable the peripheral PPP clock
 __PPP_FORCE_RESET: force peripheral reset
 __PPP_RELEASE_RESET: release peripheral reset

 Les registres utilisés par ces macros sont AHB1RSTR et


AHB1ENR pour les GPIO

25
__PPP_CLK_ENABLE()/
__PPP_CLK_DISABLE
#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \
SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN); \
}while(0)

#define __HAL_RCC_GPIOA_CLK_DISABLE() \
(RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN))

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

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
PROGRAMMATION AVEC LES
APIS

28
28
Exemple

• Clignoter la diode LED connectée à PD12 en


utilisant les registres prédéfinis dans le HAL

29
29
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);

30
30
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);
}
}

31
31
Clignotez les 4 LEDS en
même temps en utilisant le
HAL ?
Défiler les 4 leds en utilisant
le HAL ?
En utilisant le HAL, inverser
les leds deux par deux à
chaque appuie sur le bouton
user?

Vous aimerez peut-être aussi