You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1640 lines
39 KiB
1640 lines
39 KiB
/*********************************************************
|
|
*Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
|
|
*文件名: lib_gpio.c
|
|
*作 者: AE Team
|
|
*版 本: V1.01
|
|
*日 期: 2021/06/09
|
|
*描 述: GPIO模块库函数
|
|
*备 注:
|
|
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
|
**********************************************************/
|
|
#include <stdint.h>
|
|
#include "lib_gpio.h"
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetFuncxRegFromPin
|
|
描 述:设置GPIO引脚的功能复用
|
|
输入值:Pin:目的引脚
|
|
Func:功能复用编号
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetFuncxRegFromPin(GPIO_Pin Pin, GPIO_Reuse_Func Func)
|
|
{
|
|
uint32_t value;
|
|
|
|
switch (Func)
|
|
{
|
|
case GPIO_Reuse_Func0:
|
|
value = 0;
|
|
break;
|
|
|
|
case GPIO_Reuse_Func1:
|
|
value = 1;
|
|
break;
|
|
|
|
case GPIO_Reuse_Func2:
|
|
value = 2;
|
|
break;
|
|
|
|
case GPIO_Reuse_Func3:
|
|
value = 3;
|
|
break;
|
|
|
|
default:
|
|
value = 0xFF;
|
|
break;
|
|
}
|
|
|
|
/* 引脚功能设置 */
|
|
switch (Pin)
|
|
{
|
|
case GPIO_Pin_B0:
|
|
GPIO->PBFUNC0.PB0 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B1:
|
|
GPIO->PBFUNC0.PB1 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B8:
|
|
GPIO->PBFUNC1.PB8 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B9:
|
|
GPIO->PBFUNC1.PB9 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B10:
|
|
GPIO->PBFUNC1.PB10 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B11:
|
|
GPIO->PBFUNC1.PB11 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B12:
|
|
GPIO->PBFUNC1.PB12 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_B13:
|
|
GPIO->PBFUNC1.PB13 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A1:
|
|
GPIO->PAFUNC0.PA1 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A2:
|
|
GPIO->PAFUNC0.PA2 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A3:
|
|
GPIO->PAFUNC0.PA3 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A4:
|
|
GPIO->PAFUNC0.PA4 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A5:
|
|
GPIO->PAFUNC0.PA5 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A6:
|
|
GPIO->PAFUNC0.PA6 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A7:
|
|
GPIO->PAFUNC0.PA7 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A8:
|
|
GPIO->PAFUNC1.PA8 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A9:
|
|
GPIO->PAFUNC1.PA9 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A10:
|
|
GPIO->PAFUNC1.PA10 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A11:
|
|
GPIO->PAFUNC1.PA11 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A12:
|
|
GPIO->PAFUNC1.PA12 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A13:
|
|
GPIO->PAFUNC1.PA13 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A14:
|
|
GPIO->PAFUNC1.PA14 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A15:
|
|
GPIO->PAFUNC1.PA15 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A16:
|
|
GPIO->PAFUNC2.PA16 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A22:
|
|
GPIO->PAFUNC2.PA22 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A23:
|
|
GPIO->PAFUNC2.PA23 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A24:
|
|
GPIO->PAFUNC3.PA24 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A25:
|
|
GPIO->PAFUNC3.PA25 = value;
|
|
break;
|
|
|
|
|
|
case GPIO_Pin_A27:
|
|
GPIO->PAFUNC3.PA27 = value;
|
|
break;
|
|
|
|
case GPIO_Pin_A28:
|
|
GPIO->PAFUNC3.PA28 = value;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_GetNormalBitOffsetFromPin
|
|
描 述:计算引脚的位偏移量
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:引脚的位偏移量
|
|
***************************************************************/
|
|
uint8_t GPIO_GetNormalBitOffsetFromPin(GPIO_Pin Pin)
|
|
{
|
|
uint8_t result;
|
|
|
|
switch (Pin)
|
|
{
|
|
case GPIO_Pin_B0:
|
|
result = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_B1:
|
|
result = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_B8:
|
|
result = 8;
|
|
break;
|
|
|
|
case GPIO_Pin_B9:
|
|
result = 9;
|
|
break;
|
|
|
|
case GPIO_Pin_B10:
|
|
result = 10;
|
|
break;
|
|
|
|
case GPIO_Pin_B11:
|
|
result = 11;
|
|
break;
|
|
|
|
case GPIO_Pin_B12:
|
|
result = 12;
|
|
break;
|
|
|
|
case GPIO_Pin_B13:
|
|
result = 13;
|
|
break;
|
|
|
|
case GPIO_Pin_A1:
|
|
result = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A2:
|
|
result = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A3:
|
|
result = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A4:
|
|
result = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_A5:
|
|
result = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_A6:
|
|
result = 6;
|
|
break;
|
|
|
|
case GPIO_Pin_A7:
|
|
result = 7;
|
|
break;
|
|
|
|
case GPIO_Pin_A8:
|
|
result = 8;
|
|
break;
|
|
|
|
case GPIO_Pin_A9:
|
|
result = 9;
|
|
break;
|
|
|
|
case GPIO_Pin_A10:
|
|
result = 10;
|
|
break;
|
|
|
|
case GPIO_Pin_A11:
|
|
result = 11;
|
|
break;
|
|
|
|
case GPIO_Pin_A12:
|
|
result = 12;
|
|
break;
|
|
|
|
case GPIO_Pin_A13:
|
|
result = 13;
|
|
break;
|
|
|
|
case GPIO_Pin_A14:
|
|
result = 14;
|
|
break;
|
|
|
|
case GPIO_Pin_A15:
|
|
result = 15;
|
|
break;
|
|
|
|
case GPIO_Pin_A16:
|
|
result = 16;
|
|
break;
|
|
|
|
case GPIO_Pin_A22:
|
|
result = 22;
|
|
break;
|
|
|
|
case GPIO_Pin_A23:
|
|
result = 23;
|
|
break;
|
|
|
|
case GPIO_Pin_A24:
|
|
result = 24;
|
|
break;
|
|
|
|
case GPIO_Pin_A25:
|
|
result = 25;
|
|
break;
|
|
|
|
case GPIO_Pin_A27:
|
|
result = 27;
|
|
break;
|
|
|
|
case GPIO_Pin_A28:
|
|
result = 28;
|
|
break;
|
|
|
|
default:
|
|
result = 0xFF;
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetDirRegFromPin
|
|
描 述:设置引脚的输入或输出方向
|
|
输入值:Pin: 目的引脚
|
|
Dir:引脚方向
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetDirRegFromPin(GPIO_Pin Pin, GPIO_Direction Dir)
|
|
{
|
|
uint8_t StartBit;
|
|
|
|
StartBit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (Dir == GPIO_Direction_Input)
|
|
GPIO->PBDIRBSR.Word = (1 << StartBit);
|
|
else
|
|
GPIO->PBDIRBCR.Word = (1 << StartBit);
|
|
}
|
|
else
|
|
{
|
|
if (Dir == GPIO_Direction_Input)
|
|
GPIO->PADIRBSR.Word = (1 << StartBit);
|
|
else
|
|
GPIO->PADIRBCR.Word = (1 << StartBit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetODERegFromPin
|
|
描 述:设置引脚的输出开漏方式
|
|
输入值:Pin: 目的引脚
|
|
ODE: 输出开漏方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetODERegFromPin(GPIO_Pin Pin, GPIO_ODE_Output ODE)
|
|
{
|
|
uint8_t StartBit;
|
|
|
|
StartBit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (ODE == GPIO_ODE_Output_Disable)
|
|
GPIO->PBODE.Word &= (~(1uL << StartBit));
|
|
else
|
|
GPIO->PBODE.Word |= (1uL << StartBit);
|
|
}
|
|
else
|
|
{
|
|
if (ODE == GPIO_ODE_Output_Disable)
|
|
GPIO->PAODE.Word &= (~(1uL << StartBit));
|
|
else
|
|
GPIO->PAODE.Word |= (1uL << StartBit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetDSRegFromPin
|
|
描 述:设置引脚的输出驱动能力
|
|
输入值:Pin: 目的引脚
|
|
DS: 电流驱动方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetDSRegFromPin(GPIO_Pin Pin, GPIO_DS_Output DS)
|
|
{
|
|
uint8_t Start_Bit;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (DS == GPIO_DS_Output_Normal)
|
|
GPIO->PBDS.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PBDS.Word |= (1uL << Start_Bit);
|
|
}
|
|
else
|
|
{
|
|
if (DS == GPIO_DS_Output_Normal)
|
|
GPIO->PADS.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PADS.Word |= (1uL << Start_Bit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetPUERegFromPin
|
|
描 述:设置引脚的弱上拉方式
|
|
输入值:Pin: 目的引脚
|
|
PUE: 弱上拉方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetPUERegFromPin(GPIO_Pin Pin, GPIO_PUE_Input PUE)
|
|
{
|
|
uint8_t Start_Bit;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (PUE == GPIO_PUE_Input_Disable)
|
|
GPIO->PBPUE.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PBPUE.Word |= (1uL << Start_Bit);
|
|
}
|
|
else
|
|
{
|
|
if (PUE == GPIO_PUE_Input_Disable)
|
|
GPIO->PAPUE.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PAPUE.Word |= (1uL << Start_Bit);
|
|
}
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetPDERegFromPin
|
|
描 述:设置引脚的弱下拉方式
|
|
输入值:Pin: 目的引脚
|
|
PDE:弱下拉方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetPDERegFromPin(GPIO_Pin Pin, GPIO_PDE_Input PDE)
|
|
{
|
|
uint8_t Start_Bit;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (PDE == GPIO_PDE_Input_Disable)
|
|
GPIO->PBPDE.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PBPDE.Word |= (1uL << Start_Bit);
|
|
}
|
|
else
|
|
{
|
|
if (PDE == GPIO_PDE_Input_Disable)
|
|
GPIO->PAPDE.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PAPDE.Word |= (1uL << Start_Bit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetSingalTypeFromPin
|
|
描 述:设置引脚的信号类型
|
|
输入值:Pin: 目的引脚
|
|
Signal: 引脚的信号类型
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetSingalTypeFromPin(GPIO_Pin Pin, GPIO_Pin_Signal Signal)
|
|
{
|
|
uint8_t Start_Bit;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (Signal == GPIO_Pin_Signal_Digital)
|
|
GPIO->PBINEB.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PBINEB.Word |= (1uL << Start_Bit);
|
|
}
|
|
else
|
|
{
|
|
if (Signal == GPIO_Pin_Signal_Digital)
|
|
GPIO->PAINEB.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PAINEB.Word |= (1uL << Start_Bit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetPortTypeFromPin
|
|
描 述:设置引脚的类型
|
|
输入值:Pin: 目的引脚
|
|
Type: 引脚的类型
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetPortTypeFromPin(GPIO_Pin Pin, GPIO_Pin_Type Type)
|
|
{
|
|
uint8_t Start_Bit;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (Type == GPIO_Pin_CMOS)
|
|
GPIO->PBTYP.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PBTYP.Word |= (1uL << Start_Bit);
|
|
}
|
|
else
|
|
{
|
|
if (Type == GPIO_Pin_CMOS)
|
|
GPIO->PATYP.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PATYP.Word |= (1uL << Start_Bit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetPortFLTFromPin
|
|
描 述:设置引脚的类型
|
|
输入值:Pin: 目的引脚
|
|
FLT: 引脚是否滤波
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetPortFLTFromPin(GPIO_Pin Pin, GPIO_Pin_FLT FLT)
|
|
{
|
|
uint8_t Start_Bit;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (FLT == GPIO_FLT_Disable)
|
|
GPIO->PBFLT.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PBFLT.Word |= (1uL << Start_Bit);
|
|
}
|
|
else
|
|
{
|
|
if (FLT == GPIO_FLT_Disable)
|
|
GPIO->PAFLT.Word &= (~(1uL << Start_Bit));
|
|
else
|
|
GPIO->PAFLT.Word |= (1uL << Start_Bit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_Init
|
|
描 述:引脚的初始化
|
|
输入值:Pin: 目的引脚
|
|
InitSet: 初始化数据结构
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_Init(GPIO_Pin Pin, GPIO_InitSettingType *InitSet)
|
|
{
|
|
if (InitSet->Signal == GPIO_Pin_Signal_Analog)
|
|
{
|
|
GPIO_SetSingalTypeFromPin(Pin, GPIO_Pin_Signal_Analog);
|
|
GPIO_SetDirRegFromPin(Pin, GPIO_Direction_Input);
|
|
GPIO_SetFuncxRegFromPin(Pin, GPIO_Reuse_Func0);
|
|
GPIO_SetPUERegFromPin(Pin, GPIO_PUE_Input_Disable);
|
|
GPIO_SetPDERegFromPin(Pin, GPIO_PDE_Input_Disable);
|
|
}
|
|
else
|
|
{
|
|
GPIO_SetSingalTypeFromPin(Pin, GPIO_Pin_Signal_Digital);
|
|
GPIO_SetFuncxRegFromPin(Pin, InitSet->Func);
|
|
GPIO_SetDirRegFromPin(Pin, InitSet->Dir);
|
|
|
|
if (InitSet->Dir == GPIO_Direction_Output)
|
|
{
|
|
GPIO_SetDSRegFromPin(Pin, InitSet->DS);
|
|
GPIO_SetODERegFromPin(Pin, InitSet->ODE);
|
|
}
|
|
GPIO_SetPortTypeFromPin(Pin, GPIO_Pin_TTL);
|
|
GPIO_SetPUERegFromPin(Pin, InitSet->PUE);
|
|
GPIO_SetPDERegFromPin(Pin, InitSet->PDE);
|
|
}
|
|
|
|
GPIO_SetPortFLTFromPin(Pin, GPIO_FLT_Disable);
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_ReadBit
|
|
描 述:读取引脚的值
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:引脚的电平值
|
|
***************************************************************/
|
|
uint32_t GPIO_ReadBit(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Start_Bit;
|
|
uint32_t value;
|
|
|
|
Start_Bit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
value = GPIO->PBPORT.Word;
|
|
}
|
|
else
|
|
{
|
|
value = GPIO->PAPORT.Word;
|
|
}
|
|
|
|
value >>= Start_Bit;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_WriteBit
|
|
描 述:向引脚输出指定电平
|
|
输入值:Pin: 目的引脚
|
|
bit: 引脚的电平值
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_WriteBit(GPIO_Pin Pin, uint32_t bit)
|
|
{
|
|
uint8_t StartBit;
|
|
|
|
StartBit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
if (bit == 1)
|
|
GPIO->PBDATABSR.Word = (1uL << StartBit);
|
|
else
|
|
GPIO->PBDATABCR.Word = (1uL << StartBit);
|
|
}
|
|
else
|
|
{
|
|
if (bit == 1)
|
|
GPIO->PADATABSR.Word = (1uL << StartBit);
|
|
else
|
|
GPIO->PADATABCR.Word = (1uL << StartBit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_SetBit
|
|
描 述:向引脚输出指定电平
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_SetBit(GPIO_Pin Pin)
|
|
{
|
|
uint8_t StartBit;
|
|
|
|
StartBit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
GPIO->PBDATABSR.Word = (1uL << StartBit);
|
|
}
|
|
else
|
|
{
|
|
GPIO->PADATABSR.Word = (1uL << StartBit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_ResetBit
|
|
描 述:向引脚输出指定电平
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_ResetBit(GPIO_Pin Pin)
|
|
{
|
|
uint8_t StartBit;
|
|
|
|
StartBit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
GPIO->PBDATABCR.Word = (1uL << StartBit);
|
|
}
|
|
else
|
|
{
|
|
GPIO->PADATABCR.Word = (1uL << StartBit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:GPIO_ToggleBit
|
|
描 述:向引脚输出指定电平
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_ToggleBit(GPIO_Pin Pin)
|
|
{
|
|
uint8_t StartBit;
|
|
|
|
StartBit = GPIO_GetNormalBitOffsetFromPin(Pin);
|
|
|
|
if (Pin <= GPIO_Pin_B13)
|
|
{
|
|
GPIO->PBDATABRR.Word = (1uL << StartBit);
|
|
}
|
|
else
|
|
{
|
|
GPIO->PADATABRR.Word = (1uL << StartBit);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/***************************************************************
|
|
函数名:PINT_GetPINTxIndexFromPin
|
|
描 述:计算引脚的输入索引号
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:目的引脚的对应的外部中断号
|
|
***************************************************************/
|
|
uint8_t PINT_GetPINTxIndexFromPin(GPIO_Pin Pin)
|
|
{
|
|
uint8_t index;
|
|
|
|
switch (Pin)
|
|
{
|
|
case GPIO_Pin_A8:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A16:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A24:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_B0:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_B8:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A1:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A9:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A25:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_B1:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_B9:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A2:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A10:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_B10:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A3:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A11:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A27:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_B11:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A4:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_A12:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_A28:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_B12:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_A5:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_A13:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_B13:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_A6:
|
|
index = 6;
|
|
break;
|
|
|
|
case GPIO_Pin_A14:
|
|
index = 6;
|
|
break;
|
|
|
|
case GPIO_Pin_A22:
|
|
index = 6;
|
|
break;
|
|
|
|
case GPIO_Pin_A7:
|
|
index = 7;
|
|
break;
|
|
|
|
case GPIO_Pin_A15:
|
|
index = 7;
|
|
break;
|
|
|
|
case GPIO_Pin_A23:
|
|
index = 7;
|
|
break;
|
|
|
|
default:
|
|
index = 0xFF;
|
|
break;
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_SetTriggerStyleFromPin
|
|
描 述:设置引脚的外部端口中断触发方式
|
|
输入值:Pin: 目的引脚
|
|
Style: 中断触发方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void PINT_SetTriggerStyleFromPin(GPIO_Pin Pin, PINT_Trigger_Style Style)
|
|
{
|
|
uint32_t value;
|
|
uint8_t index;
|
|
|
|
index = PINT_GetPINTxIndexFromPin(Pin);
|
|
|
|
value = GPIO->PINTCFG.Word;
|
|
value &= (~(7uL << (index * 4)));
|
|
|
|
switch (Style)
|
|
{
|
|
case PINT_Trigger_Rising_Edge:
|
|
value |= (0uL << (index * 4));
|
|
break;
|
|
|
|
case PINT_Trigger_Trailing_Edge:
|
|
value |= (1uL << (index * 4));
|
|
break;
|
|
|
|
case PINT_Trigger_High_Level:
|
|
value |= (2uL << (index * 4));
|
|
break;
|
|
|
|
case PINT_Trigger_Low_Level:
|
|
value |= (3uL << (index * 4));
|
|
break;
|
|
|
|
case PINT_Trigger_Both_Edge:
|
|
value |= (4uL << (index * 4));
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
GPIO->PINTCFG.Word = value;
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_GetSELxIndexFromPin
|
|
描 述:计算引脚的端口选择值
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:引脚的端口选择值
|
|
***************************************************************/
|
|
uint8_t PINT_GetSELxIndexFromPin(GPIO_Pin Pin)
|
|
{
|
|
uint8_t index;
|
|
|
|
switch (Pin)
|
|
{
|
|
case GPIO_Pin_A1:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A2:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A3:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A4:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A5:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A6:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A7:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A8:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A9:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A10:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A11:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A12:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A13:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A14:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A15:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A16:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A22:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A23:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A24:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A25:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A27:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A28:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_B0:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_B1:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_B8:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_B9:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_B10:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_B11:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_B12:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_B13:
|
|
index = 5;
|
|
break;
|
|
|
|
default:
|
|
index = 0xFF;
|
|
break;
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_SetEnableOrNotFromPin
|
|
描 述:使能或禁能引脚的外部端口中断
|
|
输入值:Pin: 目的引脚
|
|
IE: 中断使能方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void PINT_SetEnableOrNotFromPin(GPIO_Pin Pin, PINT_IE_Set IE)
|
|
{
|
|
uint8_t Pintx;
|
|
uint8_t Selx;
|
|
uint32_t value;
|
|
|
|
/* 选择中断源 */
|
|
Pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
Selx = PINT_GetSELxIndexFromPin(Pin);
|
|
|
|
value = GPIO->PINTSEL.Word;
|
|
value &= (~(7uL << (Pintx * 4))); /* 清零PINTx输入选择位 */
|
|
value |= (Selx << (Pintx * 4)); /* 置位PINTx输入选择位 */
|
|
GPIO->PINTSEL.Word = value;
|
|
|
|
/* 清除中断标志 */
|
|
GPIO->PINTIF.Word = (1uL << Pintx);
|
|
|
|
/* 使能PINT中断 */
|
|
value = GPIO->PINTIE.Word;
|
|
|
|
if (IE == PINT_IE_Set_Disable)
|
|
{
|
|
value &= (~(1uL << Pintx)); /* 关闭使能位 */
|
|
value |= (1uL << (Pintx + 8)); /* 屏蔽中断 */
|
|
GPIO->PINTIE.Word = value;
|
|
NVIC->ICER[0] = (1uL << Pintx);
|
|
}
|
|
else
|
|
{
|
|
value |= (1uL << Pintx); /* 打开使能位 */
|
|
value &= (~(1uL << (Pintx + 8))); /* 使能中断 */
|
|
GPIO->PINTIE.Word = value;
|
|
NVIC->ISER[0] = (1uL << Pintx);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_Init
|
|
描 述:外部端口初始化
|
|
输入值:Pin: 目的引脚
|
|
InitSet: 初始化结构体
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void PINT_Init(GPIO_Pin Pin, PINT_InitSettingType *InitSet)
|
|
{
|
|
PINT_SetTriggerStyleFromPin(Pin, InitSet->Trigger_Style);
|
|
PINT_SetEnableOrNotFromPin(Pin, InitSet->IE_Set);
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_ClearITFlag
|
|
描 述:清除引脚的外部端口中断标志
|
|
输入值:Pin:目的引脚
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void PINT_ClearITFlag(GPIO_Pin Pin)
|
|
{
|
|
uint8_t pintx;
|
|
|
|
pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
GPIO->PINTIF.Word = (0x01U << pintx);
|
|
|
|
return;
|
|
}
|
|
|
|
/*************************************
|
|
函数名:PINT_GetITStatus
|
|
描 述:获取中断使能状态
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:目的引脚的端口中断使能状态
|
|
**************************************/
|
|
uint32_t PINT_GetITStatus(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Pintx;
|
|
uint32_t value;
|
|
|
|
Pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
|
|
value = GPIO->PINTIE.Word;
|
|
value >>= Pintx;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_GetITFlag
|
|
描 述:读取引脚的外部端口中断标志
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:目的引脚的外部端口中断标志
|
|
***************************************************************/
|
|
uint32_t PINT_GetITFlag(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Pintx;
|
|
uint32_t value;
|
|
|
|
Pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
|
|
value = GPIO->PINTIF.Word;
|
|
value >>= Pintx;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_SetMASK
|
|
描 述:设置端口输入屏蔽
|
|
输入值:Pin: 目的引脚
|
|
IE: 是否设置屏蔽
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void PINT_SetPMASK(GPIO_Pin Pin, PINT_IE_Set IE)
|
|
{
|
|
uint8_t Pintx;
|
|
|
|
if (PINT_IE_Set_Disable == IE)
|
|
{
|
|
Pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
GPIO->PINTIE.PMASK &= ~(1uL << Pintx);
|
|
}
|
|
else
|
|
{
|
|
Pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
GPIO->PINTIE.PMASK |= (1uL << Pintx);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:PINT_SetMASK
|
|
描 述:设置端口输入屏蔽
|
|
输入值:Pin: 目的引脚
|
|
IE: 是否设置屏蔽
|
|
输出值:无
|
|
返回值:屏蔽返回1,未屏蔽返回0
|
|
***************************************************************/
|
|
uint32_t PINT_GetPMASK(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Pintx;
|
|
uint32_t value;
|
|
|
|
Pintx = PINT_GetPINTxIndexFromPin(Pin);
|
|
value = GPIO->PINTIE.PMASK >> Pintx;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_GetKINTxIndexFromPin
|
|
描 述:计算引脚的按键索引
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:引脚的按键索引
|
|
***************************************************************/
|
|
uint8_t KINT_GetKINTxIndexFromPin(GPIO_Pin Pin)
|
|
{
|
|
uint8_t index;
|
|
|
|
switch (Pin)
|
|
{
|
|
case GPIO_Pin_A8:
|
|
case GPIO_Pin_A16:
|
|
case GPIO_Pin_A24:
|
|
case GPIO_Pin_B0:
|
|
case GPIO_Pin_B8:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A1:
|
|
case GPIO_Pin_A9:
|
|
case GPIO_Pin_A25:
|
|
case GPIO_Pin_B1:
|
|
case GPIO_Pin_B9:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A2:
|
|
case GPIO_Pin_A10:
|
|
case GPIO_Pin_B10:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A3:
|
|
case GPIO_Pin_A11:
|
|
case GPIO_Pin_A27:
|
|
case GPIO_Pin_B11:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_A4:
|
|
case GPIO_Pin_A12:
|
|
case GPIO_Pin_A28:
|
|
case GPIO_Pin_B12:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_A5:
|
|
case GPIO_Pin_A13:
|
|
case GPIO_Pin_B13:
|
|
index = 5;
|
|
break;
|
|
|
|
case GPIO_Pin_A6:
|
|
case GPIO_Pin_A14:
|
|
case GPIO_Pin_A22:
|
|
index = 6;
|
|
break;
|
|
|
|
case GPIO_Pin_A7:
|
|
case GPIO_Pin_A15:
|
|
case GPIO_Pin_A23:
|
|
index = 7;
|
|
break;
|
|
|
|
default:
|
|
index = 0xFF;
|
|
break;
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_SetTriggerStyleFromPin
|
|
描 述:设置引脚的按键触发方式
|
|
输入值:Pin: 目的引脚
|
|
Style: 中断触发方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void KINT_SetTriggerStyleFromPin(GPIO_Pin Pin, KINT_Trigger_Style Style)
|
|
{
|
|
uint8_t Kintx;
|
|
uint32_t value;
|
|
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
|
|
value = GPIO->KINTCFG.Word;
|
|
value &= (~(7uL << (Kintx * 4)));
|
|
|
|
switch (Style)
|
|
{
|
|
case KINT_Trigger_Rising_Edge:
|
|
value |= (0uL << (Kintx * 4));
|
|
break;
|
|
|
|
case KINT_Trigger_Trailing_Edge:
|
|
value |= (1uL << (Kintx * 4));
|
|
break;
|
|
|
|
case KINT_Trigger_High_Level:
|
|
value |= (2uL << (Kintx * 4));
|
|
break;
|
|
|
|
case KINT_Trigger_Low_Level:
|
|
value |= (3uL << (Kintx * 4));
|
|
break;
|
|
|
|
case KINT_Trigger_Both_Edge:
|
|
value |= (4uL << (Kintx * 4));
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
GPIO->KINTCFG.Word = value;
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_GetSelxIndexFromPin
|
|
描 述:计算引脚的端口选择索引
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:目的引脚的端口选择索引
|
|
***************************************************************/
|
|
uint8_t KINT_GetSelxIndexFromPin(GPIO_Pin Pin)
|
|
{
|
|
uint8_t index;
|
|
|
|
switch (Pin)
|
|
{
|
|
case GPIO_Pin_A1:
|
|
case GPIO_Pin_A2:
|
|
case GPIO_Pin_A3:
|
|
case GPIO_Pin_A4:
|
|
case GPIO_Pin_A5:
|
|
case GPIO_Pin_A6:
|
|
case GPIO_Pin_A7:
|
|
index = 0;
|
|
break;
|
|
|
|
case GPIO_Pin_A8:
|
|
case GPIO_Pin_A9:
|
|
case GPIO_Pin_A10:
|
|
case GPIO_Pin_A11:
|
|
case GPIO_Pin_A12:
|
|
case GPIO_Pin_A13:
|
|
case GPIO_Pin_A14:
|
|
case GPIO_Pin_A15:
|
|
index = 1;
|
|
break;
|
|
|
|
case GPIO_Pin_A16:
|
|
case GPIO_Pin_A22:
|
|
case GPIO_Pin_A23:
|
|
index = 2;
|
|
break;
|
|
|
|
case GPIO_Pin_A24:
|
|
case GPIO_Pin_A25:
|
|
case GPIO_Pin_A27:
|
|
case GPIO_Pin_A28:
|
|
index = 3;
|
|
break;
|
|
|
|
case GPIO_Pin_B0:
|
|
case GPIO_Pin_B1:
|
|
index = 4;
|
|
break;
|
|
|
|
case GPIO_Pin_B8:
|
|
case GPIO_Pin_B9:
|
|
case GPIO_Pin_B10:
|
|
case GPIO_Pin_B11:
|
|
case GPIO_Pin_B12:
|
|
case GPIO_Pin_B13:
|
|
index = 5;
|
|
break;
|
|
|
|
default:
|
|
index = 0xFF;
|
|
break;
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_SetEnableOrNotFromPin
|
|
描 述:使能或禁能引脚的按键中断
|
|
输入值:Pin: 目的引脚
|
|
IE: 按键中断使能方式
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void KINT_SetEnableOrNotFromPin(GPIO_Pin Pin, KINT_IE_Set IE)
|
|
{
|
|
uint8_t Kintx;
|
|
uint8_t Selx;
|
|
uint32_t value;
|
|
|
|
/* 中断输入引脚选择 */
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
Selx = KINT_GetSelxIndexFromPin(Pin);
|
|
|
|
value = GPIO->KINTSEL.Word;
|
|
value &= (~(7uL << (Kintx * 4)));
|
|
value |= (Selx << (Kintx * 4));
|
|
GPIO->KINTSEL.Word = value;
|
|
|
|
/* 清除中断标志 */
|
|
value = (1uL << Kintx);
|
|
GPIO->KINTIF.Word = value;
|
|
|
|
/* 使能PINT中断 */
|
|
value = GPIO->KINTIE.Word;
|
|
|
|
if (IE == KINT_IE_Set_Disable)
|
|
{
|
|
value &= (~(1uL << Kintx)); /* 清除使能位 */
|
|
value |= (1uL << (Kintx + 8)); /* 屏蔽中断 */
|
|
GPIO->KINTIE.Word = value;
|
|
NVIC->ICER[0] = (1uL << 18);
|
|
}
|
|
else
|
|
{
|
|
value |= (1uL << Kintx); /* 设置使能位 */
|
|
value &= (~(1uL << (Kintx + 8))); /* 不屏蔽中断 */
|
|
GPIO->KINTIE.Word = value;
|
|
NVIC->ISER[0] = (1uL << 18);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_Init
|
|
描 述:按键引脚初始化
|
|
输入值:Pin: 目的引脚
|
|
InitSet: 初始化结构体
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void KINT_Init(GPIO_Pin Pin, KINT_InitSettingType *InitSet)
|
|
{
|
|
KINT_SetTriggerStyleFromPin(Pin, InitSet->Trigger_Style);
|
|
KINT_SetEnableOrNotFromPin(Pin, InitSet->IE_Set);
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_ClearITFlag
|
|
描 述:清除引脚的按键中断标志
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void KINT_ClearITFlag(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Kintx;
|
|
uint32_t value;
|
|
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
|
|
value = (1uL << Kintx);
|
|
GPIO->KINTIF.Word = value;
|
|
return;
|
|
}
|
|
|
|
/*************************************
|
|
函数名:KINT_GetITStatus
|
|
描 述:获取中断使能状态
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:目的引脚的按键中断使能状态
|
|
**************************************/
|
|
uint32_t KINT_GetITStatus(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Kintx;
|
|
uint32_t value;
|
|
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
|
|
value = GPIO->KINTIE.Word;
|
|
value >>= Kintx;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_GetITFlag
|
|
描 述:读取引脚的按键中断标志
|
|
输入值:Pin: 目的引脚
|
|
输出值:无
|
|
返回值:目的引脚的按键中断标志
|
|
***************************************************************/
|
|
uint32_t KINT_GetITFlag(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Kintx;
|
|
uint32_t value;
|
|
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
|
|
value = GPIO->KINTIF.Word;
|
|
value >>= Kintx;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_SetKMASK
|
|
描 述:设置按键输入屏蔽
|
|
输入值:Pin: 目的引脚
|
|
IE: 是否设置屏蔽
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void KINT_SetKMASK(GPIO_Pin Pin, KINT_IE_Set IE)
|
|
{
|
|
uint8_t Kintx;
|
|
|
|
if (KINT_IE_Set_Disable == IE)
|
|
{
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
GPIO->KINTIE.KMASK &= ~(1uL << Kintx);
|
|
}
|
|
else
|
|
{
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
GPIO->KINTIE.KMASK |= (1uL << Kintx);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:KINT_GetKMASK
|
|
描 述:设置按键输入屏蔽
|
|
输入值:Pin: 目的引脚
|
|
IE: 是否设置屏蔽
|
|
输出值:无
|
|
返回值:屏蔽返回1,未屏蔽返回0
|
|
***************************************************************/
|
|
uint32_t KINT_GetKMASK(GPIO_Pin Pin)
|
|
{
|
|
uint8_t Kintx;
|
|
uint32_t value;
|
|
|
|
Kintx = KINT_GetKINTxIndexFromPin(Pin);
|
|
value = GPIO->KINTIE.KMASK >> Kintx;
|
|
value &= 0x01;
|
|
return value;
|
|
}
|
|
|
|
/***************************************************************
|
|
函数名:UART_TXxConfig
|
|
描 述:TXx脉宽调制输出配置
|
|
输入值:Plv:调制电平选择
|
|
Ps:调制PWM脉冲选择
|
|
TxSx: 调制波形输出管脚选择
|
|
NewState :Disable或Enable
|
|
输出值:无
|
|
返回值:无
|
|
***************************************************************/
|
|
void GPIO_TX0Config(UART_TYPE_TXPLV Plv, UART_TYPE_TX0PS Ps, UART_TYPE_TX0Sx TX0Sx, TYPE_FUNCEN NewState)
|
|
{
|
|
GPIO->TXPWM.TX0PS = Ps;
|
|
GPIO->TXPWM.TX0PLV = Plv;
|
|
|
|
if (Ps == UART_TX0PS_NO)
|
|
return;
|
|
|
|
switch (TX0Sx)
|
|
{
|
|
case UART_TYPE_TXD0:
|
|
GPIO->TXPWM.TX0_S0 = NewState;
|
|
break;
|
|
|
|
case UART_TYPE_T16N0OUT0:
|
|
GPIO->TXPWM.TX0_S1 = NewState;
|
|
break;
|
|
|
|
case UART_TYPE_T16N0OUT1:
|
|
GPIO->TXPWM.TX0_S2 = NewState;
|
|
break;
|
|
|
|
case UART_TYPE_TX0BUZ:
|
|
GPIO->TXPWM.TX0_S3 = NewState;
|
|
break;
|
|
}
|
|
}
|
|
|