SCTIMER Interupt 在 FRDM-MCXN947 板上的用法 亲爱的恩智浦社区 目前,我正在使用板载 SCTIMER 外设开发一个程序。我正试图通过 SCTIMER 在状态实现的第三个状态下启动 CTIMER0 外设,以产生 PWM 信号。该 PWM 信号被路由至 GPIO 引脚。为了实现这一点,我需要在第三个状态下实现中断,以便在该状态下专门启动 CTIMER0。不过,由于经验不足,我在编写此类中断程序时遇到了一些麻烦。你能帮帮我吗? 我目前正在编写的代码如下: void SCT0_IRQHandler(void) { SCTIMER_EventHandleIRQ(SCT0_PERIPHERAL); // 只有当 SCTIMER 达到状态 2 时才启动 CTIMER CTIMER_StartTimer(CTIMER0_PERIPHERAL); PRINTF("CTIMER started from SCTIMER state 2 event.\r\n"); } 静态 void SCT0_init(void) { CTIMER0_init(); SCTIMER_Init(SCT0_PERIPHERAL,&SCT0_initConfig); /* 启用 NVIC 中的中断 SCT0_IRQN 请求 */ /* 状态 0 初始化 */ SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[0]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[0]); SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[2]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[2]); SCTIMER_CreateAndScheduleEvent(SCT0_PERIPHERAL、 kSCTIMER_OutputRiseEvent, 0, kSCTIMER_Out_0, kSCTIMER_Counter_U,&SCT0_event[0]); SCTIMER_SetupNextStateAction(SCT0_PERIPHERAL, 1, SCT0_event[0]); SCTIMER_IncreaseState(SCT0_PERIPHERAL); /* 状态 1 初始化 */ /* 为 PWM 安排周期事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0]); /* 安排 PWM 的脉冲事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0] + 1); SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[1]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[1]); SCTIMER_CreateAndScheduleEvent(SCT0_PERIPHERAL、 kSCTIMER_OutputRiseEvent, 0, kSCTIMER_Out_0, kSCTIMER_Counter_U,&SCT0_event[1]); SCTIMER_SetupNextStateAction(SCT0_PERIPHERAL, 2, SCT0_event[1]); SCTIMER_IncreaseState(SCT0_PERIPHERAL); /* 状态 2 初始化 */ /* 为 PWM 安排周期事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0]); /* 安排 PWM 的脉冲事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0] + 1); SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[3]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[3]); SCTIMER_CreateAndScheduleEvent(SCT0_PERIPHERAL、 kSCTIMER_OutputRiseEvent, 0, kSCTIMER_Out_0, kSCTIMER_Counter_U,&SCT0_event_startCTimer); SCTIMER_SetCallback(SCT0_PERIPHERAL, SCT0_IRQHandler, SCT0_event_startCTimer); 启用 IRQ(SCT0_IRQn); } 下图显示了开始时的波形。目标是在黄色 PWM 信号的第四个上升沿开始蓝色 PWM 信号。 时钟|计时器 开发板 MCX N Re: SCTIMER Interupt Usage on FRDM-MCXN947 board 您好@Kevin_Pang, 您遇到的问题似乎在下一个主题中讨论过。我建议按照 ZhangJennie 提供的建议进行操作,看看是否有助于解决问题。
BR Habib Re: SCTIMER Interupt Usage on FRDM-MCXN947 board 亲爱的 Habib, 我试着运行了一个基本的 sdk 示例,但还是遇到了同样的错误。 谨致问候、 凯文 Re: SCTIMER Interupt Usage on FRDM-MCXN947 board 你好 @Kevin_Pang,你 能否尝试运行一个 SDK 示例,比如 " hello_world、" 来确定异常是由你的代码引起的还是你的板特有的? BR Habib Re: SCTIMER Interupt Usage on FRDM-MCXN947 board 亲爱的哈比卜 感谢您的联系。 我现在在开发板上遇到了问题。因此,在尝试调试我的项目时,它引发了一个异常:"Unable to open probe index 1" ,错误信息为:"Probe not open" 。之后,它就无法与核心连接了。在我的设置没有任何改变的情况下,这种情况突然发生了。您能帮我解决这个问题吗? 谨致问候, Kevin Pang Re: SCTIMER Interupt Usage on FRDM-MCXN947 board 您好@Kevin_Pang, ,很高兴您的问题得到了解决。如果有什么需要我帮忙的,请告诉我。 BR Habib Re: SCTIMER Interupt Usage on FRDM-MCXN947 board 问题解决了: 我已经找到了正确编程中断的解决方案。代码实现如下(CTIMER init 未显示): void SCT0_IRQHandler(void) { SCTIMER_EventHandleIRQ(SCT0_PERIPHERAL); } 无效 启动_CTIMER(void) { // 只有当 SCTIMER 达到状态 2 时才启动 CTIMER CTIMER_StartTimer(CTIMER0_PERIPHERAL); PRINTF("CTIMER started from SCTIMER state 2 event.\r\n"); } 常数 sctimer_config_tSCT0_initConfig = { .enableCounterUnify = true、 .clockMode = kSCTIMER_System_ClockMode, .clockSelect = kSCTIMER_Clock_On_Rise_Input_0, .enableBidirection_l = false、 .enableBidirection_h = false、 .prescale_l = 0U、 .prescale_h = 0U、 .outInitState = 0U、 .inputsync = 0U }; 常数 sctimer_pwm_signal_param_tSCT0_pwmSignalsConfig[4] = { { .输出 = kSCTIMER_Out_0, .level = kSCTIMER_HighTrue, .dutyCyclePercent = 50U }, { .输出 = kSCTIMER_Out_1, .level = kSCTIMER_HighTrue, .dutyCyclePercent = 100U }, { .输出 = kSCTIMER_Out_1, .level = kSCTIMER_HighTrue, .dutyCyclePercent = 0U }, { .输出 = kSCTIMER_Out_1, .level = kSCTIMER_HighTrue, .dutyCyclePercent = 0U } }; uint32_tSCT0_pwmEvent[4]; uint32_tSCT0_event[4]; uint32_tSCT0_event_startCTimer; 静态 void SCT0_init(void) { SCTIMER_Init(SCT0_PERIPHERAL,&SCT0_initConfig); /* 启用 NVIC 中的中断 SCT0_IRQN 请求 */ /* 状态 0 初始化 */ SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[0]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[0]); SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[2]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[2]); SCTIMER_CreateAndScheduleEvent(sct0_peripheral、 kSCTIMER_OutputRiseEvent, 0, kSCTIMER_Out_0, kSCTIMER_Counter_U,&SCT0_event[0]); SCTIMER_SetupNextStateAction(SCT0_PERIPHERAL, 1, SCT0_event[0]); SCTIMER_IncreaseState(SCT0_PERIPHERAL); /* 状态 1 初始化 */ /* 为 PWM 安排周期事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0]); /* 安排 PWM 的脉冲事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0] + 1); SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[1]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[1]); SCTIMER_CreateAndScheduleEvent(sct0_peripheral、 kSCTIMER_OutputRiseEvent, 0, kSCTIMER_Out_0, kSCTIMER_Counter_U,&SCT0_event[1]); SCTIMER_SetupNextStateAction(SCT0_PERIPHERAL, 2, SCT0_event[1]); SCTIMER_IncreaseState(SCT0_PERIPHERAL); /* 状态 2 初始化 */ /* 为 PWM 安排周期事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0]); /* 安排 PWM 的脉冲事件 */ SCTIMER_ScheduleEvent(SCT0, SCT0_pwmEvent[0] + 1); SCTIMER_SetupPwm(SCT0_PERIPHERAL,&SCT0_pwmSignalsConfig[3]、 kSCTIMER_EdgeAlignedPwm, 100U, SCT0_CLOCK_FREQ,&SCT0_pwmEvent[3]); SCTIMER_CreateAndScheduleEvent(sct0_peripheral、 kSCTIMER_OutputRiseEvent, 0, kSCTIMER_Out_0, kSCTIMER_Counter_U,&SCT0_event_startCTimer); SCTIMER_SetCallback(SCT0_PERIPHERAL, Start_CTIMER, SCT0_event_startCTimer); SCTIMER_EnableInterrupts(SCT0, (1U<< SCT0_event_startCTimer)); 启用 IRQ(SCT0_IRQn); }
查看全文