79 lines
2.3 KiB
C
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);
|
|
}
|
|
}
|