嵌入式学习小组
直播中

五斤麻辣油

8年用户 1222经验值
擅长:电源/新能源
私信 关注

M453系列有2路PWM,每路有6个通道,有的通道不能捕捉到是为什么?

M453系列有2路PWM,每路有6个通道。使用捕捉功能,发现有的通道不能捕捉到。拿开发板试了全部12个通道,发现只有4个通道可以使用。分别是PWM0和PWM1的2,3通道可以正常工作。0,1,4,5无法正常工作。问下各位,是我的设置有问题吗?
12通道,分别实验:
//        PWM0_CH0_Init();                        //0
//        PWM0_CH1_Init();                        //0
//        PWM0_CH2_Init();                        //OK
//        PWM0_CH3_Init();                        //OK
//        PWM0_CH4_Init();                        //0
//        PWM0_CH5_Init();                        //0
//        
//        PWM1_CH0_Init();                        //0
//        PWM1_CH1_Init();                        //0
//        PWM1_CH2_Init();                        //OK
//        PWM1_CH3_Init();                        //OK
//        PWM1_CH4_Init();                        //0
        PWM1_CH5_Init();                        //0

附PWM0_CH0_Init()和PWM0_CH2_Init()初始化代码。
void PWM0_CH0_Init(void)
{
//1-复位PWM1
    SYS_ResetModule(PWM0_RST);

//2-设置PWM计数器工作模式&预分频器
        //设置预分频器。分频比1+1=2,144MHz/2=72MHz
        PWM0->CLKPSC0_1 = 1;

    //设置向上计数模式&计数器自动重载
        PWM0->CTL1 &= ~(0x00000001 << (16+0));                                                        //计数器设置为自动重载模式
        PWM0->CTL1 &= ~(0x00000003 << (2 * 0));                                                //设置向上计数模式                                
        
        //设置计数最大周期PERIOD
    (PWM0)->PERIOD[0] = 0xFFFF;                                                //计数器最大值设置为0xFFFF
        
//3-设置捕捉工作模式&使能相应管教
        //使能PWM输入捕捉, PWM通道捕捉功能的输入来自相关的复用管脚。
        PWM0->CAPINEN |= (0x00000001 << 0);                        
        
        //使能捕捉功能。当检测到输入信号的上升/下降沿时锁存PWM计数器值并保存到RCAPDAT(向上锁存)和FCAPDAT(向下锁存)。
        PWM0->CAPCTL |= (0x00000001 << 0);                        
        

        //使能上升沿捕捉重载计数器
        PWM0->CAPCTL |= (0x00000001 << (16+0));
        
//4-中断使能
        //CAPIEN,使能上升沿锁存中断
        PWM0->CAPIEN |= (0x00000001 << 0);
        
        //INTEN0,使能周期点中断(计数器溢出中断)
//        (PWM0)->INTEN0 |= (PWM_INTEN0_PIEN0_Msk << 2);                                //暂不使能计数器溢出中断,用不到

        //使能NVIC中断
        NVIC_EnableIRQ(PWM0P1_IRQn);

//5-计数器使能
        //CNTEN,PWM计数器和时钟分频器开始工作
        PWM0->CNTEN |= (0x00000001 << 0);        
}

void PWM0_CH2_Init(void)
{
//1-复位PWM1
    SYS_ResetModule(PWM0_RST);

//2-设置PWM计数器工作模式&预分频器
        //设置预分频器。分频比1+1=2,144MHz/2=72MHz
        PWM0->CLKPSC2_3 = 1;

    //设置向上计数模式&计数器自动重载
        PWM0->CTL1 &= ~(0x00000001 << (16+2));                                                        //计数器设置为自动重载模式
        PWM0->CTL1 &= ~(0x00000003 << (2 * 2));                                                //设置向上计数模式                                
        
        //设置计数最大周期PERIOD
    (PWM0)->PERIOD[2] = 0xFFFF;                                                //计数器最大值设置为0xFFFF
        
//3-设置捕捉工作模式&使能相应管教
        //使能PWM输入捕捉, PWM通道捕捉功能的输入来自相关的复用管脚。
        PWM0->CAPINEN |= (0x00000001 << 2);                        
        
        //使能捕捉功能。当检测到输入信号的上升/下降沿时锁存PWM计数器值并保存到RCAPDAT(向上锁存)和FCAPDAT(向下锁存)。
        PWM0->CAPCTL |= (0x00000001 << 2);                        
        

        //使能上升沿捕捉重载计数器
        PWM0->CAPCTL |= (0x00000001 << (16+2));
        
//4-中断使能
        //CAPIEN,使能上升沿锁存中断
        PWM0->CAPIEN |= (0x00000001 << 2);
        
        //INTEN0,使能周期点中断(计数器溢出中断)
//        (PWM0)->INTEN0 |= (PWM_INTEN0_PIEN0_Msk << 2);                                //暂不使能计数器溢出中断,用不到

        //使能NVIC中断
        NVIC_EnableIRQ(PWM0P1_IRQn);

//5-计数器使能
        //CNTEN,PWM计数器和时钟分频器开始工作
        PWM0->CNTEN |= (0x00000001 << 2);        
}

附中断代码。
/****************************************
*函数名称:PWM0P1_IRQHandler
*输    入:无
*输    出:无
*功    能:捕捉中断
******************************************/
void PWM0P1_IRQHandler(void)
{        
        PB15 = !PB15;
        if(((PWM0)->CAPIF & (0x00000001 << 0))!=0)                                                                //上升沿捕获中断
    {
        PWM0->CAPIF |= (0x00000001 << 0);
                Cap = PWM0->RCAPDAT0;
               
                PB0 = !PB0;
    }
        
        if(((PWM0)->CAPIF & (0x00000001 << 1))!=0)                                                                //上升沿捕获中断
    {
        PWM0->CAPIF |= (0x00000001 << 1);
                Cap = PWM0->RCAPDAT1;
               
                PB1 = !PB1;
    }
        
        if(((PWM0)->CAPIF & (0x00000001 << 2))!=0)                                                                //上升沿捕获中断
    {
        PWM0->CAPIF |= (0x00000001 << 2);
                Cap = PWM0->RCAPDAT2;
               
                PB2 = !PB2;
    }
        
        if(((PWM0)->CAPIF & (0x00000001 << 3))!=0)                                                                //上升沿捕获中断
    {
        PWM0->CAPIF |= (0x00000001 << 3);
                Cap = PWM0->RCAPDAT3;
               
                PB3 = !PB3;
    }
        
        if(((PWM0)->CAPIF & (0x00000001 << 4))!=0)                                                                //上升沿捕获中断
    {
        PWM0->CAPIF |= (0x00000001 << 4);
                Cap = PWM0->RCAPDAT4;
               
                PB4 = !PB4;
    }
        
        if(((PWM0)->CAPIF & (0x00000001 << 5))!=0)                                                                //上升沿捕获中断
    {
        PWM0->CAPIF |= (0x00000001 << 5);
                Cap = PWM0->RCAPDAT5;
               
                PB8 = !PB8;
    }
}


回帖(1)

河神大人

2024-1-18 15:29:47
可能是因为不是所有的通道都支持捕捉功能。在M453系列的数据手册中可以查看每个通道的功能和特性,确认哪些通道支持捕捉功能。建议检查一下手册,找到支持捕捉功能的通道进行测试。同时,还需要确认在初始化PWM通道时是否正确地打开了捕捉功能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分