各個test值是用來看程序運行到那一步,發現中斷后沒有回到delaySec,因為setYellow = 1之后應該進入delaySec中的if條件并且把test4的值改成1,可是在這一步就卡死了,test4的值葉沒有變
#include <stdint.h>
#include "..\inc\msp432p401r.h"
#define RED 0x01;
#define GREEN 0x02;
#define YELLOW 0x03;
// global variable visible in Watch window of debugger
// increments at least once per button press
volatile uint32_t FallingEdges = 0;
uint8_t isRed = 0;
uint8_t isGreen =0;
uint8_t isYellow =0;
uint8_t setYellow =0;
uint8_t setGreen =0;
int test1 = 0, test2=0, test3=0, test4 = 0, test5 =0, test6 = 0;
void EdgeCounter_Init(void){
__ASM("CPSID I");
FallingEdges = 0; // initialize counter
P1SEL0 &= ~0x12;
P1SEL1 &= ~0x12; // configure P1.4 and P1.1 as GPIO
P1DIR &= ~0x12; // make P1.4 and P1.1 in (built-in Button 1 and Button 2)
P1REN |= 0x12; // enable pull resistors on P1.4 and P1.1
P1OUT |= 0x12; // P1.4 and P1.1 are pull-up
P1IES |= 0x12; // P1.4 and P1.1 are falling edge event
P1IFG &= ~0x12; // clear flag4 and flag1 (reduce possibility of extra interrupt)
P1IE |= 0x12; // arm interrupt on P1.4 and P1.1
NVIC_IPR8 = (NVIC_IPR8&0x00FFFFFF)|0x40000000; // priority 2
NVIC_ISER1 = 0x00000008; // enable interrupt 35 in NVIC
__ASM("CPSIE I");//EnableInterrupts(); // clear the I bit
}
void delay(void){
uint32_t i,j,k;
for(i=6000;i>0;i--){
for(j = 100; j>0; j--)
k = 5;
}
}
void delaySec(uint8_t i){
uint8_t j;
for(j = i; j> 0; j--){
test6 += 1;
if(setYellow == 1){
test4 = 1;
return;
test5 = 1;}
else
delay();
}
}
void redLight(void){
isRed = 1;
isGreen = 0;
isYellow = 0;
}
void greenLight(void){
isRed = 0;
isGreen = 1;
isYellow = 0;
}
void yellowLight(void){
isRed = 0;
isGreen = 0;
isYellow = 1;
}
void PORT1_IRQHandler(void){
if((P1IFG & 0x02)!= 0){
if(isGreen == 1){
P2OUT &= 0; //clear P2OUT
setYellow = 1;
}}
}
int main(void){
EdgeCounter_Init(); // initialize P1.4 and P1.1 interrupts
// initialize P1.0 and make it output (P1.0 built-in LED1)
P1SEL0 &= ~0x01;
P1SEL1 &= ~0x01; // configure built-in LED1 as GPIO
P1DIR |= 0x01; // make built-in LED1 out
P1OUT &= ~0x01; // LED1 = off
// initialize P2.2-P2.0 and make them outputs (P2.2-P2.0 built-in RGB LEDs)
P2SEL0 &= ~0x07;
P2SEL1 &= ~0x07; // configure built-in RGB LEDs as GPIO
P2DS |= 0x07; // make built-in RGB LEDs high drive strength
P2DIR |= 0x07; // make built-in RGB LEDs out
P2OUT &= ~0x07; // RGB = off
while(1){
start: P2OUT ^= GREEN;
greenLight();
delaySec(10);
test1 = 1;
if(setYellow == 1){
test2 = 1;
goto yellow;
test3 = 1;
}
P2OUT &= 0;
yellow: P2OUT ^= YELLOW;
setYellow = 0;
yellowLight();
delaySec(5);
P2OUT &= 0;
red: P2OUT ^= RED;
redLight();
delaySec(5);
P2OUT &= 0;
goto start;
//__ASM("WFI");
}
}
|