1

ARMstm32f107チップを持っています。プロジェクトをIARからGCCに移植しています

IARは、割り込みを有効または無効にするために次の機能を提供します。

#define __disable_interrupt() ...
#define __enable_interrupt() ...

GCCを使用してチップの割り込みを有効/無効にするにはどうすればよいですか?

4

3 に答える 3

4

STM32用に開発する場合、RM0008はあなたの親友です。199ページのセクション10.2.4から:

割り込みを生成するには、割り込みラインを設定して有効にする必要があります。これは、2つのトリガーレジスタを目的のエッジ検出でプログラミングし、割り込みマスクレジスタの対応するビットに「1」を書き込んで割り込み要求を有効にすることで実行されます。

したがって、適切なレジスタに適切なマスクビットを設定する必要があります。外部割り込みの場合、それはEXTI_IMRおよびEXTI_EMRレジスタです。他にもたくさんあります。

EXTIレジスタ

于 2012-12-05T18:43:39.967 に答える
2

ARMについては答えられませんが、Coldfireの同じ機能は、CPUの割り込み優先度レベルマスキングレジスタの設定/クリアに要約されます。最大数に設定すると、マスク不可を除くすべてが無効化/無視され、0に設定すると、すべて(YMMV)が有効になります。

スタックされた割り込みが互いに壊れないように、「無効化」時に値を読み戻し、「有効化」時に復元するのが便利であることに注意してください。

ipl = DisableInts(); // Remember what the IPL was
<"Risky" code happens here>
EnableInts(ipl); // Restore value

これは、誤った割り込みを引き起こす可能性のある割り込みマスクをいじったり、中断してはいけないことをしたりするときに便利です。

関数は次のようになります。

uint8 DisableInts(void)
{
    return(asm_set_ipl(7));
}

uint8 EnableInts(uint8 ipl)
{
    return(asm_set_ipl(ipl));
}

どちらもこのasmにマップされます:

asm_set_ipl:
_asm_set_ipl:
/* Modified for CW7.2! */
    link    A6,#-8
    movem.l D6-D7,(SP)

    move.l  D0,D6           /* save argument                 */

    move.w  SR,D7           /* current sr                    */

    move.l  D7,D0           /* prepare return value          */
    andi.l  #0x0700,D0      /* mask out IPL                  */
    lsr.l   #8,D0           /* IPL                           */

    andi.l  #0x07,D6        /* least significant three bits  */
    lsl.l   #8,D6           /* move over to make mask        */

    andi.l  #0x0000F8FF,D7  /* zero out current IPL          */
    or.l    D6,D7           /* place new IPL in sr           */
    move.w  D7,SR

    movem.l (SP),D6-D7
    //lea     8(SP),SP
    unlk    A6
    rts
于 2012-12-05T10:02:22.873 に答える
0

ARMドキュメントには、_enable_irq();「すべてのマスクをクリア」を意味する「CPSIEI」にコンパイルされると記載されています。一方、_disable_irq();SetMaskにコンパイルされます。

于 2016-11-02T16:57:23.287 に答える