Search code examples
carmstm32interruptcortex-m

Disable IRQ on STM32


Is there any way to disable all irq from Cortex M3 MCU except one ?

My issue is that I have a system running several kinds of irq with various priority levels and I want to disable all irq except one in a particular state.

I know I can disable all irq by using "__disable_irq()" instruction but I can't enable one irq after calling this instruction if I didn't call "__enable_irq()" before.

Thanks for your help,

Regards


Solution

  • Use the BASEPRI register to disable all interrupts below the specified priority level.

    This is a core register, described in the Cortex-M3 Programming Manual.

    enter image description here

    CMSIS provides the __get_BASEPRI() and __set_BASEPRI() functions to manipulate its value.

    Note that bits 7-4 are used, the priority value must be shifted left by 4. To disable all interrupts with priority 1 or lower, use

    __set_BASEPRI(1 << 4);
    

    and to enable all, set it to 0

    __set_BASEPRI(0);
    

    You should of course set interrupt priorities accordingly, ensuring that no other interrupt has priority 0.