#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); } }