Other Parts Discussed in Thread: MSP-EXP430FR2433
你好
我们使用的MSP-EXP430FR2433开发模块,目前关于CS及capture timerA进行了如下配置:
CS 配置:(配置MCLK为16Mhz时钟)
#define CS_MCLK_DESIRED_FREQUENCY_IN_KHZ 16000//16Mhz #define CS_MCLK_FLLREF_RATIO 489//16Mhz/32768hz //Set DCO FLL reference = REFO CS_initClockSignal( CS_FLLREF, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 ); //Set ACLK = REFO CS_initClockSignal( CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 ); //Create struct variable to store proper software trim values CS_initFLLParam param = {0}; //Set Ratio/Desired MCLK Frequency, initialize DCO, save trim values CS_initFLLCalculateTrim( CS_MCLK_DESIRED_FREQUENCY_IN_KHZ, CS_MCLK_FLLREF_RATIO, ¶m ); //Clear all OSC fault flag CS_clearAllOscFlagsWithTimeout(1000); //For demonstration purpose, change DCO clock freq to 16MHz CS_initFLLSettle( 16000, 487 ); //Clear all OSC fault flag CS_clearAllOscFlagsWithTimeout(1000); //Reload DCO trim values that were calculated earlier CS_initFLLLoadTrim( CS_MCLK_DESIRED_FREQUENCY_IN_KHZ, CS_MCLK_FLLREF_RATIO, ¶m ); //Clear all OSC fault flag CS_clearAllOscFlagsWithTimeout(1000); //Enable oscillator fault interrupt SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
capture配置(P1.1捕获引脚):
//capture P1SEL1 |= BIT1; // TA0.CCI1A input capture pin, second function P1REN |= BIT1; // enable internal pull-down resistor P1OUT |= BIT1; TA0CCTL1 |= CM_3 | CCIS_0 | CCIE | CAP | SCS; TA0CTL |= TASSEL_2 | MC_2 | TACLR | TAIE; /* 捕获触发中断 */ #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = TIMER0_A1_VECTOR __interrupt void TIMER0_A1_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(TIMER0_A1_VECTOR))) TIMER0_A1_ISR (void) #else #error Compiler not supported! #endif { switch(__even_in_range(TA0IV,TA0IV_TAIFG)) { case TA0IV_NONE: break; // No interrupt case TA0IV_TACCR1: if (GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)) { overflowCounter = 0; //Reset number of overflows startTime = 0; //Reset timer variable and CCR2, start timer in cont mode TA0CCR1 = 0; TA0CTL |= TACLR | MC_2; } else { endTime = TA0CCR1; //Stop timer TA0CTL |= MC_0; //elapsedTime(单位 ms) 4.096ms = ((1/16Mhz)*0xFFFF * 10^3) elapsedTime = (float)(4.096*(float)(overflowCounter)) + (float)((float)(endTime) / 16000); } edgeFlag ^= 1; break; // CCR1 not used case TA0IV_TACCR2: break; // CCR2 not used case TA0IV_TAIFG: overflowCounter++; break; // overflow default: break; } }
目前有两个问题想确认一下:
1.CS的配置接口调用是否正常,同时16Mhz情况下关于ratio参数的计算方法是否正常,16Mhz/32678hz ≈489
2.capture 中断内TA0IV_TAIFG的elapsedTime计算方法是否正确?以ms为单位计算
//elapsedTime(单位 ms) 4.096ms = ((1/16Mhz)*0xFFFF * 10^3)
elapsedTime = (float)(4.096*(float)(overflowCounter)) + (float)((float)(endTime) / 16000);