工具/软件:Code Composer Studio
尊敬的团队:
我的客户希望使用计时器捕获模式测量外部信号的频率。
硬件: MSP-FET430U80与 FG439
XT1 = 32.768kHz XT2 = 4MHz
代码:
#include #include "main.h" unsigned long SMCLK_Count_Num = 0; unsigned long 频率= 0; unsigned char 计数= 0x0; unsigned int REdge1、REdge2; void main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 SetupClock(); caption_Pos (); //_enable_interrupt (); while (1) { // _enable_interrupt (); _bis_SR_register (LPM0_bits + GIE);//输入 LPM0 __no_operation(); //用于调试器 IF (TB0CCTL1和 COV) //检查捕捉溢出 while (1); SMCLK_Count_Num = REdge2 - REdge1; 频率=(Count*SMCLK_Frequency)/SMCLK_Count_Num; // TBCTL |= TBCLR + TBIE; // TBCCTL1 |= CCIE; } } void SetupClock() { uint16_t tmpv; FLL_CTL1 &=~XT2OFF; 操作 { IFG1 &=~OFIFG; for (tmpv = 0xff;tmpv > 0;tmpv--); } while ((IFG1 & OFIFG)!=0); IFG1 &=~OFIFG; FLL_CTL1 |= SELM_XT2+SELS; } void Capture_Pos () { P2SEL |= BIT2; P2DIR &=~BIT2; TB0CTL |= TBSSEL_2 + MC_2 + TBCLR; TBCCTL1 = CM_1+ CCIS_1 + SCS + CAP + CCIE; } #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector = TIMERB1_vector __interrupt void TIMER0_B1_ISR (void) #Elif defineerISR (__TI_B1_COMPLESER)(void)(void )#TI_B1_INTRISR_B1 (void)(void TI_TRIB1)(void TI_TRIB1)(void TI_TRIB1)#TI_ERROR)(void TI_B1) #endif //_interrupt void Timer_B1 (void) { switch (__event_in_range (TB0IV、0x0A)) { 案例 TB0IV_NONE: 中断; 案例 TB0IV_TBCCR1: 如果(!Count) { REdge1 = TB0CCR1; count++; } 其他 { REdge2 = TB0CCR1; 计数= 0x0; // TBCTL &=~TBIE; // TBCCTL1 &=~CCIE; __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0 } 中断; 案例 TB0IV_TBCCR2: 中断; 案例 TBIV_3: 中断; 案例 TBIV_4: 中断; 案例 TBIV_5: 中断; 案例 TBIV_6: 中断; 案例 TB0IV_TBIFG: 中断; 默认值: 中断; } }
它挂起
IF (TB0CCTL1和 COV) //检查捕捉溢出
while (1);
它们需要测量80KHz 外部信号。