73 lines
No EOL
1.7 KiB
C
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);
|
|
}
|
|
} |