Как включить / отключить прерывания в mspgcc с помощью C?
Как я могу включить и отключить (очистить и установить GIE
SR
немного) в C, используя mspgcc
?
3 ответа
Решение
/*interrupt.c
ganeshredcobra@gmail.com
GPL
*/
#include <msp430g2553.h>
#define LED1 BIT0
#define LED2 BIT6
#define BUTTON BIT3
volatile unsigned int i;//to prevent optimization
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR |= (LED1+LED2);//
P1OUT &= ~(LED1+LED2);
P1IE |= BUTTON;
P1IFG &= ~BUTTON;
//__enable_interrupt();//enable all interrupts
_BIS_SR(LPM4_bits+GIE);
for(;;)
{}
}
//port1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= (LED1+LED2);
P1IFG &= ~BUTTON;
P1IES ^= BUTTON;
}
Это пример прерывания http://importgeek.wordpress.com/tag/msp430-launchpad/
Экспериментально я обнаружил, что это может быть включено с _BIS_SR(GIE);
и отключен с _BIC_SR(GIE);
не включая ничего, кроме стандарта msp430g2553.h
файл.
Вы можете использовать встроенные функции __eint() / __dint():
#include <intrinsics.h>
...
__eint();
/* Interrupts enabled */
__dint();
/* Interrupts disabled */
Или вы можете использовать встроенные функции __bis_status_register() / __bic_status_register():
#include <msp430.h>
#include <intrinsics.h>
...
__bis_status_register(GIE);
/* Interrupts enabled */
__bic_status_register(GIE);
/* Interrupts disabled */
Или одно из многих других определений совместимости в intrinsics.h. Обратите внимание, что есть также некоторые специальные версии, такие как __bis_status_register_on_exit() / __bic_status_register_on_exit(), которые изменят состояние флага при выходе из ISR.