/*
|
* gpio.c
|
*
|
* Created on: 2021Äê6ÔÂ26ÈÕ
|
* Author: graydon
|
*/
|
|
|
#include "gpio.h"
|
|
struct gpio_regs{
|
volatile uint32_t fer;
|
volatile uint32_t fer_set;
|
volatile uint32_t fer_clr;
|
volatile uint32_t data;
|
volatile uint32_t data_set;
|
volatile uint32_t data_clr;
|
volatile uint32_t dir;
|
volatile uint32_t dir_set;
|
volatile uint32_t dir_clr;
|
volatile uint32_t inen;
|
volatile uint32_t inen_set;
|
volatile uint32_t inen_clr;
|
volatile uint32_t mux;
|
volatile uint32_t data_tgl;
|
volatile uint32_t pol;
|
volatile uint32_t pol_set;
|
volatile uint32_t pol_clr;
|
volatile uint32_t lock;
|
};
|
|
|
void GPIO_Init(GPIO_TypeDef* GPIOx , uint32_t GPIO_Pin, GPIO_Pin_Mode mode)
|
{
|
uint32_t i;
|
GPIOx->mux |= 0;
|
|
switch(mode ) {
|
case MODE_0:
|
GPIOx->fer_clr = GPIO_Pin;
|
for(i =0 ;i< 15 ;i++) {
|
if(GPIO_Pin&(1<<i)){
|
GPIOx->mux &= ~(1<<(2*i));
|
}
|
}
|
break;
|
case MODE_1:
|
case MODE_2:
|
case MODE_3:
|
for(i =0 ;i< 15 ;i++) {
|
if(GPIO_Pin&(1<<i)){
|
GPIOx->mux |= ((mode-1)<<(2*i));
|
}
|
}
|
GPIOx->fer_set = GPIO_Pin;
|
break;
|
default:
|
break;
|
}
|
|
}
|
|
void GPIO_Set_Direction(GPIO_TypeDef* GPIOx , uint32_t GPIO_Pin, GPIO_Direction dir)
|
{
|
if(GPIO_OUT == dir) {
|
GPIOx->inen_clr = GPIO_Pin;
|
GPIOx->dir_set = GPIO_Pin;
|
}
|
else{
|
GPIOx->dir_clr = GPIO_Pin;
|
GPIOx->inen_set = GPIO_Pin;
|
}
|
}
|
|
void GPIO_SetOutPut(GPIO_TypeDef* GPIOx , uint32_t GPIO_Pin, GPIO_Level value)
|
{
|
if(value == GPIO_HIGH) {
|
GPIOx->data_set = GPIO_Pin;
|
}
|
else{
|
GPIOx->data_clr = GPIO_Pin;
|
}
|
}
|
|
GPIO_Level GPIO_ToggleInput(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin)
|
{
|
if(GPIOx->data_tgl & GPIO_Pin) {
|
return GPIO_HIGH;
|
}
|
return GPIO_LOW;
|
}
|