Files
2025-08-31 21:37:24 +08:00

314 lines
6.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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