Hello, recently when I was doing a project about FlexPWM capture on RT1051, I encountered a problem that the timer could not start properly, when I remove the crossover code or set it to 1 crossover frequency, Counter can run normally, but when I set it to 2 crossover frequency or higher crossover frequency Counter stops, what is the reason for this?
void Capture_config(void)
{
pwm_input_capture_param_t pwm_input_capture;
gpio_pin_config_t PWM_pin_config;
//初始化输入捕获管脚
IOMUXC_SetPinMux(PWM2_PWMA03_IOMUXC, 0U); //设置外部引脚的复用功能
IOMUXC_SetPinConfig(PWM2_PWMA03_IOMUXC, PWMC_INPUT_PAD_CONFIG_DATA); //设置引脚的 pad 属性
PWM_pin_config.direction = kGPIO_DigitalInput;
PWM_pin_config.interruptMode = kGPIO_NoIntmode;
GPIO_PinInit(PWM2_PWMA03_GPIO, PWM2_PWMA03_GPIO_PIN, &PWM_pin_config);
//初始化输入捕获配置参数
pwm_input_capture.captureInputSel = false;
pwm_input_capture.edge0 = kPWM_RisingEdge;
//pwm_input_capture.edge1 = kPWM_FallingEdge;
pwm_input_capture.enableOneShotCapture = false;
//pwm_input_capture.edgeCompareValue = 10; //当captureInputSel为FALSE时,此处设值无意义
pwm_input_capture.fifoWatermark = 0;
PWM_SetupInputCapture(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_PwmA, &pwm_input_capture);
//开启捕获中断
//set_IRQn_Priority(PWM2_3_IRQn,Group4_PreemptPriority_0, Group4_SubPriority_0);//设置中断优先级
//PWM_EnableInterrupts(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_CaptureA0InterruptEnable| kPWM_CaptureA1InterruptEnable );
PWM_EnableInterrupts(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_CaptureA0InterruptEnable );
EnableIRQ(PWM2_3_IRQn);
}
/**
* @brief 初始化 PWM 配置参数
* @retval 无
*/
void PWM_config(void)
{
pwm_config_t pwmConfig;//定义pwm 配置结构体
PWM_Deinit(PI_PWM_BASEADDR, kPWM_Module_3);
/*设置AHB总线时钟和IP总线时钟*/
CLOCK_SetDiv(kCLOCK_IpgDiv, 0x3); /* Set IPG PODF to 3, divede by 4 */
/*设置pwm 错误输入为高电平,表示没有错误,只有当pwm 没有错误输入或者禁止错误检测才能正常输出pwm波*/
XBARA_Init(XBARA1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault0);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault2);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault3);
PWM_GetDefaultConfig(&pwmConfig);
pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle; //新值在上一个pwm周期输出结束之后加载到缓冲寄存器中
pwmConfig.pairOperation = kPWM_Independent; // 工作在独立模式
pwmConfig.clockSource = kPWM_BusClock;
pwmConfig.enableDebugMode = true; // 使能DebugMode
pwmConfig.prescale = kPWM_Prescale_Divide_128; //1320000000/128/65535=16Hz=PWM最小频率
//初始化 PWM 并且判断初始化是否成功
if (PWM_Init(PI_PWM_BASEADDR, kPWM_Module_3, &pwmConfig) == kStatus_Fail)
{
PRINTF("PWM initialization failed\n");
}
Capture_config();
PWM_SetPwmLdok(PI_PWM_BASEADDR,kPWM_Control_Module_3 , true);
PWM_StartTimer(PI_PWM_BASEADDR, kPWM_Control_Module_3 );
}Hi @coderick ,
Thanks for your interest in NXP MIMXRT series!
Did you set BOARD_PWM_BASEADDR->SM[3].VAL1 & INIT in your project? If VAL1 is still 0, it will cause a problem.
Best regards,
Gavin