314 lines
6.1 KiB
C
314 lines
6.1 KiB
C
#include "gpio.h"
|
||
|
||
|
||
#define PxPU_BASE_ADDR 0x7EFE10
|
||
|
||
|
||
void gpio_set_level(PIN_enum pin, uint8 level)
|
||
{
|
||
if(0x00 == (pin&0xF0)) //P0
|
||
{
|
||
if(level)
|
||
P0 |= (1<<(pin&0xF));
|
||
else
|
||
P0 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x10 == (pin&0xF0)) //P1
|
||
{
|
||
if(level)
|
||
P1 |= (1<<(pin&0xF));
|
||
else
|
||
P1 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x20 == (pin&0xF0)) //P2
|
||
{
|
||
if(level)
|
||
P2 |= (1<<(pin&0xF));
|
||
else
|
||
P2 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x30 == (pin&0xF0)) //P3
|
||
{
|
||
if(level)
|
||
P3 |= (1<<(pin&0xF));
|
||
else
|
||
P3 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x40 == (pin&0xF0)) //P4
|
||
{
|
||
if(level)
|
||
P4 |= (1<<(pin&0xF));
|
||
else
|
||
P4 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x50 == (pin&0xF0)) //P5
|
||
{
|
||
if(level)
|
||
P5 |= (1<<(pin&0xF));
|
||
else
|
||
P5 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x60 == (pin&0xF0)) //P6
|
||
{
|
||
if(level)
|
||
P6 |= (1<<(pin&0xF));
|
||
else
|
||
P6 &= ~(1<<(pin&0xF));
|
||
}
|
||
else if(0x70 == (pin&0xF0)) //P7
|
||
{
|
||
if(level)
|
||
P7 |= (1<<(pin&0xF));
|
||
else
|
||
P7 &= ~(1<<(pin&0xF));
|
||
}
|
||
}
|
||
|
||
uint8 gpio_get_level(PIN_enum pin)
|
||
{
|
||
uint8 level;
|
||
if(0x00 == (pin&0xF0)) //P0
|
||
{
|
||
level = (P0 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x10 == (pin&0xF0)) //P1
|
||
{
|
||
level = (P1 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x20 == (pin&0xF0)) //P2
|
||
{
|
||
level = (P2 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x30 == (pin&0xF0)) //P3
|
||
{
|
||
level = (P3 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x40 == (pin&0xF0)) //P4
|
||
{
|
||
level = (P4 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x50 == (pin&0xF0)) //P5
|
||
{
|
||
level = (P5 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x60 == (pin&0xF0)) //P6
|
||
{
|
||
level = (P6 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
else if(0x70 == (pin&0xF0)) //P7
|
||
{
|
||
level = (P7 & (1<<(pin&0xF))) ? 1 : 0;
|
||
}
|
||
return level;
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------------------------
|
||
// @brief GPIO设置引脚上拉电阻设置
|
||
// @param pin 选择引脚(P0_0-P7_7)
|
||
// @param pull 设置上下拉电阻 NOPULL:不设置 PULLUP:上拉
|
||
// @return void
|
||
// Sample usage: gpio_pull_set(P0_0,NOPULL); // 设置P0.0引脚没有上下拉电阻
|
||
//-------------------------------------------------------------------------------------------------------------------
|
||
void gpio_pull_set(PIN_enum pin, PULL_enum pull)
|
||
{
|
||
if(PULLUP == pull)
|
||
{
|
||
(*(unsigned char volatile far *)(PxPU_BASE_ADDR + (pin >> 4))) |= (1<<(pin&0x0F));
|
||
}
|
||
else if(NOPULL == pull)
|
||
{
|
||
(*(unsigned char volatile far *)(PxPU_BASE_ADDR + (pin >> 4))) &= ~(1<<(pin&0x0F));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------------------------
|
||
// @brief GPIO设置引脚模式
|
||
// @param pin 选择引脚(P0_0-P5_4)
|
||
// @param mode 引脚模式 GPIO:准双向口, GPO_PP:推挽输出, GPI_IMPEDANCE:高阻输入, GPI_OD:开漏输出
|
||
// @return void
|
||
// Sample usage: gpio_mode(P0_0,GPIO); // 设置P0.0设置为双向IO
|
||
//-------------------------------------------------------------------------------------------------------------------
|
||
void gpio_mode(PIN_enum pin, GPIOMODE_enum mode)
|
||
{
|
||
if(GPIO == mode)
|
||
{
|
||
if(0x00 == (pin&0xF0)) //P0
|
||
{
|
||
P0M1 &= ~(1<<(pin&0xF));
|
||
P0M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x10 == (pin&0xF0)) //P1
|
||
{
|
||
P1M1 &= ~(1<<(pin&0xF));
|
||
P1M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x20 == (pin&0xF0)) //P2
|
||
{
|
||
P2M1 &= ~(1<<(pin&0xF));
|
||
P2M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
|
||
if(0x30 == (pin&0xF0)) //P3
|
||
{
|
||
P3M1 &= ~(1<<(pin&0xF));
|
||
P3M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x40 == (pin&0xF0)) //P4
|
||
{
|
||
P4M1 &= ~(1<<(pin&0xF));
|
||
P4M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x50 == (pin&0xF0)) //P5
|
||
{
|
||
P5M1 &= ~(1<<(pin&0xF));
|
||
P5M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x60 == (pin&0xF0)) //P5
|
||
{
|
||
P6M1 &= ~(1<<(pin&0xF));
|
||
P6M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x70 == (pin&0xF0)) //P5
|
||
{
|
||
P7M1 &= ~(1<<(pin&0xF));
|
||
P7M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
}
|
||
else if(GPO_PP == mode)
|
||
{
|
||
if(0x00 == (pin&0xF0)) //P0
|
||
{
|
||
P0M1 &= ~(1<<(pin&0xF));
|
||
P0M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x10 == (pin&0xF0)) //P1
|
||
{
|
||
P1M1 &= ~(1<<(pin&0xF));
|
||
P1M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x20 == (pin&0xF0)) //P2
|
||
{
|
||
P2M1 &= ~(1<<(pin&0xF));
|
||
P2M0 |= (1<<(pin&0xF));
|
||
}
|
||
|
||
if(0x30 == (pin&0xF0)) //P3
|
||
{
|
||
P3M1 &= ~(1<<(pin&0xF));
|
||
P3M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x40 == (pin&0xF0)) //P4
|
||
{
|
||
P4M1 &= ~(1<<(pin&0xF));
|
||
P4M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x50 == (pin&0xF0)) //P5
|
||
{
|
||
P5M1 &= ~(1<<(pin&0xF));
|
||
P5M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x60 == (pin&0xF0)) //P4
|
||
{
|
||
P6M1 &= ~(1<<(pin&0xF));
|
||
P6M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x70 == (pin&0xF0)) //P5
|
||
{
|
||
P7M1 &= ~(1<<(pin&0xF));
|
||
P7M0 |= (1<<(pin&0xF));
|
||
}
|
||
|
||
}
|
||
else if(GPI_IMPEDANCE == mode)
|
||
{
|
||
if(0x00 == (pin&0xF0)) //P0
|
||
{
|
||
P0M1 |= (1<<(pin&0xF));
|
||
P0M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x10 == (pin&0xF0)) //P1
|
||
{
|
||
P1M1 |= (1<<(pin&0xF));
|
||
P1M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x20 == (pin&0xF0)) //P2
|
||
{
|
||
P2M1 |= (1<<(pin&0xF));
|
||
P2M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
|
||
if(0x30 == (pin&0xF0)) //P3
|
||
{
|
||
P3M1 |= (1<<(pin&0xF));
|
||
P3M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x40 == (pin&0xF0)) //P4
|
||
{
|
||
P4M1 |= (1<<(pin&0xF));
|
||
P4M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x50 == (pin&0xF0)) //P5
|
||
{
|
||
P5M1 |= (1<<(pin&0xF));
|
||
P5M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x60 == (pin&0xF0)) //P5
|
||
{
|
||
P6M1 |= (1<<(pin&0xF));
|
||
P6M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
if(0x70 == (pin&0xF0)) //P5
|
||
{
|
||
P7M1 |= (1<<(pin&0xF));
|
||
P7M0 &= ~(1<<(pin&0xF));
|
||
}
|
||
}
|
||
else if(GPI_OD == mode)
|
||
{
|
||
if(0x00 == (pin&0xF0)) //P0
|
||
{
|
||
P0M1 |= (1<<(pin&0xF));
|
||
P0M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x10 == (pin&0xF0)) //P1
|
||
{
|
||
P1M1 |= (1<<(pin&0xF));
|
||
P1M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x20 == (pin&0xF0)) //P2
|
||
{
|
||
P2M1 |= (1<<(pin&0xF));
|
||
P2M0 |= (1<<(pin&0xF));
|
||
}
|
||
|
||
if(0x30 == (pin&0xF0)) //P3
|
||
{
|
||
P3M1 |= (1<<(pin&0xF));
|
||
P3M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x40 == (pin&0xF0)) //P4
|
||
{
|
||
P4M1 |= (1<<(pin&0xF));
|
||
P4M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x50 == (pin&0xF0)) //P5
|
||
{
|
||
P5M1 |= (1<<(pin&0xF));
|
||
P5M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x60 == (pin&0xF0)) //P5
|
||
{
|
||
P6M1 |= (1<<(pin&0xF));
|
||
P6M0 |= (1<<(pin&0xF));
|
||
}
|
||
if(0x70 == (pin&0xF0)) //P5
|
||
{
|
||
P7M1 |= (1<<(pin&0xF));
|
||
P7M0 |= (1<<(pin&0xF));
|
||
}
|
||
}
|
||
}
|
||
|