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

📄 pwm.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
    if (pArgData->uiActCtrl > __PWM_ACT_MAX) {                          /*  判断匹配响应动作是否正确    */
        pArgData->uiActCtrl = __PWM_NONE;                               /*  用户不输入该参数的默认值    */
    }
    if (pArgData->uiPwmDown == -1) {                                    /*  用户没有输入下降沿数据      */
        return OPERATE_FAIL;                                            /*  返回错误                    */
    }
   
    
    if (pArgData->uiEdg == __PWM_SIG_OUT) {                             /*  单边沿                      */
        puiBaseAddr[GucMRxTab[uiChanle] << uiOffBase] = __pwmUsToFre(pArgData->uiPwmDown);
                                                                        /*  设置MRX匹配值               */
        
        if (uiChanle != 1) {                                            /*  1通道为单通道不需要设置     */
            puiBaseAddr[__B_PWM_PCR << uiOffBase]    &= ~(1 << uiChanle);
                                                                        /*  设置为单边沿模式            */
        }                                                               
    } else {                                                            /*  双边沿                      */
    
        if (uiChanle == 1) {                                            /*  1通道不支持双边沿           */
            return OPERATE_FAIL;
        }
        /*
         *  双边沿触发,不设置上升沿匹配值,默认使用前一个通道值作为该通道上升沿的值
         */
        if (pArgData->uiPwmUp != -1) {                                 
            puiBaseAddr[GucMRxTab[uiChanle-1] << uiOffBase] = __pwmUsToFre(pArgData->uiPwmUp);
                                                                        /*  设置上升沿匹配值            */
            puiBaseAddr[__B_PWM_LER << uiOffBase] |= (1 << (uiChanle - 1));           
                                                                        /*  匹配锁存指定的通道          */
        }
        
        puiBaseAddr[GucMRxTab[uiChanle] << uiOffBase]   = __pwmUsToFre(pArgData->uiPwmDown);
                                                                        /*  设置下降沿匹配值            */
                                                                                
        puiBaseAddr[__B_PWM_PCR << uiOffBase] |= (1 << uiChanle);       /*  设置为双边沿模式            */
    }
    
    puiBaseAddr[__B_PWM_MCR << uiOffBase] |= pArgData->uiActCtrl << 3*uiChanle;  
                                                                        /*  通道匹配时相应的动作        */
                                                                        
    puiBaseAddr[__B_PWM_LER << uiOffBase] |= (1 << uiChanle);           /*  匹配锁存指定的通道          */
    puiBaseAddr[__B_PWM_PCR << uiOffBase] |= (1 << (uiChanle + 8));     /*  使能该通道PWM输出           */
    
    return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           pwmModeSet
** Descriptions:            pwm模式设置参数,字符串传入参数
** Input parameters:        uiArgID   部件ID,0表示使用PWM0设备
**                          uiChanle  设置的通道范围:1 - 6  
**                          pucData   字符串传入参数指针,必选参数关键字如下
**                              PwmEdg      边沿输出模式,0表示单边沿输出,1表示双边沿输出
**                              PwmDowm     设置通道的下降沿位置,该位置可为单双边沿下降沿
**                              可选关键字:
**                              PwmUp       设置通道的上升沿位置,仅在双边沿时有效,单边沿可不设置,双边沿
**                                          模式不设置该参数,该参数采用上一通道的参数做为上升沿参数
**                              PwmOutCtrl  1,设置PWM输出到管脚,0表示PWM不输出到管脚,不设置默认输出到管脚
**                              PwmActCtrl  当设置通道匹配的TC动作:0,无动作 1,产生中断 2,TC复位
**                                          3,TC复位且产生中断 4,TC停止 5,TC停止同时也产生中断
**                                          不设置默认无动作
** Output parameters:       NONE
** Returned value:          OPERATE_FAIL        设置失败
**                          OPERATE_SUCCESS     设置成功
*********************************************************************************************************/
int32 pwmModeSet (uint32    uiArgID,
                  uint32    uiChanle, 
                  char     *pucData) 
{
    uint32 uiTemp[7] ={-1, -1, -1, -1, -1, -1, -1};
    
    
    if (!pucData) {
        return OPERATE_FAIL;
    }
    
    ImpCmd(Tab_PWM, pucData, uiTemp);
    
    return __pwmModeSet(uiArgID, uiChanle, (__PPWM_PARM)uiTemp);
}

/*********************************************************************************************************
** Function name:           pwmStart
** Descriptions:            pwm启动函数
** Input parameters:        uiArgID   部件ID,0表示使用PWM0设备
** Output parameters:       NONE
** Returned value:          OPERATE_FAIL        启动失败
**                          OPERATE_SUCCESS     启动成功
*********************************************************************************************************/
int32 pwmStart (uint32 uiArgID)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __PWM_MAX_NUM) {                                     /*  传入ID号错误                */
        return OPERATE_FAIL;
    }
    
    puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase;                   /*  获取寄存器基地址            */
    uiOffBase   = GppwiDataTab[uiArgID]->uiOffBase;
    
    puiBaseAddr[__B_PWM_TCR << uiOffBase] &= ~(3 << 1);                 /*  停止复位计数器              */
    puiBaseAddr[__B_PWM_TCR << uiOffBase] |= (1 << 0);                  /*  计数器使能                  */
    
    return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           __pwmTimeDly
** Descriptions:            pwmn内部使用的一个短延时函数
** Input parameters:        uiDly   延时时间,数字越大,时间越久
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
static void __pwmTimeDly (uint32 uiDly)
{
    uint32 i, j;
    
    for (; j < uiDly; j++) {
        for (i = 0; i < 100; i++);
    }
}

/*********************************************************************************************************
** Function name:           pwmReStart
** Descriptions:            pwm重启动函数
** Input parameters:        uiArgID   部件ID,0表示使用PWM0设备
** Output parameters:       NONE
** Returned value:          OPERATE_FAIL        重启失败
**                          OPERATE_SUCCESS     重启成功
*********************************************************************************************************/
int32 pwmReStart (uint32 uiArgID)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __PWM_MAX_NUM) {                                     /*  传入ID号错误                */
        return OPERATE_FAIL;
    }
    
    puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase;                   /*  获取寄存器基地址            */
    uiOffBase   = GppwiDataTab[uiArgID]->uiOffBase;
    
    puiBaseAddr[__B_PWM_TCR << uiOffBase] |= (1 << 1);                  /*  复位计数器                  */
    __pwmTimeDly(1);                                                    /*  确保复位计数器成功          */
    puiBaseAddr[__B_PWM_TCR << uiOffBase] &= ~(3 << 1);                 /*  停止复位计数器              */
    puiBaseAddr[__B_PWM_TCR << uiOffBase] |= (1 << 0);                  /*  计数器使能                  */
    
    return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           pwmStop
** Descriptions:            pwm停止函数
** Input parameters:        uiArgID   部件ID,0表示使用PWM0设备
** Output parameters:       NONE
** Returned value:          OPERATE_FAIL        停止失败
**                          OPERATE_SUCCESS     停止成功
*********************************************************************************************************/
int32 pwmStop (uint32 uiArgID)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __PWM_MAX_NUM) {                                     /*  传入ID号错误                */
        return OPERATE_FAIL;
    }
    
    puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase;                   /*  获取寄存器基地址            */
    uiOffBase   = GppwiDataTab[uiArgID]->uiOffBase;
    
    puiBaseAddr[__B_PWM_TCR << uiOffBase] &= ~(1 << 0);                  /*  关闭定时计数器             */
    
    return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           __pwmISR
** Descriptions:            pwm中断服务函数,驱动部分,只有清中断,用户部分代码可以在钩子函数里实现
** Input parameters:        uiArgID   部件ID,0表示使用PWM0设备
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
void __pwmIsr (uint32 uiArgID)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __PWM_MAX_NUM) {                                     /*  传入ID号错误                */
        return;
    }
    
    puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase;                   /*  获取寄存器基地址            */
    uiOffBase   = GppwiDataTab[uiArgID]->uiOffBase;
    
    puiBaseAddr[__B_PWM_IR << uiOffBase] |= ((7 << 8) | 0x0f);          /*  清除所有中断标志位          */
}

/*********************************************************************************************************
** Function name:           pwm0ISR
** Descriptions:            pwm0中断服务函数,被用户中断管理函数调用
** Input parameters:        NONE
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
void pwm0Isr (void)
{
    pwm0Hook();
    __pwmIsr(0);                                                        /*  清除中断标志                */
    VICVectAddr = 0;
}

                                                                        
/*********************************************************************************************************
   END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -