⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_lpc21xx_c.h

📁 采用LPC的芯片做的气体排放检测,包括气体成分分析,数据的处理,数据传输给工作站.
💻 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 + -