在学习msp430fr2311 MCU时遇到如下现象
把TimerB的初始化注释掉,其他功能变正常。有TimerB的初始化,则全不正常,不过能看出端口的初始化确实正常。
#include <msp430fr2311.h>
#define MCLK ((double)16700000.0)
#define ACLK 32768
#define delay_ms(x) __delay_cycles((long)(MCLK*(double)x/1000.0))
void TimerB0_EQandHVA_init(void);
void CLK_init(void);
int HVA_Status = 0;
#define EQ_freq 500
#define HVA1
#define HVA1_H P1IN & BIT0
#define HVA1_L ~(P1IN | ~BIT0)
#define HVA24_H P1IN & BIT1
#define HVA24_L ~(P1IN | ~BIT1)
#define EQ1switch BIT0
#define EQ1switch_H BIT0 & P2OUT
#define EQ1switch_L ~(BIT0 | ~P202
#define EQ2switch BIT1
#define EQ2switch_H BIT1 & P2OUT
#define EQ2switch_L ~(BIT1 | ~P2OUT)
#define EQ3switch BIT2
#define EQ3switch_H BIT2 & P2OUT
#define EQ3switch_L ~(BIT2 | ~P2OUT)
unsigned char Timer_EQ3 = 0; //由TimerB生成的EQ3开关控制信号
unsigned char HVA1_past;
unsigned char HVA24_past;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
CLK_init();
// Configure GPIO
P1DIR &= ~(BIT0 | BIT1);
P2DIR |= BIT0 | BIT1 | BIT2;
P1OUT |= BIT0 | BIT1;
P1REN |= BIT0 | BIT1;
PM5CTL0 &= ~LOCKLPM5;
_enable_interrupt();
TimerB0_EQandHVA_init();
if(HVA1_H)
HVA1_past=1;
if(HVA1_L)
HVA1_past=0;
if(HVA24_H)
HVA24_past=1;
if(HVA24_L)
HVA24_past=0;
while(1)
{
//HVA24电平翻转检测
if(HVA24_past==0)
{
delay_ms(1);
if(HVA24_H)
{
HVA_Status++;
HVA24_past = 1;
}
}
else if(HVA24_past==1)
{
delay_ms(1);
if(HVA24_L)
{
HVA_Status++;
HVA24_past = 0;
}
}
//HVA1电平翻转检测
if(HVA1_past==0)
{
delay_ms(1);
if(HVA1_H)
{
HVA_Status = 0;
HVA1_past = 1;
}
}
else if(HVA1_past==1)
{
delay_ms(1);
if(HVA1_L)
{
HVA_Status = 0;
HVA1_past = 0;
}
}
if(HVA1_H)
HVA1_past=1;
if(HVA1_L)
HVA1_past=0;
if(HVA24_H)
HVA24_past=1;
if(HVA24_L)
HVA24_past=0;
if(HVA_Status==4)
HVA_Status = 0;
// EQ1 EQ2 EQ3 Switch ctrl
switch(__even_in_range(HVA_Status,4))
{
case 0b00:
P2OUT |= (EQ1switch | EQ2switch | EQ3switch);
break;
case 0b01:
P2OUT &= ~EQ1switch;
P2OUT |= EQ2switch;
if(Timer_EQ3)
P2OUT |= EQ3switch;
else
P2OUT &= ~EQ3switch;
break;
case 0b10:
P2OUT |= EQ1switch;
P2OUT &= ~EQ2switch;
if(Timer_EQ3)
P2OUT |= EQ3switch;
else
P2OUT &= ~EQ3switch;
break;
case 0b11:
P2OUT &= ~(EQ1switch | EQ2switch | EQ3switch);
break;
default: break;
}
delay_ms(100);
}
}
void CLK_init(void)
{
FRCTL0 = FRCTLPW | NWAITS_1;
__bis_SR_register(SCG0); // disable FLL
CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
CSCTL0 = 511; // Set DCO and MOD registers
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
CSCTL1 |= DCORSEL_5; // Set DCO = 16MHz
CSCTL1 |= DISMOD_1 | DCOFTRIM;
CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
__delay_cycles(10);
__bic_SR_register(SCG0); // enable FLL
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked
CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz
}
void TimerB0_EQandHVA_init(void)
{
TB0CCR0= EQ_freq-1;
TB0CTL = TBSSEL__ACLK | MC__CONTINUOUS | TBIE | TBCLR;
}
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timerB0_ISR(void)
{
if(TBIV & TBIV__TBIFG)
Timer_EQ3 = ~Timer_EQ3;
}
结果是没有正常的输出。I2C正常拉高但没有信号发送,看了一下变量HVA_status也一直是0。