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;
}
}