This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:导致故障的 IF 语句

Guru**** 1831610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1386890/tm4c123gh6pm-if-statement-causing-a-fault

器件型号:TM4C123GH6PM

工具与软件:

您好!

当实现了 Timer0A 中断(但尚未启用)时、我的 if 语句会导致故障。 每当下面的 if 语句检查 ADCvoltage 是否>=939时、它会进入 FaultISR、但当我注释掉以下用于 Timer0A 中断的代码(Timer0Init 和 Timer0IntHandler)时、效果很好。  

void Timer0Init(void){
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

    TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);

    uint32_t ui32Period = (80000000/10);
    TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period - 1);

//    NVIC_PRI4_R = (NVIC_PRI4_R & 0x00FFFFFF) | (7 << 29);

    IntEnable(INT_TIMER0A);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

    IntMasterEnable();

    TimerEnable(TIMER0_BASE, TIMER_A);
}

void Timer0IntHandler(void) {
    // Clear the timer interrupt
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

    counter++;

    if (counter == 1 | counter == 2) {
        // Perform the action for 0.1 seconds
        SPIWritePacket(0x10, 0x03, PrevChannelStatus | BUZZER_FAST_ON);                      // Buzzer (fast) On
        PrevChannelStatus |= BUZZER_FAST_ON;
    } else if (counter == 3) {
        SPIWritePacket(0x10, 0x03, PrevChannelStatus & ~(BUZZER_FAST_ON));                      // Buzzer (fast) On
        PrevChannelStatus &= ~(BUZZER_FAST_ON);
    } else if (counter >= 20) {
        counter = 0; // Reset the counter every 2 seconds
    }
}

    SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // System clock: 16*12.5/2.5 = 80MHz (MAX)

    ui32PWMClock = SysCtlClockGet();                                        // PWM clock is SysClk
    ui32Load = (ui32PWMClock / PWM_FREQUENCY) - 1;                          // Calculate load value

    InitOE();
    InitSPI();
    InitADC();
    InitUART();
    InitPWM(ui32Load, 0);                    // Duty Cycle = 0 initially
    MagneticInterlockTest();
    OverrideTest();


    while(1){
        tempC = GetInternalTemp();
        tempF = (1.8 * ulTemp_ValueC) + 32;                            // Celsius to Fahrenheit

        ADCvoltage = GetVoltage();                                     // For solenoid lock
        ambientTemp = GetTemp();
        fanSpeed = GetFanSpeed();

        IntToFloatVolt(ADCvoltage);
        IntToFloatTemp(ambientTemp);

        MagneticInterlockStatus = GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_6);
        OverrideStatus = GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_5);

        if(ADCvoltage >= 939){                           // this causes fault                                        // 939/4095 * 3.3 = 0.7567V (About 55V in a 1500V scale)   // Voltage >= 55V
            if(MagneticInterlockStatus & GPIO_PIN_6){                                           // Enclosure closed
                if(OverrideStatus & GPIO_PIN_5){                                                // Override On (Enclosure was open & Override is enabled)
//                    Timer0Init();
////////////////////////////// omitted
}

这里的问题是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将在进一步测试代码后发布新的主题