我准备用UART接受的数据控制定时器PWM占空比,但是现在刚把两个分别的PWM程序和UART程序合并到一起就出现问题。
单独测试两个程序没问题,合并到一起就出现问题了。PWM点亮小灯能使用,但发给UART的信息没有回复(应该是发收的信息一样)。
我猜测是UART中断过程中被定时器打断了。我又在UART中断服务函数中先关闭全局中断,处理完再打开。但是还是行不通。求解?
#include <msp430.h>
void PWM_init(void){
P1DIR |= BIT2+BIT3;
P1SEL |= BIT2+BIT3;// Set P1.0 to output direction
P1OUT=0X00;
/*********MAIN CCRO FOR FREQUENCE**********************************/
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCR0 =0x0fff; //frequence change here
/********************Left wheel*********************************/
/*P1.2 CCCR1*/
TA0CCTL1=CCIE;
TA0CCR1=0x0888;
TA0CCTL1= OUTMOD_6;
/********************Right wheel*********************************/
/*P1.3 CCR2*/
TA0CCTL2=CCIE;
TA0CCR2=0x0488;
TA0CCTL2= OUTMOD_6;
/*******TIMER A***********************************************/
TA0CTL |=TAIE + TACLR;
TA0CTL |= TASSEL_2 + ID__1+ MC__UPDOWN;
}
void UART_init(void){
P4SEL |= BIT4+BIT5; // P3.3,4 = USCI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 0x6D; // 1MHz 9600 (see User's Guide)
UCA1BR1 = 0; // 1MHz 115200
UCA1MCTL |= UCBRS_2 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(GIE); // Enter LPM0, interrupts enabled
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
UART_init();
PWM_init();
__enable_interrupt();//start all interrupts
while(1);
}
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{ __disable_interrupt();
switch(__even_in_range(UCA1IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
__enable_interrupt();
}
}