105 lines
3 KiB
C
105 lines
3 KiB
C
#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<<GPIO_Pin); // On envoie un 1 via le data register de sortie sur le pin souhaité
|
|
}
|
|
|
|
void MyGPIO_Reset ( GPIO_TypeDef * GPIO , char GPIO_Pin )
|
|
{
|
|
GPIO->ODR &= ((~0x01)<<GPIO_Pin); // On envoie un 0 via le data register de sortie sur le pin souhaité
|
|
}
|
|
|
|
void MyGPIO_Toggle ( GPIO_TypeDef * GPIO , char GPIO_Pin )
|
|
{
|
|
if((((GPIO->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==GPIOC)
|
|
{
|
|
AFIO->EXTICR[GPIO_Pin] |= AFIO_EXTICR1_EXTI3_PC ;
|
|
}
|
|
EXTI->RTSR |= GPIO_Pin;
|
|
// EXTI->FTSR |= ~(0x01<<GPIO_Pin);
|
|
EXTI->EMR |= GPIO_Pin;
|
|
NVIC->ISER[0] |= 0x01<<EXTI3_IRQn; // On précise quelle interruption on souhaite activer
|
|
NVIC->IP[EXTI3_IRQn] |= Prio << 4; // On précise la priorité qu'on souhaite lui donner
|
|
}
|
|
|
|
void EXTI3_IRQHandler(void)
|
|
{
|
|
if(gpio_ptr_func!=0)
|
|
{
|
|
(*gpio_ptr_func)();
|
|
}
|
|
EXTI->PR &= ~(AFIO_EXTICR1_EXTI3_PC << (4*4)); // car c'est le pin4
|
|
}
|
|
|
|
|
|
void EXTI0_IRQHandler(void)
|
|
{
|
|
if(gpio_ptr_func!=0)
|
|
{
|
|
(*gpio_ptr_func)();
|
|
}
|
|
EXTI->PR &= ~(AFIO_EXTICR1_EXTI0_PC << (4*4)); // car c'est le pin4
|
|
}
|