LPC213x系列底层硬件驱动函数库.doc_第1页
LPC213x系列底层硬件驱动函数库.doc_第2页
LPC213x系列底层硬件驱动函数库.doc_第3页
LPC213x系列底层硬件驱动函数库.doc_第4页
LPC213x系列底层硬件驱动函数库.doc_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

广州致远电子有限公司 Tel:(020)38730976 38730977 Fax:38730925 http:/目 录LPC213x系列底层硬件驱动函数库1.1GPIO1.1.1使用说明1.1.2源码分析4.2UART7.2.1使用说明7.2.2源码分析9.3I2C13.3.1使用说明13.3.2源码分析15.4SPI26.4.1使用说明26.4.2源码分析27.5SSP29.5.1使用说明29.5.2源码分析30.6定时/计数器32.6.1使用说明32.6.2源码分析36.7PWM41.7.1使用说明41.7.2源码分析43.8ADC46.8.1使用说明46.8.2源码分析47.9DA49.9.1使用说明49.10实时时钟50.10.1使用说明50.10.2源码分析51.11看门狗53.11.1使用说明53.12中断控制器54.12.1使用说明54.12.2源码分析55.13锁相环PLL58.13.1使用说明58.13.2源码分析59.14IAP61.14.1使用说明61.14.2源码分析6468LPC213x系列底层硬件驱动函数库.1 GPIO.1.1 使用说明1 P0口GPIO初始化函数功能:将P0口中,num为1的位初始化为GPIO,并设置方向。表格 1 P0口GPIO初始化函数函数原型void P0_GPIOInit(uint32 num,uint8 dir)入口参数num需要初始化的管脚dir管脚的输入输出方向1输出0输入出口参数无说明num不是引脚号,引脚号对应的位为1如果dir的值有误,则默认为输入模式调用示例:P0_GPIOInit(14)|(116),0);/将P0.4和P0.16初始化为GPIO/并设置为输入模式2 P1口GPIO初始化函数功能:将P1口中,num为1的位初始化为GPIO,并设置方向。表格 2 P1口GPIO初始化函数函数原型void P1_GPIOInit(uint32 num,uint8 dir)入口参数num需要初始化的管脚dir管脚的输入输出方向1输出0输入出口参数无说明P1口中,只有P1.16P1.25可以作为GPIO使用如果dir的值有误,则默认为输入模式调用示例:P1_GPIOInit(118,1);/将P1.18初始化为GPIO/并设置为输出模式3 P0口GPIO输入、输出方向设置函数功能:在P0口中,设置num中“1”所对应位的输入、输出方式。表格 3 P0口GPIO输入、输出方向设置函数原型uint8 P0_GPIODir(uint32 num,uint8 dir)入口参数num 需要初始化的管脚dir管脚的输入输出方向1输出0输入出口参数1 操作成功0 操作失败说明num是按位操作的P0.31仅为输出口调用示例:P0_GPIODir(14)|(116),1);/将P0.4和P0.16设置为输出模式4 P1口GPIO输入、输出方向设置函数功能:在P1口中,设置num中“1”所对应位的输入、输出方式。表格 4 P1口GPIO输入、输出方向设置函数原型uint8 P1_GPIODir(uint32 num,uint8 dir)入口参数num 需要初始化的管脚dir 管脚的输入输出方向1输出0输入出口参数1操作成功0操作失败说明P1口中,只有P1.16P1.25可以作为GPIO使用调用示例:P1_GPIODir(118,1);/将P1.18设置为输出模式5 P0口GPIO输出“1”函数功能:在P0口中,置位num为1的位所对应的管脚。表格 5 P0口GPIO输出“1”函数原型P0_GPIOSet(num)入口参数num 需要初始化的管脚出口参数无说明无调用示例:P0_GPIOSet(14)|(116);/使P0.4和P0.16输出“1”6 P0口GPIO输出“0”函数功能:在P0口中,清零num为1的位所对应的管脚。表格 6 P0口GPIO输出“0”函数原型P0_GPIOClr(num)入口参数num 需要初始化的管脚出口参数无说明无调用示例:P0_ GPIOClr(14)|(116);/使P0.4和P0.16输出“0”7 P0口GPIO输出函数功能:将value所对应的值输出到P0口。表格 7 P0口GPIO输出函数原型Write_P0(value)入口参数value需要输出的值出口参数无说明无调用示例:Write_P0(0xaa);/使P0.0P0.7输出“0xaa”8 P1口GPIO输出“1”函数功能:在P1口中,置位num为1的位所对应的管脚。表格 8 P1口GPIO输出“1”函数原型P1_GPIOSet(num)入口参数num 需要初始化的管脚出口参数无说明P1口中,只有P1.16P1.25可以作为GPIO使用调用示例:P1_ GPIOSet(118);/使P1.18输出“1”9 P1口GPIO输出“0”函数功能:在P1口中,清零num为1的位所对应的管脚。表格 9 P1口GPIO输出“0” 函数原型P1_GPIOClr(num)入口参数num需要设置的管脚出口参数无说明P1口中,只有P1.16P1.25可以作为GPIO使用调用示例:P1_GPIOClr(118);/使P1.18输出“0”10 P1口GPIO输出 函数功能:将value所对应的值输出到P1口。表格 10 P1口GPIO输出函数原型Write_P1(value)入口参数value需要输出的值出口参数无说明P1口中,只有P1.16P1.25可以作为GPIO使用调用示例:Write_P1(0xaa18);/使P1.18P1.25输出“0xaa”.1.2 源码分析程序清单 0.1 GPIO.c源代码/* 文件名称:GPIO.c* 文件描述:LPC213x系列GPIO操作软件包。* 文件说明: 对于引脚的操作使用位操作方式。*/#include config.h/* 函数名称:void P0_GPIOInit(uint32 num,uint8 dir)* 功能描述:将P0口中,num为1的位初始化为GPIO。* 输入: num需要初始化的管脚*dir管脚的输入输出方向*1输出*0输入* 输出:无* 说明:如果dir错误,则默认为输入方向。* 调用模块: P0_GPIOInit(14)|(116),0);/将P0.4和P0.16初始化为GPIO* /且设置为输入模式*/void P0_GPIOInit(uint32 num,uint8 dir) uint8i;if(num&0xffff)!=0)/初始化引脚P0.0P0.15,需要设置PINSEL0for(i=0;i16;i+)if(num&(1i)!=0)PINSEL0 = PINSEL0 & (0x030xffff)/初始化引脚P0.16P0.31,需要设置PINSEL1for(i=16;i32;i+)if(num&(1i)!=0)PINSEL1 = PINSEL1 & (0x03(2*(i-16);if(dir=1)IO0DIR = (IO0DIR&(num)|num;elseIO0DIR = (IO0DIR&(num);/* 函数名称:void P1_GPIOInit(uint32 num,uint8 dir)* 功能描述:将P1口中,num为1的位初始化为GPIO。* 输入: num 需要初始化的管脚*dir管脚的输入输出方向*1输出*0输入* 输出:无* 说明:如果dir错误,则默认为输入方向。*/void P1_GPIOInit(uint32 num,uint8 dir)if(num&(0x3ff16)!=0)/P1.16P1.25,由PINSEL2.3位控制PINSEL2 = PINSEL2 & (1(0x3ff16)/P1.26P1.31,由PINSEL2.2位控制PINSEL2 = PINSEL2 & (12);if(dir=1)IO1DIR = (IO1DIR&(num)|num;elseIO1DIR = (IO1DIR&(num);/* 函数名称:uint8 P0_GPIODir(uint32 num,uint8 dir)* 功能描述:在P0口中,设置num为1的位输入,输出方式。* 输入: num 需要初始化的管脚*dir管脚的输入输出方向*1输出*0输入* 输出:1操作成功*0操作失败*/uint8 P0_GPIODir(uint32 num,uint8 dir)if(dir!=0)&(dir!=1)return(0);if(dir=1)IO0DIR = (IO0DIR&(num)|num;/1表示该位为输出模式elseIO0DIR = (IO0DIR&(num);/0表示该位为输入模式return(1);/* 函数名称:uint8 P1_GPIODir(uint32 num,uint8 dir)* 功能描述:在P1口中,设置num为1的位输入,输出方式。* 输入: num 需要初始化的管脚*dir管脚的输入输出方向*1输出*0输入* 输出:1操作成功*0操作失败*/uint8 P1_GPIODir(uint32 num,uint8 dir)if(dir!=0)&(dir!=1)return(0);if(dir=1)IO1DIR = (IO1DIR&(num)|num;/1表示该位为输出模式elseIO1DIR = (IO1DIR&(num);/0表示该位为输入模式return(1);程序清单 0.2 GPIO软件包中定义的宏定义#defineRead_P0()IO0PIN/ 将P0口的值读出#defineRead_P1()IO1PIN/ 将P1口的值读出#defineWrite_P0(value)IO0PIN = value/ 将value的值写入到P0口中#defineWrite_P1(value)IO1PIN = value/ 将value的值写入到P1口中#defineP0_GPIOSet(num)IO0SET = num/ 在P0口中,置位num为1的位所对应的管脚#defineP0_GPIOClr(num)IO0CLR = num/ 在P0口中,清零num为1的位所对应的管脚#defineP1_GPIOSet(num)IO1SET = num/ 在P1口中,置位num为1的位所对应的管脚#defineP1_GPIOClr(num)IO1CLR = num/ 在P1口中,清零num为1的位所对应的管脚.2 UART.2.1 使用说明1 初始化函数功能:对UARTn进行初始化。表格 11 UART初始化函数原型uint8 UARTn_Ini (uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8 INT_En)入口参数n0UART01UART1baud 串口通信波特率datab数据位个数,有效值为:5,6,7,8stopb停止位个数,有效值为:1,2parity奇偶校验位 0无校验1奇校验2偶校验INT_En中断控制字节,按位操作bit0RBR中断位,1使能,0禁止bit1THRE中断位,1使能,0禁止bit3RX线状态中断位,1使能,0禁止出口参数0初始化失败1初始化成功说明最大通信速率为115200调用示例:UARTn_Ini(0,9600,8,1,0);/ UART0初始化,波特率9600,8位数据位/ 1位停止位,无奇偶校验位2 设置FIFO函数功能:对UARTn进行FIFO初始化。表格 12 UART FIFO初始化函数原型void Set_FIFO(uint8 n,uint8 data)入口参数n0UART01UART1dataFIFO触发字节设定,只能为1,2,8、14个字节出口参数0初始化失败1初始化成功调用示例:Set_FIFO(0, 8);/ UART0 FIFO初始化,8字节触发 3 发送1字节数据函数功能:从UART发送一字节数据。表格 13 UART发送1字节数据函数原型void UARTn_SendByte(uint8 n,uint8 data)入口参数n0UART0 1UART1data 发送的数据出口参数无说明程序采用查询方式,并且没有使用FIFO调用示例:UARTn_SendByte(1,0x55);/ 从UART1发送数据55H4 发送多字节数据函数功能:从UART发送多字节数据。表格 14 UART发送多字节数据函数原型void UARTn_SendData(uint8 n,uint8 *data_buf, uint8 count)入口参数n0UART01UART1data_buf发送数据缓冲区首地址count发送字节数出口参数无说明程序采用查询方式调用示例:UARTn_SendData(0,*data_buf,8);/将data_buf缓冲区中的8个字节数据/从UART0发送出去5 接收数据 函数功能:从UART接收数据。表格 15 UART接收数据函数原型void UARTn_RcvData(uint8 n,uint8 *data_buf, uint8 count)入口参数n0UART01UART1data_buf接收数据缓冲区首地址count接收字节数出口参数无说明程序采用查询方式,存在死等待调用示例:UARTn_RcvData(0,*data_buf,8);/从UART0接收8字节数据/并保存到data_buf缓冲区中.2.2 源码分析程序清单 0.3 UART.c源代码/* 文件名称: UART.c* 文件描述: LPC213x UARTn接口操作软件包。* 文件说明:程序中全部采用查询方式对UART进行操作。*/#include config.h#define TXD0 1/TXD0是引脚P0.0的第2功能#define RXD0 (12)/RXD0是引脚P0.1的第2功能#define TXD1 (116)/TXD1是引脚P0.8的第2功能#define RXD1 (1115200)return(0);/波特率:1115200,否则出错if(datab8)return(0);/数据位数:18,否则出错if(stopb=0)|(stopb2)return(0);/停止位:1、2,否则出错if(parity4)return(0);/奇偶校验位有错/设置UART引脚,且不影响其它引脚if(n = 0)PINSEL0 = (PINSEL0 & (0x0f) | TXD0 | RXD0;/设置UART0elsePINSEL0 = (PINSEL0 & (0x0f16) | TXD1 | RXD1;/设置UART1/*设置串口波特率*/*(volatile uint8 *)(&U0LCR) + n * 0x4000) = 0x80;/DLAB=1*(volatile uint8 *)(&U0DLM) + n * 0x4000) = (Fpclk/16)/baud)/256;*(volatile uint8 *)(&U0DLL) + n * 0x4000) = (Fpclk/16)/baud)%256;/*设置串口模式*/bak = datab - 5;/设置字长if(stopb=2)bak |= 0x04;/判断是否为2位停止位if(parity != 0)parity -= 1;bak |= 0x08;bak |= parity4;/设置奇偶校验位*(volatile uint8 *)(&U0LCR) + n * 0x4000) = bak;*(volatile uint8 *)(&U0IER) + n * 0x4000) = INT_En & 0x07;/设置中断使能寄存器return(1);/* 函数名称:void Set_FIFO(uint8 n,uint8 data)* 功能描述: 设置FIFO* 输入: n0UART01UART1* dataFIFO触发字节设定,只能为1,2,8、14个字节* 输出: 0 初始化失败 * 1 初始化成功*/uint8 Set_FIFO(uint8 n,uint8 data)if(n = 0)/ UART0switch(data)case 1:U0FCR = 0x01;/ 缓冲区为1个字节return(1);case 4:U0FCR = 0x41;/缓冲区为4个字节return(1);case 8:U0FCR = 0x81;/缓冲区为8个字节return(1);case 14:U0FCR = 0xc1;/缓冲区为14个字节return(1);default:return(0);if(n = 1)/UART1switch(data)case 1:U1FCR = 0x01;/缓冲区为1个字节return(1);case 4:U1FCR = 0x41;/缓冲区为4个字节return(1);case 8:U1FCR = 0x81;/缓冲区为8个字节return(1);case 14:U1FCR = 0xc1;/缓冲区为14个字节return(1);default:return(0);return(0);/* 函数名称: void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)* 功能描述: 从串口发送数据。* 输入: n0UART01UART1*data_buf发送数据缓冲区首地址*count发送字节数* 输出:无*/void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)uint8 i;for(i=0;icount;i+)*(volatile uint8 *)(&U0THR) + n * 0x4000) = data_bufi;/发送数据/等待数据发送完毕while(*(volatile uint8 *)(&U0LSR) + n * 0x4000) & 0x20)=0); /* 函数名称: void UARTn_SendByte(uint8 n,uint8 data)* 功能描述: 从串口发送数据。* 输入: n0UART01UART1*data发送的数据* 输出:无* 说明: 程序采用查询方式,并且没有使用FIFO。*/void UARTn_SendByte(uint8 n,uint8 data)*(volatile uint8 *)(&U0THR) + n * 0x4000) = data;/发送数据/等待数据发送完毕while(*(volatile uint8 *)(&U0LSR) + n * 0x4000) & 0x20)=0);/* 函数名称: void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)* 功能描述: 从串口接收数据。* 输入: n0UART01UART1*data_buf接收数据缓冲区首地址*count接收字节数* 输出:无* 说明: 程序采用查询方式,存在死等待,没有使用FIFO。*/void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)uint8 i;for(i=0;icount;i+)/等待接收标志置位while(*(volatile uint8 *)(&U0LSR) + n * 0x4000) & 0x01) = 0);/保存接收到的数据data_bufi = (*(volatile uint8 *)(&U0RBR) + n * 0x4000);.3 I2C.3.1 使用说明1 初始化函数功能: I2C接口初始化。表格 16 I2C接口初始化函数原型voidI2C_Init(uint8 n,uint8 MODE,uint32 Fi2c,uint8 Adr,uint8 slot)入口参数nI2C接口号,0I2C0,1I2C1MODE工作模式,0-从模式,1-主模式Fi2c I2C通信速率,0400K,如果超过400K则会强制设置为400KHz Adr当设置为从模式时,Adr表示从地址,在主模式下,该参数是无效slot由于I2C采用IRQ中断方式,所以需要指定对应的通道,015 出口参数0初始化失败1初始化成功说明程序采用中断方式进行操作,需要指定中断通道调用示例:I2C_Init(0,1,100000,0,0);/I2C0初始化为主模式,100K通信速率,/中断通道号为slot0,不关心从机地址I2C_Init(0,0,100000,0xA0,0);/I2C0初始化为从模式,从机地址为0xA0,/中断通道号为slot0,不关心通信速率2 向无子地址器件发送1字节数据函数功能:向无子地址器件发送1字节数据。表格 17 I2C接口向无子地址器件发送1字节数据函数原型uint8 I2C_SendByte(uint8 n,uint8 sla,uint8 dat)入口参数nI2C接口号,0I2C0,1I2C1sla器件地址I2C dat要发送的数据出口参数0操作失败1操作成功说明程序死等待操作完成调用示例:I2C_SendByte(0,0xa0,0x55);/向器件地址为 0xA0的器件发送数据55H3 从无子地址器件读取1字节数据函数功能:从无子地址器件读取1字节数据。表格 18 I2C接口从无子地址器件读取1字节数据 函数原型uint8 I2C_RcvByte(uint8 n,uint8 sla,uint8 *dat)入口参数nI2C接口号,0I2C0,1I2C1slaI2C器件地址 dat接收数据的指针出口参数0操作失败1操作成功说明程序死等待操作完成调用示例:I2C_RcvByte(0,0xa0,dat);/从器件地址为0xA0的器件接收1个字节的数据到/dat缓冲区4 从有子地址器件任意地址开始读取N字节数据函数功能:从有子地址器件任意地址开始读取N字节数据。 表格 19 I2C接口从有子地址器件任意地址开始读取N字节数据函数原型uint8 I2C_ReadNByte(uint8 n,uint8 sla,uint32 suba_type,uint32 suba,uint8 *s,uint32 num)入口参数nI2C接口号,0I2C0,1I2C1slaI2C器件从地址suba_type子地址结构1单字节地址2双字节地址38X结构suba器件子地址*s数据接收缓冲区指针num读取的个数出口参数0操作失败1操作成功说明程序死等待操作完成调用示例:I2C_ReadNByte(0,0xa0,2,0x1000,*s,64);/从0xA0器件的1000H地址处读取/64字节的数据,保存到s缓冲区/器件地址为双字节,如24C1285 向有子地址器件写入N字节数据函数功能:向有子地址器件写入N字节数据。表格 20 I2C接口从有子地址器件任意地址开始读取N字节数据函数原型uint8 I2C_WriteNByte(uint8 n,uint8 sla,uint32 suba_type,uint32 suba,uint8 *s,uint32 num)入口参数nI2C接口号,0I2C0,1I2C1slaI2C器件从地址suba_type子地址结构1单字节地址2双字节地址38X结构suba器件子地址*s数据发送缓冲区指针num写入数据个数出口参数0操作失败1操作成功说明程序死等待操作完成调用示例:I2C_WriteNByte(0,0xa0,1,0x00,*s,8);/向0xA0器件的00地址处写入/8字节数据,发送数据缓冲区为s。/器件子地址为单字节,如24C02I2C_WriteNByte(0,0xa0,3,0x00,*s,8);/向0xA0器件的00地址处写入/8字节数据,发送数据缓冲区为s。/器件子地址为8+X,如24C16.3.2 源码分析程序清单 0.4 I2C.c源代码/* 文件名称: I2C.c* 文件描述:LPC213x硬件I2C中断方式软件包。* 文件说明:软件包采用中断方式进行操作,程序仍会死等待操作完成。*/#include config.h/*定义用于和I2C中断传送信息的全局变量*/volatileuint8slarv;/子地址接收标志,为1时表示已接收从机子地址volatileuint32adrpoint;/定义从机缓冲区读写操作指针volatileuint8I2C_n;/I2C接口号volatileuint8I2C_sla;/I2C器件从地址volatileuint32I2C_suba;/I2C器件的内部子地址volatileuint8I2C_suba_num;/I2C子地址字节数volatileuint8*I2C_buf;/I2C数据缓冲区指针,/如果要将I2C接口设置为从机模式,/那么,在调用软件包前要设置I2C数据缓冲区指针 I2C_buf volatileuint32I2C_num;/要读取/写入的数据个数volatileuint8I2C_end;/I2C总线结束标志:结束总线是置1volatileuint8I2C_suba_en;/*子地址控制0子地址已经处理或者不需要子地址1读取操作2写操作*/* 函数名称:_irqIRQ_I2C()* 函数功能:硬件I2C服务程序。* 入口参数:无* 出口参数:无* 说明:注意处理子地址为2字节的情况。*/void_irqIRQ_I2C(void)/*读取I2C状态寄存器I2STAT按照全局变量的设置进行操作及设置软件标志清除中断逻辑,中断返回*/uint8stat;/用来读取I2C状态寄存器I2STATstat = *(volatile uint32 *)(&I2C0STAT) + (I2C_n*0x10000);/读取I2STAT,I2STAT=0xE001C004switch(stat & 0xF8)/*根据状态码进行相应的处理*/case 0x08:/*已发送起始条件*/主发送和主接收都有/*装入SLA+W或者SLA+R*/if(I2C_suba_en = 1)/*SLA+R*/指定子地址读/先写入地址*(volatile uint32 *)(&I2DAT) + (I2C_n*0x10000) = I2C_sla &0xfe;else/*SLA+W*/直接发送从机地址*(volatile uint32 *)(&I2DAT) + (I2C_n*0x10000) = I2C_sla &0xfe;/*清零SI位*/*(volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000) = (13)|/SI (1 0)/如果还有数据需要读取/读取数据*(volatile uint32 *)(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论