Beruflich Dokumente
Kultur Dokumente
JEBRI Mejdi
Programmation GPIO en utilisant la bibliothéque (CMSIS)
typedefstruct{
__IO uint32_t MODER; /* Addressoffset: 0x00 */
__IO uint32_t OTYPER; /* Addressoffset: 0x04 */
__IO uint32_t OSPEEDR; /* Addressoffset: 0x08 */
__IO uint32_t PUPDR; /* Addressoffset: 0x0C */
__IO uint32_t IDR; /* Addressoffset: 0x10 */
__IO uint32_t ODR; /* Addressoffset: 0x14 */
__IO uint32_t BSRR; /* Addressoffset: 0x18 */
……
} GPIO_TypeDef;
GPIOx est un pointeur sur la structure GPIO_TypeDef.
L’accès au champ IDR (ou autre) de la structure se fait comme suit:
(*GPIOx).IDR ou encore GPIOx->IDR en utilisant l’écriture simplifiée.
#include "stm32f4xx.h"
void tempo(unsigned int cnt)
{ for(;cnt>0;cnt--); }
int main() {
RCC->AHB1ENR |=0XFFFFFFF9; //initialisation de GPIOD
RCC->AHB1RSTR&=0XFFFFFFF0; //DESACTIVATION DE RESET
RCC->AHB1ENR|=0XFFFFFFF9; //ACTIVATION DE GPTOD
//LES PIN 12,13,14,15 SONT DES OUTPUT
GPIOD->MODER &=0X55FFFFFF;
GPIOD->MODER |=0X55000000;
GPIOA->MODER &=0XFFFFFFFC; //PIN 0 DE GPIOA INPUT
/*OTYPE IS PUSH_PULL,,LES PIN(12,13,14,15) DE GPIOD SONT EN MODE PUSH PULL*/
GPIOA->OTYPER &=0XFFFF0FFF; //FREQUENCE=25MHZ
GPIOD->OSPEEDR &=0XAAFFFFFF;
GPIOD->OSPEEDR |=0XAA000000;
GPIOD->PUPDR &=0X55FFFFFF; //LES OUTPUT EN MODE PULL_UP
GPIOD->PUPDR |=0X55000000;
GPIOA->PUPDR &=0XFFFFFFFC; //INPUT
while(1)
{
if (GPIOA->IDR &= 0X1)
{
if ((GPIOD->ODR & 0X3000)== 0X3000)
{ GPIOD->ODR |=0XFFFFCFFF; //LED3 &LED4
GPIOD->ODR &=0X0000C000;
tempo(0Xffffff);
}
else {
{ GPIOD->ODR |=0XFFFF3FFF; //LED1 &LED2
GPIOD->ODR &=0X00003000;
tempo(0Xffffff);
}}}}
JEBRI Mejdi
Programmation GPIO par HAL
HAL_GPIO_Init() Exemple 4 LED permutes 2 par 2 à chaque excitation par bouton
Typedef struct{ #include "stm32f4xx_hal.h"
uint32_t Pin; void tempo(volatile unsigned int CNT){
uint32_t Mode; for (; CNT > 0 ;CNT --); }
uint32_t Pull; int main(void) {
uint32_t Speed; uint32_t B;
uint32_t Alternate; GPIO_InitTypeDef ma_structure ;
} GPIO_Init TypeDef; GPIO_InitTypeDef Ima_structure ;
HAL_GPIO_DeInit() __HAL_RCC_GPIOD_FORCE_RESET();
Void HAL_GPIO_DeInit ( __HAL_RCC_GPIOD_RELEASE_RESET();
GPIO_TypeDef *GPIOx ; __HAL_RCC_GPIOD_CLK_ENABLE();
uint32_t GPIO_Pin ) __HAL_RCC_GPIOA_FORCE_RESET();
HAL_GPIO_ReadPin() __HAL_RCC_GPIOA_RELEASE_RESET();
GPIO_PinStat HAL_GPIO_ReadPin( __HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_TypeDef* GPIOx; ma_structure.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |
uint16_t GPIO_Pin) GPIO_PIN_15;
typedefenum ma_structure.Mode = GPIO_MODE_OUTPUT_PP;
{ ma_structure.Pull = GPIO_NOPULL;
GPIO_PIN_RESET = 0, ma_structure.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_PIN_SET HAL_GPIO_Init(GPIOD, &ma_structure);
}GPIO_PinState ; Ima_structure.Pin = GPIO_PIN_0;
Ima_structure.Mode = GPIO_MODE_INPUT;
HAL_GPIO_WritePin() Ima_structure.Pull = GPIO_NOPULL;
Void HAL_GPIO_WritePin ( HAL_GPIO_Init(GPIOA, &Ima_structure);
GPIO_TypeDef* GPIOx ; B=0;
uint16_t GPIO_Pin ; while(1){
GPIO_PinState PinState ) if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)){
HAL_GPIO_TogglePin() if (B){
Void HAL_GPIO_TogglePin( HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 |
GPIO_TypeDef* GPIOx ; GPIO_PIN_13 , GPIO_PIN_SET);
uint16_t GPIO_Pin ) HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14 |
{ GPIOx->ODR ^= GPIO_Pin ; } GPIO_PIN_15 , GPIO_PIN_RESET);
tempo(0xfffff);}
Chaque broche (PINE) peut être
else {
configurée en mode input, output,
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 |
analog,EXTI, EVENT.
Lorsque le mode EXTI est utilisé: GPIO_PIN_13 , GPIO_PIN_RESET);
–L’utilisateur doit appeler la fonction HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14 |
GPIO_PIN_15 , GPIO_PIN_SET);
HAL_GPIO_EXTI_IRQHandler()
tempo(0xfffff); }
dans le fichier stm32f4xx_it.c
B=~B;
–L’utilisateur doit implémenter la
fonctionHAL_GPIO_EXTI_Callback() }}}
JEBRI Mejdi
Programmation de l’interruption avec EXTI en HAL
Exemple d'interruption en EXTI
void ConfigEXTI(void)
{
/*Enable clock du GPIOD*/
__HAL_RCC_GPIOD_FORCE_RESET();
__HAL_RCC_GPIOD_RELEASE_RESET();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin : PA0,PA1,PA2,PA3 */
GPIO_InitTypeDef str;
str.Pin = GPIO_PIN_0;
str.Mode = GPIO_MODE_IT_RISING; // front montant
str.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &str);
/*Initialisation de l’interruption en EXTI*/
/*definir les 4 bit de priority en PreemptPriority, 0 bit pour SubPriority*/
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/*definir l'ordre de chaque priorité, celui qui a le poids le plus faible est celui qui est le plus prioritaire*/
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);
HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
HAL_NVIC_SetPriority(EXTI2_IRQn, 1, 0);
HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0);
/*activation du NVIC de chaque interruption*/
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}
/*corps de l'interruption*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET) ;
Delay_us(500000); // fonction defini dans l'exercice
switch (GPIO_Pin) { //par defaut GPIO_Pin prend la pine qui a déclencher l'interruption
/*variable defini dans le corps du programme de l'exercice, char Message(10);*/
case GPIO_PIN_0:strcopy(Message,"B4 Active");Break;
case GPIO_PIN_1:strcopy(Message,"B1 Active");Break;
case GPIO_PIN_2:strcopy(Message,"B2 Active");Break;
case GPIO_PIN_3:strcopy(Message,"B3 Active");Break; }
for (i=0;i<strlen(Message);i++)
{LCD_ecrire.octet(Donnee,Message[i])// fonction défini dans l'exercice
}}
JEBRI Mejdi