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

📄 lpc214x test.c

📁 LPC2140 cpu外设全接口 注释详细到极点了
💻 C
📖 第 1 页 / 共 5 页
字号:
                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 + -