📄 lib_lpc21xx_c.h
字号:
/*----------------------------------------------------------------**
** 本文件定义并实现 LPC21xx 的内联库函数,提供片内外设的简单 API **
**作者:黄伟德
**日期:2005-04-30
**版本:V2.0
**----------------------------------------------------------------*/
#ifndef hwd_lib_LPC2104_c_h
#define hwd_lib_LPC2104_c_h
#include "../../4_5gas/Header32/HWD_LPC21_reg.h"
#include "LPC213X.h"
//------------------------------------------------------------------
// 外部中断的用户 API
//------------------------------------------------------------------
__inline void LPC21F_EINT_EnableIt(unsigned int flag)//VIC_FLAG_EINT0-1-2
{
EXTINT = flag;
}
__inline void LPC21F_EINT_EnableWakeUpCPU(unsigned int flag)
{//VIC_WAKE_BY_EINT0-1-2
EXTWAKE = flag;
}
//------------------------------------------------------------------
// 通用 IO 口的用户 PIO API(针对210x只有P0口)
//------------------------------------------------------------------
/*__inline void LPC21F_PIO_CfgPeriph(unsigned int PinNumber,
unsigned int UsedForWhat)
{ //配置IO 口的功能
if(PinNumber >15)
PINSEL1 = UsedForWhat;
else
PINSEL0 = UsedForWhat;
}
__inline void LPC21F_PIO_CfgOutput(unsigned int Pin)
{
IODIR = Pin;
}
__inline void LPC21F_PIO_CfgAllInput(void)
{
IODIR = 0;
}
__inline unsigned int LPC21F_PIO_GetInput(void)
{
return IOPIN;
}
__inline unsigned int LPC21F_PIO_GetPinStatus(unsigned int Pin)
{
return (IOSET & Pin);
}
__inline void LPC21F_PIO_SetOutput(unsigned int Pin)
{
IOSET = Pin;
}
__inline void LPC21F_PIO_ClearOutput(unsigned int Pin)
{
IOCLR = Pin;
}
__inline void LPC21F_PIO_CplOutput(unsigned int Pin)
{
if(0 == LPC21F_PIO_GetPinStatus(Pin))
IOSET = Pin;
else
IOCLR = Pin;
}
//------------------------------------------------------------------
// 通用 IO 口的用户 PIO API(对有P0和P1的CPU)
//------------------------------------------------------------------
//#define LPC21_PIO_0_BASE (LPC21PS_PIO)0xE0028000
//#define LPC21_PIO_1_BASE (LPC21PS_PIO)0xE0028010
// 本函数的目的是在开始将所有的IO口配置成通用IO,有第二用途的才另外配置
__inline void LPC21F_GPIO_CfgGPIO(void)
{
PINSEL0 = 0;
PINSEL1 = 0;
PINSEL2 = 0;
}
__inline void LPC21F_GPIO_CfgPeriph(unsigned int PinNumber,
unsigned int UsedForWhat)//LPC21PS_PIO pPio,
{ //配置IO 口的第二功能
if(PinNumber >15)
PINSEL1 = UsedForWhat;
else
PINSEL0 = UsedForWhat;
}
__inline void LPC21F_GPIO_CfgOutput(LPC21PS_PIO pPio,
unsigned int Pin)
{
pPio->IoDIR |= Pin;
}
__inline void LPC21F_GPIO_CfgInput(LPC21PS_PIO pPio,
unsigned int Pin)
{ pPio->IoDIR &= ~Pin; }
__inline unsigned int LPC21F_GPIO_GetInput(LPC21PS_PIO pPio)
{
return pPio->IoPIN;
}
__inline unsigned int LPC21F_GPIO_GetPinStatus(LPC21PS_PIO pPio,
unsigned int Pin)
{
return (pPio->IoSET & Pin);
}
__inline unsigned int LPC21F_GPIO_GetPinInput(LPC21PS_PIO pPio,
unsigned int Pin)
{
return (pPio->IoPIN & Pin);
}
__inline void LPC21F_GPIO_SetOutput(LPC21PS_PIO pPio,
unsigned int Pin)
{
pPio->IoSET = Pin;
}
__inline void LPC21F_GPIO_ClearOutput(LPC21PS_PIO pPio,
unsigned int Pin)
{
pPio->IoCLR = Pin;
}
__inline void LPC21F_GPIO_CplOutput(LPC21PS_PIO pPio,
unsigned int Pin)
{
if(0 == LPC21F_GPIO_GetPinStatus(pPio,Pin))
pPio->IoSET = Pin;
else
pPio->IoCLR = Pin;
}
//------------------------------------------------------------------
// 中断控制器的用户 VIC API
//------------------------------------------------------------------
__inline void LPC21F_VIC_CfgAllIRQ(void)
/*{//将所有中断请求配置为IRQ
VICIntSelect = 0x00000000;
}
__inline void LPC21F_VIC_CfgForFIQ(unsigned int VICSelectBit)
{//将某个中断请求配置为FIQ
VICIntSelect = VICSelectBit;
}
/*__inline void LPC21F_VIC_EnableIt(unsigned int VICSelectBit)
{//使能多个中断时,将多个 VIC_SELECT 相或
VICIntEnable = VICSelectBit;
}*/
/*__inline void LPC21F_VIC_DisableIt(unsigned int VICSelectBit)
{//清除多个中断使能时,将多个 VIC_SELECT 相或 开中断后要禁止时使用
VICIntEnClr = VICSelectBit;
}
__inline unsigned int LPC21F_VIC_IsIRQPending(unsigned int VICSelectBit)
{//是否某个IRQ 正处于请求状态
if((VICIRQStatus & VICSelectBit) == VICSelectBit)
return 1;
else
return 0;
}
__inline unsigned int LPC21F_VIC_IsFIQPending(unsigned int VICSelectBit)
{//是否某个FIQ 正处于请求状态
if((VICFIQStatus & VICSelectBit) == VICSelectBit)
return 1;
else
return 0;
}
__inline void LPC21F_VIC_CfgPrior(LPC21PS_VIC pVic, //LPC21_VIC_BASE == 0xFFFFF000
unsigned int Priority, //优先级,0-15,0 最高
unsigned int VICChannl, //中断源通道号
unsigned int EntryAddr) //中断入口地址
{
pVic->VicVectAddrss[Priority] = EntryAddr;
pVic->VicVectCntl[Priority] = 0x20 | VICChannl;
}
__inline void LPC21F_VIC_CloseThis(void)
{
VICVectAddr = 0;
}
//------------------------------------------------------------------
// 串口通讯的用户 UART API
//------------------------------------------------------------------
#define ENABLE_MACHINE_SEND_IT() U1IER |= 0x01
#define DISABLE_MACHINE_SEND_IT() U1IER &= ~0x01
__inline void LPC21F_UART_SetBaudRate(LPC21PS_UART pUart, //LPC21_UART_BASE == 0xFFFFF000
unsigned int BaudRate, //波特率
unsigned char UartMode) //工作模式
{
unsigned int bak;
pUart->ULCR = 0x80; //DLAB 置 1,允许设置波特率
bak = (Fpclk >> 4) / BaudRate;
pUart->UBUF = bak & 0xff;
pUart->UIER = bak >> 8;
pUart->ULCR = UartMode;
}
__inline void LPC21F_UART_Putchar(LPC21PS_UART pUart,
unsigned char ByteData)
{
pUart->UBUF = ByteData; // 发送数据
while( (pUart->ULSR&0x40)==0 ); // 等待数据发送完毕
}
__inline void LPC21F_UART_SendBlock(LPC21PS_UART pUart,
const unsigned char* pByte,
unsigned int nLength)
{
while(nLength--)
LPC21F_UART_Putchar(pUart,*pByte++);
}
__inline void LPC21F_Cfg_PIOForUART(unsigned int WhichUART)
{ //配置IO 口的功能
if(WhichUART == 0)
{
PINSEL0 &= ~PIN0_1_USED_UART0_AND;
PINSEL0 |= PIN0_1_USED_UART0_OR;
}
else
{
PINSEL0 &= ~PIN8_9_USED_UART1_AND;
PINSEL0 |= PIN8_9_USED_UART1_OR;
}
}
//------------------------------------------------------------------
// 定时器的用户 TIMER API
//------------------------------------------------------------------
__inline unsigned int LPC21F_TIMER_CfgPIOMatch(LPC21PS_TIMER pTimer,//定时器基址指针
unsigned int WhichTimer, //对TIMER0 (0);对TIMER1(非0)
unsigned int OutMatchNumber, //输出匹配引脚序号
unsigned int MatchMode) //外部引脚输出匹配模式
{
if(0 == WhichTimer)
{
switch(OutMatchNumber)
{
case 0:LPC21F_PIO_CfgPeriph(3,PIN3_USED_MAT0_0);
break;
case 1:LPC21F_PIO_CfgPeriph(5,PIN5_USED_MAT0_1);
break;
case 2:LPC21F_PIO_CfgPeriph(16,PIN16_USED_MAT0_2);
break;
default:
return 0;
}
}
else
{
switch(OutMatchNumber)
{
case 0:LPC21F_PIO_CfgPeriph(12,PIN12_USED_MAT1_0);
break;
case 1:LPC21F_PIO_CfgPeriph(13,PIN13_USED_MAT1_1);
break;
case 2:LPC21F_PIO_CfgPeriph(19,PIN19_USED_MAT1_2);
break;
case 3:LPC21F_PIO_CfgPeriph(20,PIN20_USED_MAT1_3);
break;
default:return 0;
}
}
pTimer->TEMR = (MatchMode << (OutMatchNumber * 2)); //设置外部匹配寄存器
return 1;
}
__inline void LPC21F_TIMER_CfgMatch(LPC21PS_TIMER pTimer,//定时器基址指针
unsigned int MatchChnlNumber, //匹配寄存器序号
unsigned int MatchThenDo, //发生匹配时执行操作
unsigned int DivPclkData, //预分频数值
unsigned int CampareData) //比较数值,必须大于 0
{
pTimer->TMCR = (MatchThenDo << (MatchChnlNumber * 3)); //设置匹配控制寄存器
pTimer->TMR[MatchChnlNumber] = CampareData; //
if(0 == DivPclkData) return;
pTimer->TPR = DivPclkData - 1;
}
__inline unsigned int LPC21F_TIMER_ReadMatchStatus(LPC21PS_TIMER pTimer,//定时器基址指针
unsigned int WhichChnlStatus) //对应通道状态位宏定义
{// 输入 TIMER_MATCH0[/1/2/3]_STATUS
return (pTimer->TEMR | WhichChnlStatus);
}// 返回值为非 0 说明所查询通道发生匹配
__inline void LPC21F_TIMER_ResetStart(LPC21PS_TIMER pTimer,//定时器基址指针
unsigned int WantToDo)//计数器复位、启动之一或一起
{//WantToDo可以选TIMER_COUNT_START , TIMER_COUNT_RESET
pTimer->TTC = WantToDo;
}
//__inline unsigned int LPC21F_TIMER_CfgCapture(LPC21PS_TIMER pTimr){}
//------------------------------------------------------------------
// 串行外设接口的用户 SPI API
//------------------------------------------------------------------
__inline void LPC21F_SPI_CfgPIO(void)//将相应引脚配置为 SPI
{
LPC21F_PIO_CfgPeriph(0, PIN4_USED_SPI_SCK | PIN5_USED_SPI_MISO |
PIN6_USED_SPI_MOSI| PIN7_USED_SPI_SSEL);
}
__inline void LPC21F_SPI_Configure(unsigned int SPICfg)
{// 设置 采样方式 主从模式 移位方向 中断使能
SPI_SPCR = SPICfg;
}
__inline unsigned int LPC21F_SPI_Status(unsigned int WhichBit)
{
return (SPI_SPSR & WhichBit);
}
__inline void LPC21F_SPI_SendData(unsigned int OutData)
{
SPI_SPDR = OutData;
}
__inline void LPC21F_SPI_SetClock(unsigned int SPIClock)
{
SPI_SPCCR = SPIClock;
}
__inline void LPC21F_SPI_ClearIt(void)
{
SPI_SPINT = 0x01;
}
//__inline void LPC21F_SPI_IsSendEnd(void){ SPI_SPSR = 0x80;}已经包含在 Status
#endif // #ifndef hwd_lib_LPC2104_c_h*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -