0

背景: 私が取り組んでいるこの LPC11C24 マイクロコントローラーは、単一の 32 ビット タイマーを使用して 1 つのピンで PWM 入力を読み取り、他の 2 つのピンで PWM 出力を制御します。入力と出力が同じタイマー上にあるため、タイマー レジスタ (TC) のリセットは行いません。特に出力については、信号がHIGHになるか信号がLOWになるかのいずれかの時間で一致レジスタが継続的にインクリメントするように設定しようとしています。

例: 周期が 10000 ティックで、デューティ サイクルが 50% の場合、割り込みが発生するたびに MR0 に 5000 を加算して、次の割り込みに備えます。

初期化:

IOCON_R_PIO1_1_bit.FUNC = 0;
IOCON_R_PIO1_1_bit.MODE = 0;  
GPIO1DIR_bit.P1_1 = 1;

LPC_TMR32B1->MCR |= (1<<0); /* Interrupt when MR0 matches TC */
LPC_TMR32B1->MR0 = 0; /* zero the match value */

ISR:

/* If interrupt was from MR0 */
if(LPC_TMR32B1->IR & (1<<0))
{
    /* Clear the interrrupt */
    LPC_TMR32B1->IR = (1<<0);

    if(GPIO1DATA_bit.P1_1 == 1)
    {
       LPC_TMR32B1->MR0 = LPC_TMR32B1->TC;
       LPC_TMR32B1->MR0 += OutputChan0MatchPeriodFalling;
       GPIO1DATA_bit.P1_1 = 0;
    }
    else if(GPIO1DATA_bit.P1_1 == 0)
    {
       LPC_TMR32B1->MR0 = LPC_TMR32B1->TC;
       LPC_TMR32B1->MR0 += OutputChan0MatchPeriodRising;
       GPIO1DATA_bit.P1_1 = 1;
    } 
}

このピンを調べても何も出力されないので、何が間違っているのかわかりません。私が抱えているもう 1 つの問題は、外部コード (基本的に MR0 = TC を設定するだけ) から新しいデューティ サイクルを提供する場合を除いて、割り込みが発生しないことです。TC が MR0 よりも進んでいるためだと思いますが、それを防ぐ方法がわかりません。どうもありがとう!追加情報を提供できるかどうかお知らせください。

4

1 に答える 1

0

私はそれを考え出した。ここで 2 つの問題が発生しました。

I/O 構成が正しくありませんでした。ドキュメントを読んだ後、関数を GPIO 用に 1 に設定する必要があることがわかりました。0 は予約機能です。

 IOCON_R_PIO1_1_bit.FUNC = 1;

ここでの 2 つ目の問題は、ISR を処理するためにタイマーを一時停止する必要があったことです。

/* If interrupt was from MR0 */
if(LPC_TMR32B1->IR & (1<<0))
{
    /* Pause timer */
    LPC_TMR32B1->TCR = 0; 

    /* Clear interrupt */
    LPC_TMR32B1->IR = (1<<0);

    if(GPIO1DATA_bit.P1_1 == 1)
    {
       LPC_TMR32B1->MR0 = LPC_TMR32B1->TC + OutputChan0MatchPeriodFalling;
       GPIO1DATA_bit.P1_1 = 0;
    }
    else if(GPIO1DATA_bit.P1_1 == 0)
    {
       LPC_TMR32B1->MR0 = LPC_TMR32B1->TC + OutputChan0MatchPeriodRising;
       GPIO1DATA_bit.P1_1 = 1;
    } 

    /* Restart timer */
    LPC_TMR32B1->TCR = 1; 
}
于 2016-08-17T17:08:00.770 に答える