voilier/Drivers/gpio.c
2025-12-03 08:19:23 +01:00

73 lines
No EOL
1.7 KiB
C

#include "gpio.h"
void gpio_init( GPIO_TypeDef* gpio, char pin, char conf)
{
if(gpio == GPIOA){
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;//lance GPIOA
}else if (gpio == GPIOB){
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
}else if (gpio == GPIOC){
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
}
//RCC->APB2ENR |= (0x01 << 2) | (0x01 << 3) | (0x01 << 4) ;//fait tourner tous les gpio
if(conf == 0x8){
if (pin < 8)
{
gpio->CRL= gpio->CRL &~(0xF<<(pin*4));
gpio->CRL= gpio->CRL | conf<<(pin*4);
gpio->ODR&=~(0x1<<pin);
}
else{
gpio->CRH= gpio->CRH &~(0xF<<((pin-8)*4));
gpio->CRH= gpio->CRH | conf<<((pin-8)*4);
gpio->ODR&=~(0x1<<pin);
}
}else if (conf == 0xF){
if (pin < 8)
{
gpio->CRL= gpio->CRL &~(0xF<<(pin*4));
gpio->CRL= gpio->CRL | conf<<(pin*4);
gpio->ODR&=(0x1<<pin);
}
else{
gpio->CRH= gpio->CRH &~(0xF<<((pin-8)*4));
gpio->CRH= gpio->CRH | conf<<((pin-8)*4);
gpio->ODR&=(0x1<<pin);
}
}else{
if (pin < 8)
{
gpio->CRL= gpio->CRL &~(0xF<<(pin*4));
gpio->CRL= gpio->CRL | conf<<(pin*4);
}
else{
gpio->CRH= gpio->CRH &~(0xF<<((pin-8)*4));
gpio->CRH= gpio->CRH | conf<<((pin-8)*4);
}
}
}
int gpio_read(GPIO_TypeDef *gpio, char gpio_Pin)
{
return (gpio->IDR)&(0x1<<gpio_Pin); //retourne 0 si bit à 0 et sinon 1 decalé du pin
}
void gpio_set(GPIO_TypeDef *gpio, char gpio_Pin)
{
gpio->BSRR = (0x1 << gpio_Pin);
}
void gpio_reset(GPIO_TypeDef *gpio, char gpio_Pin)
{
gpio->BSRR = (0x1 << (gpio_Pin + 16));
}
void gpio_toggle(GPIO_TypeDef *gpio, char gpio_Pin)
{
if(((gpio->ODR)&(0x1<<gpio_Pin)) != 0x0){
gpio_reset(gpio,gpio_Pin);
}else{
gpio_set(gpio,gpio_Pin);
}
}