初始化仓库

This commit is contained in:
2025-08-31 21:43:17 +08:00
commit be600d0769
45 changed files with 22852 additions and 0 deletions

313
Source/gpio.c Normal file
View File

@@ -0,0 +1,313 @@
#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));
}
}
}