📄 lpc214x test.c
字号:
VICVectCntl12 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot12
VICVectAddr12 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 13:
VICVectCntl13 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot13
VICVectAddr13 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 14:
VICVectCntl14 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot14
VICVectAddr14 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
case 15:
VICVectCntl15 = CPU_EN_IRQ | intr; //中断源intr分配到IRQslot15
VICVectAddr15 = (INT32U) intaddr; //中断源intr中断服务程序地址
break;
default:
return(2);
break;
}
}
else //设置为非向量IRQ中断
{
VICDefVectAddr = (INT32U)intaddr;
}
VICIntEnable |= 1 << intr; //使能中断源
return(0);
}
#ifdef CPU_PWM_EN
/*********************************************************************
* 脉宽调制器PWM模式设置周期函数 *
* 功能描述:设置工作在PWM模式的寄存器 *
* 输入参数:cycle 脉冲周期(单位:us) *
* 输出参数:void *
*********************************************************************/
void CPU_PWM_SetCycle(INT32U cycle)
{
FP64 temp;
temp=((FP64)cycle/1000000L)*Fpclk;
PWMPR = 0; //不分频
PWMMR0 = (INT32U)temp; //设置脉冲周期
PWMMCR = 0x02; //PWMMR0与PWMTC匹配时复位PWMTC
}
/*********************************************************************
* 脉宽调制器通道设置函数 *
* 功能描述:设置PWM指定通道的脉冲类型以及相应管脚的设置 *
* 输入参数:type 脉冲类型为正脉冲或负脉冲 *
* channel pwm所选择的通道PWM1~6 *
* 输出参数:void *
*********************************************************************/
void CPU_PWM_SetChann(INT8U channel, INT32U type)
{
if(type == CPU_PWM_PLUS) //如果是正脉冲
{
switch(channel)
{
case CPU_PWM1:
CPU_IO_SetP0Fnct(0, 2); //P0.0选择PWM1功能
PWMPCR = CPU_PWM1_SINGLE; //允许PWM1输出,单边PWM
case CPU_PWM2:
CPU_IO_SetP0Fnct(7, 2); //P0.7选择PWM2功能
PWMPCR = CPU_PWM2_SINGLE; //允许PWM2输出,单边PWM
break;
case CPU_PWM3:
CPU_IO_SetP0Fnct(1, 2); //P0.1选择PWM3功能
PWMPCR = CPU_PWM3_SINGLE; //允许PWM3输出,单边PWM
break;
case CPU_PWM4:
CPU_IO_SetP0Fnct(8, 2); //P0.8选择PWM4功能
PWMPCR = CPU_PWM4_SINGLE; //允许PWM4输出,单边PWM
break;
case CPU_PWM5:
CPU_IO_SetP0Fnct(21, 2); //P0.21选择PWM5功能
PWMPCR = CPU_PWM5_SINGLE; //允许PWM5输出,单边PWM
break;
case CPU_PWM6:
CPU_IO_SetP0Fnct(9, 2); //P0.9选择PWM6功能
PWMPCR = CPU_PWM6_SINGLE; //允许PWM6输出,单边PWM
break;
default:
break;
}
}
else //如果是负脉冲
{
switch(channel)
{
case CPU_PWM2:
CPU_IO_SetP0Fnct(7, 2); //P0.7选择PWM2功能
PWMPCR = CPU_PWM2_DOUBLE; //允许PWM2双边沿输出
break;
case CPU_PWM4:
CPU_IO_SetP0Fnct(8, 2); //P0.8选择PWM4功能
PWMPCR = CPU_PWM4_DOUBLE; //允许PWM4双边沿输出
break;
case CPU_PWM6:
CPU_IO_SetP0Fnct(9, 2); //P0.9选择PWM6功能
PWMPCR = CPU_PWM6_DOUBLE; //允许PWM6双边沿输出
break;
default:
break;
}
}
}
/*********************************************************************
* PWM输出指定占空比脉冲函数 *
* 功能描述:PWM输出指定占空比脉冲函数 *
* 输入参数:rate pwm占空比,0.0~1.0 *
* channel pwm所选择的通道PWM1~6 *
* 输出参数:void *
**********************************************************************/
void CPU_PWM_PlusPulse(INT8U channel, FP32 rate)
{
if((rate < 0)||(rate > 1)) return;
switch(channel)
{
case CPU_PWM1:
PWMMR2 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM1_LOCK; //PWM0和PWM1匹配锁存
case CPU_PWM2:
PWMMR2 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM2_LOCK; //PWM0和PWM2匹配锁存
break;
case CPU_PWM3:
PWMMR3 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM3_LOCK; //PWM0和PWM3匹配锁存
break;
case CPU_PWM4:
PWMMR4 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM4_LOCK; //PWM0和PWM4匹配锁存
break;
case CPU_PWM5:
PWMMR5 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM5_LOCK; //PWM0和PWM5匹配锁存
break;
case CPU_PWM6:
PWMMR6 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM6_LOCK; //PWM0和PWM6匹配锁存
break;
default:
break;
}
}
/*********************************************************************
* PWM占空比设置函数 *
* 功能描述:设置PWM占空比 *
* 输入参数:type 脉冲类型为正脉冲或负脉冲 *
* rate pwm占空比,0.0~1.0 *
* channel pwm所选择的通道PWM1~6 *
* 输出参数:void *
**********************************************************************/
void CPU_PWM_UpdateRate(INT32U type, FP32 rate, INT8U channel)
{
if((rate < 0)||(rate > 1)) return;
if(type == CPU_PWM_PLUS) //如果是正脉冲
{
switch(channel)
{
case CPU_PWM1:
PWMMR2 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM1_LOCK; //PWM0和PWM1匹配锁存
break;
case CPU_PWM2:
PWMMR2 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM2_LOCK; //PWM0和PWM2匹配锁存
break;
case CPU_PWM3:
PWMMR3 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM3_LOCK; //PWM0和PWM3匹配锁存
break;
case CPU_PWM4:
PWMMR4 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM4_LOCK; //PWM0和PWM4匹配锁存
break;
case CPU_PWM5:
PWMMR5 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM5_LOCK; //PWM0和PWM5匹配锁存
break;
case CPU_PWM6:
PWMMR6 = (INT32U)(rate*PWMMR0);//占空比为rate
PWMLER = CPU_PWM0_PWM6_LOCK; //PWM0和PWM6匹配锁存
break;
default:
break;
}
}
else //如果是负脉冲
{
switch(channel)
{
case CPU_PWM2:
PWMMR1 = (INT32U)((1-rate)*PWMMR0); //PWM2的位置
PWMMR2 = PWMMR0; //PWM0和PWM1匹配锁存、PWM0和PWM2匹配锁存
PWMLER = (CPU_PWM0_PWM1_LOCK | CPU_PWM0_PWM2_LOCK);
break;
case CPU_PWM4:
PWMMR3 = (INT32U)((1-rate)*PWMMR0); //PWM4的位置
PWMMR4 = PWMMR0; //PWM0和PWM3匹配锁存、PWM0和PWM4匹配锁存
PWMLER = (CPU_PWM0_PWM3_LOCK | CPU_PWM0_PWM4_LOCK);
break;
case CPU_PWM6:
PWMMR5 = (INT32U)((1-rate)*PWMMR0); //PWM6的位置
PWMMR6 = PWMMR0; //PWM0和PWM5匹配锁存、PWM0和PWM6匹配锁存
PWMLER = (CPU_PWM0_PWM5_LOCK | CPU_PWM0_PWM6_LOCK);
break;
default:
break;
}
}
}
/*********************************************************************
* PWM启动函数 *
* 功能描述:启动PWM *
* 输入参数:void *
* 输出参数:void *
**********************************************************************/
void CPU_PWM_Start(void)
{
PWMTCR = 0x02; //复位PWMTC
PWMTCR = 0x09; //启动PWM输出
}
/*********************************************************************
* PWM停止函数 *
* 功能描述:停止PWM *
* 输入参数:void *
* 输出参数:void *
**********************************************************************/
void CPU_PWM_Stop(void)
{
PWMTCR = 0x00;
}
#endif //#endif of #ifdef CPU_PWM_EN
/***********************************************************************
* 设置P0口功能函数 *
* 功能描述:对P0口的功能进行设置。 *
* 输入参数:io_num IO口编号,0~31 *
* io_fnct IO口功能编号,0~3 *
* 输出参数:error 错误信息, 0:正常, 1:功能错误, 2:IO编号错误 *
************************************************************************/
INT8U CPU_IO_SetP0Fnct(INT8U io_num, INT8U io_fnct)
{
INT8U error = 0;
if(io_fnct < 4)
{
if(io_num < 16)
{
PINSEL0 &= ~(0x00000003<<(io_num<<1));
PINSEL0 |= (io_fnct<<(io_num<<1));
}
else if(io_num < 32)
{
io_num -= 16;
PINSEL1 &= ~(0x00000003<<(io_num<<1));
PINSEL1 |= (io_fnct<<(io_num<<1));
}
else
{
error = 2;
}
}
else
{
error = 1;
}
return(error);
}
/***********************************************************************
* 设置P1口功能函数 *
* 功能描述:对P1口的功能进行设置。 *
* 输入参数:io_num IO口编号,16~31 *
* io_fnct IO口功能编号,0~1 *
* 输出参数:error 错误信息, 0:正常, 1:功能错误, 2:IO编号错误 *
************************************************************************/
INT8U CPU_IO_SetP1Fnct(INT8U io_num, INT8U io_fnct)
{
INT8U error = 0;
if((io_num > 15)&&(io_num < 32))
{
if(io_num < 26)
{
if(io_fnct == 0)
{
PINSEL2 &= 0xFFFFFFF7;
}
else if(io_fnct == 1)
{
PINSEL2 |= BIT3;
}
else
{
error = 1;
}
}
else
{
if(io_fnct == 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -