RefKEIL/ProjetsKEIL/Drivers/src/gpio.c
2023-03-20 16:45:58 +01:00

79 lines
2.3 KiB
C

#include "gpio.h"
void MyGPIO_InitClock(void) {
RCC->APB2ENR |= (0x01 << 2) | (0x01 << 3) | (0x01 << 4);
}
void MyGPIO_Init(MyGPIO_Struct_TypeDef * GPIOStructPtr) {
if (GPIOStructPtr->GPIO_Pin >= 8) {
switch (GPIOStructPtr->GPIO_Conf) {
case In_PullDown:
GPIOStructPtr->GPIO->CRH &= ~(0xF << (4 * (GPIOStructPtr->GPIO_Pin % 8)));
GPIOStructPtr->GPIO->CRH |= (0x8 << (4 * (GPIOStructPtr->GPIO_Pin % 8)));
GPIOStructPtr->GPIO->ODR &= (0x0 << GPIOStructPtr->GPIO_Pin);
break;
case In_PullUp:
GPIOStructPtr->GPIO->CRH &= ~(0xF << (4 * (GPIOStructPtr->GPIO_Pin % 8)));
GPIOStructPtr->GPIO->CRH |= (0x8 << (4 * (GPIOStructPtr->GPIO_Pin % 8)));
GPIOStructPtr->GPIO->ODR |= (0x1 << GPIOStructPtr->GPIO_Pin);
break;
case In_Floating:
case In_Analog:
case Out_Ppull:
case Out_OD:
case AltOut_Ppull:
case AltOut_OD:
GPIOStructPtr->GPIO->CRH &= ~(0xF << (4 * (GPIOStructPtr->GPIO_Pin % 8)));
GPIOStructPtr->GPIO->CRH |= (GPIOStructPtr->GPIO_Conf << (4 * (GPIOStructPtr->GPIO_Pin % 8)));
break;
}
}
else {
switch (GPIOStructPtr->GPIO_Conf) {
case In_PullDown:
GPIOStructPtr->GPIO->CRH &= ~(0xF << (4 * (GPIOStructPtr->GPIO_Pin)));
GPIOStructPtr->GPIO->CRH |= (0x8 << (4 * (GPIOStructPtr->GPIO_Pin)));
GPIOStructPtr->GPIO->ODR &= (0x0 << GPIOStructPtr->GPIO_Pin);
break;
case In_PullUp:
GPIOStructPtr->GPIO->CRL &= ~(0xF << (4 * (GPIOStructPtr->GPIO_Pin)));
GPIOStructPtr->GPIO->CRL |= (0x8 << (4 * (GPIOStructPtr->GPIO_Pin)));
GPIOStructPtr->GPIO->ODR |= (0x1 << GPIOStructPtr->GPIO_Pin);
break;
case In_Floating:
case In_Analog:
case Out_Ppull:
case Out_OD:
case AltOut_Ppull:
case AltOut_OD:
GPIOStructPtr->GPIO->CRL &= ~(0xF << (4 * (GPIOStructPtr->GPIO_Pin)));
GPIOStructPtr->GPIO->CRL |= (GPIOStructPtr->GPIO_Conf << (4 * (GPIOStructPtr->GPIO_Pin)));
break;
}
}
}
int MyGPIO_Read(GPIO_TypeDef * GPIO, char GPIO_Pin) {
return ((GPIO->IDR & (0x1 << GPIO_Pin)) >> GPIO_Pin);
}
void MyGPIO_Set(GPIO_TypeDef * GPIO, char GPIO_Pin) {
GPIO->ODR |= (0x1 << GPIO_Pin);
}
void MyGPIO_Reset(GPIO_TypeDef * GPIO, char GPIO_Pin) {
GPIO->ODR &= (0x0 << GPIO_Pin);
}
void MyGPIO_Toggle(GPIO_TypeDef * GPIO, char GPIO_Pin) {
if (MyGPIO_Read(GPIO, GPIO_Pin) == 0x1) {
MyGPIO_Reset(GPIO, GPIO_Pin);
}
else {
MyGPIO_Set(GPIO, GPIO_Pin);
}
}