📄 lpc214x test.c
字号:
/*********************************************************************
*********************************************************************/
#define CPU_GLOBALS
#include "includes.h"
/*********************************************************************
* 启动定时器T0函数 *
* 功能描述:启动定时器TImer0开始定时计数。 *
* 输入参数:void *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_StartT0(void)
{
T0TCR = BIT0;
CpuTimer0Stat = WORKING_STAT;
}
/*********************************************************************
* 启动定时器T1函数 *
* 功能描述:启动定时器TImer1开始定时计数。 *
* 输入参数:void *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_StartT1(void)
{
T1TCR = BIT0;
CpuTimer1Stat = WORKING_STAT;
}
/*********************************************************************
* 停止定时器T0函数 *
* 功能描述:停止定时器Timer0工作。 *
* 输入参数:void *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_StopT0(void)
{
T0TCR = 0x00;
CpuTimer0Stat = STOP_STAT;
}
/*********************************************************************
* 停止定时器T1函数 *
* 功能描述:停止定时器Timer1工作。 *
* 输入参数:void *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_StopT1(void)
{
T1TCR = 0x00;
CpuTimer1Stat = STOP_STAT;
}
/*********************************************************************
* 定时器定时功能设置函数 *
* 功能描述:对定时器定时功能的特殊寄存器进行初始化。 *
* 输入参数:tmrsel 定时器选择Timer0或者Timer1 *
* chann 定时器MRx通道号 *
* work_mod 匹配控制方式设置 *
* tlen 定时长度 单位:us *
* clktyp 时钟类型 *
* freq 时钟频率 单位:Hz *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_SetTime(INT8U tmrsel, INT8U chann, INT16U work_mod, INT32U tlen, INT8U clktyp, INT32U freq)
{
INT8U div;
FP64 temp;
INT8U work_stat;
div = (INT8U)((FP64)freq/ULONG_MAX * ((FP64)tlen/1000000L));
if(chann > 3) return;
if(tmrsel == CPU_T0) //选用定时器0
{
work_stat = CpuTimer0Stat;
if(CpuTimer0Stat == WORKING_STAT)
CPU_TMR_StopT0();
T0IR = 0xFF;
T0TC = 0; //定时器设置为0
T0PR = div; //时钟分频
T0MCR = T0MCR & (~(0x07<<(chann*3))) | work_mod<<(chann*3);
#ifdef CPU_LPC2100
switch(clktyp)
{
case CPU_TMR_CAP0:
T0CTCR |= 0x01;
break;
case CPU_TMR_CAP1:
T0CTCR |= 0x05;
break;
case CPU_TMR_CAP2:
T0CTCR |= 0x09;
break;
case CPU_TMR_CAP3:
T0CTCR |= 0x0D;
break;
default:
T0CTCR = 0x00;
break;
}
#endif
temp=((FP64)tlen/1000000L)*freq;
switch(chann)
{
case 0:
T0MR0 = (INT32U)temp;
break;
case 1:
T0MR1 = (INT32U)temp;
break;
case 2:
T0MR2 = (INT32U)temp;
break;
default:
T0MR3 = (INT32U)temp;
break;
}
if(work_stat == WORKING_STAT)
CPU_TMR_StartT0();
}
else //选用定时器1
{
work_stat = CpuTimer1Stat;
if(CpuTimer1Stat == WORKING_STAT)
CPU_TMR_StopT1();
T1IR = 0xFF;
T1TC = 0; //定时器设置为0
T1PR = div; //时钟分频
T1MCR = T1MCR & (~(0x07<<(chann*3))) | work_mod<<(chann*3);
#ifdef CPU_LPC2100
switch(clktyp)
{
case CPU_TMR_CAP0:
T1CTCR |= 0x01;
break;
case CPU_TMR_CAP1:
T1CTCR |= 0x05;
break;
case CPU_TMR_CAP2:
T1CTCR |= 0x09;
break;
case CPU_TMR_CAP3:
T1CTCR |= 0x0D;
break;
default:
T1CTCR = 0x00;
break;
}
#endif
temp=((FP64)tlen/1000000L)*freq;
switch(chann)
{
case 0:
T1MR0 = (INT32U)temp;
break;
case 1:
T1MR1 = (INT32U)temp;
break;
case 2:
T1MR2 = (INT32U)temp;
break;
default:
T1MR3 = (INT32U)temp;
break;
}
if(work_stat == WORKING_STAT)
CPU_TMR_StartT1();
}
}
/*********************************************************************
* 定时器捕获功能设置函数 *
* 功能描述:对定时器捕获功能的特殊寄存器进行初始化。 *
* 输入参数:tmrsel 选择定时器0或1用作捕获功能 *
* pinsel 引脚选择 *
* edge 定时器捕获边沿的选择 *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_SetCap(INT8U tmrsel,INT8U chann,INT8U edge)
{
if(tmrsel == CPU_T0)
{
T0CCR = T0CCR&(~(0x07 << (chann * 3)))|(edge << (chann*3));
T0TC = 0;
}
else
{
T1CCR = T1CCR&(~(0x07 << (chann * 3)))|(edge << (chann*3));
T1TC = 0;
}
}
/*********************************************************************
* 停止定时器某通道函数 *
* 功能描述:停止指定定时器某一通道的工作。 *
* 输入参数:tmrsel 定时器选择Timer0或者Timer1 *
* chann 定时器MRx通道号 *
* 输出参数:void *
**********************************************************************/
void CPU_TMR_StopChannel(INT8U tmrsel, INT8U chann)
{
if(chann > 3) return;
if(tmrsel == CPU_T0) //选用定时器0
{
T0MCR = T0MCR & (~(0x07<<(chann*3)));
}
else
{
T1MCR = T1MCR & (~(0x07<<(chann*3)));
}
}
/*********************************************************************
* 屏蔽中断源函数 *
* 功能描述:屏蔽指定中断。 *
* 输入参数:intr 中断源 *
* 输出参数:void *
**********************************************************************/
void CPU_VIC_DisIrq(INT8U intr)
{
VICIntEnable &= ~(1 << intr); //使能中断源
}
/*********************************************************************
* 使能中断源函数 *
* 功能描述:使能指定中断。 *
* 输入参数:intr 中断源 *
* 输出参数:void *
**********************************************************************/
void CPU_VIC_EnIrq(INT8U intr)
{
VICIntEnable |= 1 << intr; //使能中断源
}
/*********************************************************************
* 设置向量中断控制器中断源函数 *
* 功能描述:对VIC控制的中断源进行设置。 *
* 输入参数:inttyp 中断源产生中断的类型有FIQ、向量IRQ、非向量IRQ *
* irq_pri 向量IRQ的优先级选择slot0~15 *
* intr 中断源 *
* intaddr 中断服务程序入口地址 *
* 输出参数:void *
**********************************************************************/
INT8U CPU_VIC_SetIntr(INT8U inttyp, INT8U intr, INT8U irq_pri, INT32U intaddr)
{
if(inttyp == CPU_FIQ)
{
VICIntSelect |= 1 << intr; //设置中断源为FIQ中断
}
else if(inttyp == CPU_VECT_IRQ)
{
if(0 == intaddr) return 1;
VICIntSelect = VICIntSelect & (~(1 << intr)); //中断源相对应的通道设置为IRQ中断
switch(irq_pri)
{
case 0:
VICVectCntl0 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot0,即最高优先级
VICVectAddr0 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 1:
VICVectCntl1 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot1
VICVectAddr1 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 2:
VICVectCntl2 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot2
VICVectAddr2 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 3:
VICVectCntl3 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot3
VICVectAddr3 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 4:
VICVectCntl4 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot4
VICVectAddr4 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 5:
VICVectCntl5 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot5
VICVectAddr5 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 6:
VICVectCntl6 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot6
VICVectAddr6 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 7:
VICVectCntl7 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot7
VICVectAddr7 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 8:
VICVectCntl8 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot8
VICVectAddr8 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 9:
VICVectCntl9 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot9
VICVectAddr9 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 10:
VICVectCntl10 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot10
VICVectAddr10 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 11:
VICVectCntl11 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot11
VICVectAddr11 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 12:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -