NXPコミュニティの皆様
現在、搭載 SCTIMER ペリフェラルを使用したプログラムを開発しています。SCTIMER を使用して状態実装の 3 番目の状態で CTIMER0 ペリフェラルを起動し、PWM 信号を生成するように試みています。この PWM 信号は GPIO ピンにルーティングされます。これを実現するには、3 番目の状態に割り込みを実装して、その状態で CTIMER0 を具体的に開始する必要があります。しかし、私はあまり経験がないので、このような割り込みのプログラミングには苦労します。助けてくれませんか?
現在作業中のコードは以下の通りです。
void SCT0_IRQHandler ( void )
{
SCTIMER_EventHandleIRQ(SCT0_PERIPHERAL);
// SCTIMERが状態2に達したときのみCTIMERを開始する
CTIMER_StartTimer(CTIMER0_PERIPHERAL);
PRINTF( "CTIMER は SCTIMER 状態 2 イベント情報から開始されました。\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_イベント[0]);
SCTIMER_IncreaseState(SCT0_PERIPHERAL);
/* 状態1の初期化 */
/* PWMの周期イベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[0]);
/* PWMのパルスイベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[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_イベント[1]);
SCTIMER_IncreaseState(SCT0_PERIPHERAL);
/* 状態2の初期化 */
/* PWMの周期イベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[0]);
/* PWMのパルスイベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[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 信号の 4 番目の立ち上がりエッジで青色の PWM 信号を開始することです。
こんにちは@Kevin_Pang 、
あなたが経験している問題は次のThreadで議論されているようです。ZhangJennie が提供した提案に従って、問題の解決に役立つかどうかを確認することをお勧めします。
BR
ハビブ
親愛なるハビブ様
基本的な SDK の例を実行しようとしましたが、同じエラーが発生します。
敬具、
ケビン
こんにちは@Kevin_Pang 、
「hello_world」などの SDKs サンプルの 1 つを実行して、例外がコードによって発生したのか、ボード固有のものなのかを判断していただけますか?
BR
ハビブ
親愛なるハビブ様
お問い合わせいただきありがとうございます。
現在、開発ボードに問題が発生しています。その結果、プロジェクトをデバッグしようとすると、「プローブが開いていません」というエラーとともに「プローブ インデックス 1 を開けません」という例外が発生します。その後、コアとの接続に失敗します。これは、私の設定に何の変更もないのに突然起こりました。この問題の解決を手伝ってもらえますか?
敬具、
ケビン・パン
こんにちは@Kevin_Pang 、
問題が解決してよかったです。何かお手伝いできることがございましたら、お知らせください。
BR
ハビブ
問題解決:
割り込みを正しくプログラムするための解決策はすでに見つけました。コードの実装を以下に示します (CTIMER init は示されていません)。
void SCT0_IRQHandler ( void )
{
SCTIMER_EventHandleIRQ(SCT0_PERIPHERAL);
}
void Start_CTIMER ( void )
{
// SCTIMERが状態2に達したときのみCTIMERを開始する
CTIMER_StartTimer(CTIMER0_PERIPHERAL);
PRINTF( "CTIMER は SCTIMER 状態 2 イベント情報から開始されました。\r\n" );
}
const sctimer_config_t SCT0_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
};
const sctimer_pwm_signal_param_t SCT0_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_t SCT0_pwmイベント[4];
uint32_t SCT0_イベント[4];
uint32_t SCT0_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_イベント[0]);
SCTIMER_IncreaseState(SCT0_PERIPHERAL);
/* 状態1の初期化 */
/* PWMの周期イベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[0]);
/* PWMのパルスイベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[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_イベント[1]);
SCTIMER_IncreaseState(SCT0_PERIPHERAL);
/* 状態2の初期化 */
/* PWMの周期イベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[0]);
/* PWMのパルスイベント情報をスケジュールする */
SCTIMER_スケジュールイベント(SCT0、SCT0_pwmイベント[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 );
}