74 lines
2.1 KiB
C
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);
|
|
}
|
|
}
|