#include "GPIO.h" void (*gpio_ptr_func)(void); // interruption NVIC p197 RM8 et ISER p119 void MyGPIO_Init ( MyGPIO_Struct_TypeDef * GPIOStructPtr ) { if(GPIOStructPtr->GPIO==GPIOA) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Active l'horloge pour } else if (GPIOStructPtr->GPIO==GPIOB) { RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; } else if (GPIOStructPtr->GPIO==GPIOC) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; } else if (GPIOStructPtr->GPIO==GPIOD) { RCC->APB2ENR |= RCC_APB2ENR_IOPDEN; } if(GPIOStructPtr->GPIO_Conf==In_PullUp) { GPIOStructPtr->GPIO_Conf=GPIOStructPtr->GPIO_Conf-1; GPIOStructPtr->GPIO->ODR |= 0x1<<(((GPIOStructPtr->GPIO_Pin))); } else if(GPIOStructPtr->GPIO_Conf==In_PullDown) { GPIOStructPtr->GPIO->ODR &= ~0x1<<(((GPIOStructPtr->GPIO_Pin))); } if(GPIOStructPtr->GPIO_Pin>=8) // Si le numéro de pin est supérieur ou égal à 8 alors on écrit dans le registre CRHigh { GPIOStructPtr->GPIO->CRH &= ~0xF<<(4*((GPIOStructPtr->GPIO_Pin)%8)); //on met a 0 les bit de config du pin GPIOStructPtr->GPIO->CRH |= GPIOStructPtr->GPIO_Conf<<(4*((GPIOStructPtr->GPIO_Pin)%8)); // On met à 1 les bons bits pour obtenir la config souhaité sur le pin } else // Si le numéro de pin est inférieur à 8 alors on écrit dans le registre CRLow { GPIOStructPtr->GPIO->CRL &= ~0xF<<(4*((GPIOStructPtr->GPIO_Pin)%8)); //on met a 0 les bit de config du pin GPIOStructPtr->GPIO->CRL |= GPIOStructPtr->GPIO_Conf<<(4*((GPIOStructPtr->GPIO_Pin)%8)); // On met à 1 les bons bits pour obtenir la config souhaité sur le pin } } int MyGPIO_Read ( GPIO_TypeDef * GPIO , char GPIO_Pin ) // renvoie 0 ou 1 { int bit=0; bit = (GPIO->IDR>>GPIO_Pin)&0x01; // On récupère la donnée stocké dans le data register d'entré pour le pin souhaité return bit; } void MyGPIO_Set ( GPIO_TypeDef * GPIO , char GPIO_Pin ) { GPIO->ODR |=(0x01<ODR &= ((~0x01)<ODR)>>GPIO_Pin)&0x01)==1) { MyGPIO_Reset(GPIO,GPIO_Pin); } else { MyGPIO_Set(GPIO,GPIO_Pin); } } void MyGPIO_ActiveIT (GPIO_TypeDef * GPIO, char GPIO_Pin, char Prio, void (*IT_function)(void)) //p210 { RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // On active l'horloge pour AFIO if (GPIO==GPIOA) { AFIO->EXTICR[0] |= (AFIO_EXTICR1_EXTI0_PA << (4*GPIO_Pin)); } else if (GPIO==GPIOB) { AFIO->EXTICR[0] |= (AFIO_EXTICR1_EXTI0_PB << (4*GPIO_Pin)); } else if (GPIO==GPIOC) { AFIO->EXTICR[0] |= (AFIO_EXTICR1_EXTI0_PC << (4*GPIO_Pin)); } else if (GPIO==GPIOD) { AFIO->EXTICR[0] |= (AFIO_EXTICR1_EXTI0_PD << (4*GPIO_Pin)); } // manque ligne pour activer l'interruption NVIC->ISER[0] |= 0x01<IP[EXTI0_IRQn] |= Prio << 4; // On précise la priorité qu'on souhaite lui donner } void EXTI0_IRQHandler(void) { if (EXTI->RTSR) //on test si RTSR est différent de 0 { if(gpio_ptr_func!=0) { (*gpio_ptr_func)(); } } EXTI->RTSR &=0xFFFFF; // On reset le flag lmevé //reset flag }