projet_voilier/Drivers/Driver_GPIO.c
2021-10-15 16:28:32 +02:00

74 lines
2.1 KiB
C

#include "Driver_GPIO.h"
void MyGPIO_Activate(int nb_GPIO) {
//activer la clock du GPIO donné
RCC->APB2ENR |= (0x01 << (nb_GPIO +1)) ;
//RCC->APB2ENR |= (0x01 << 2 | 0x01 << 3 | 0x01 << 4) ;
}
/*
void MyGPIO_Desactivate(int nb_GPIO) {
//désactiver le GPIO donné
RCC->APB2ENR &= ~(0x01 << (nb_GPIO +1)) ;
}*/
//la structure est déjà remplie
void MyGPIO_Init(MyGPIO_Struct_TypeDef * GPIOStructPtr) {
//màj crl si on veut un pull up ou pull down
//on reset la conf
if(GPIOStructPtr->GPIO_Pin > 7){
GPIOStructPtr->GPIO->CRH &= ~(0xF << ((GPIOStructPtr->GPIO_Pin*4) - (8*4)));
//on met la bonne conf
if (GPIOStructPtr->GPIO_Conf == In_PullUp) {
//on est en pull up -> on met à 1 par défaut
GPIOStructPtr->GPIO->CRH |= (In_PullDown << ((GPIOStructPtr->GPIO_Pin*4) - (8*4)));
MyGPIO_Set(GPIOStructPtr->GPIO, GPIOStructPtr->GPIO_Pin);
}
else {
GPIOStructPtr->GPIO->CRH |= (GPIOStructPtr->GPIO_Conf << ((GPIOStructPtr->GPIO_Pin*4) - (8*4)));
}
}
else {
GPIOStructPtr->GPIO->CRL &= ~(0xF << (GPIOStructPtr->GPIO_Pin*4));
//on met la bonne conf
if (GPIOStructPtr->GPIO_Conf == In_PullUp) {
//on est en pull up -> on met à 1 par défaut
GPIOStructPtr->GPIO->CRL |= (In_PullDown << (GPIOStructPtr->GPIO_Pin*4));
MyGPIO_Set(GPIOStructPtr->GPIO, GPIOStructPtr->GPIO_Pin);
}
else {
GPIOStructPtr->GPIO->CRL |= (GPIOStructPtr->GPIO_Conf << (GPIOStructPtr->GPIO_Pin * 4));
}
}
}
int MyGPIO_Read(GPIO_TypeDef * GPIO, char GPIO_Pin) {
return (GPIO->IDR & (1 << GPIO_Pin)) ;
}
void MyGPIO_Set(GPIO_TypeDef * GPIO, char GPIO_Pin){
//GPIO->ODR |= (1 << GPIO_Pin);
GPIO->BSRR = (1 << GPIO_Pin) ;
}
void MyGPIO_Reset(GPIO_TypeDef * GPIO, char GPIO_Pin) {
//GPIO->ODR &= ~(1 << GPIO_Pin);
//d'après la data sheet, il faut écrire dans la partie des bits compris entre 16 et 31
GPIO->BSRR = (1 << (GPIO_Pin + 16)) ;
}
void MyGPIO_Toggle(GPIO_TypeDef * GPIO, char GPIO_Pin){
//voir si il y a une meilleur manière
if (GPIO->ODR & (1 << GPIO_Pin)) {
//dans ce cas c'est activé donc on le désactive
MyGPIO_Reset(GPIO, GPIO_Pin);
}
else {
//c'était désactivé donc on l'active
MyGPIO_Set(GPIO, GPIO_Pin);
}
}