Part Number: MSP430FR2355
Tool/software: Code Composer Studio
Hi, I'm using msp430fr2355 and I'm trying to implement blocking delays in msec and usec with TB0. I need those to use lately in my code.
When I delay in msec, the timer TB0 is sourced from SMCLK.
When I delay in usec, the timer TB0 is sourced from ACLK.
I want to implement two PWM using TB2 and TB3, both sourced from SMCLK.
I can have both pwms working with delay in ms, but when I change and use delay in usec, the pwm's frequencies change and also the delay. Why is that happening? What am I missing?
Here's my code:
uint16_t ms_counter;
uint16_t us_counter;
void delay_ms(uint16_t delay_ms)
{
ms_counter = 0;
TB0CCTL0 |= CCIE; // TBCCR0 interrupt enabled
TB0CCR0 = 33;
TB0CTL |= TBSSEL__ACLK | MC__UP; // ACLK, continuous mode
while(ms_counter != delay_ms);
ms_counter = 0;
}
void delay_us(uint16_t delay_us)
{
us_counter = 0;
TB0CCTL0 |= CCIE; // TBCCR0 interrupt enabled
TB0CCR0 = 24;
TB0CTL |= TBSSEL__SMCLK | MC__UP; // ACLK, continuous mode
while(us_counter != delay_us);
us_counter = 0;
}
void init_clock(void)
{
/// Configure two FRAM waitstate as required by the device datasheet for MCLK
// operation at 24MHz(beyond 8MHz) _before_ configuring the clock system.
FRCTL0 = FRCTLPW | NWAITS_2 ;
P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7: crystal pins
do
{
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
SFRIFG1 &= ~OFIFG;
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
__bis_SR_register(SCG0); // disable FLL
CSCTL3 |= SELREF__XT1CLK; // Set XT1 as FLL reference source
CSCTL0 = 0; // clear DCO and MOD registers
CSCTL1 |= DCORSEL_7; // Set DCO = 24MHz
CSCTL2 = FLLD_0 + 731; // DCOCLKDIV = 24MHz
__delay_cycles(3);
__bic_SR_register(SCG0); // enable FLL
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked
CSCTL4 = SELMS__DCOCLKDIV | SELA__XT1CLK; // set XT1 (~32768Hz) as ACLK source, ACLK = 32768Hz
// default DCOCLKDIV as MCLK and SMCLK source
}
void init_PWM_pins(void)
{
// Configure GPIO
//right PWM P5.0, left PWM P6.0
// P1DIR |= BIT0 | BIT1 ; // set ACLK SMCLK pin as output
// P1SEL1 |= BIT0 | BIT1; // set ACLK and SMCLK pin as second function
P5DIR |= BIT0;
P5SEL0 |= BIT0;
P6DIR |= BIT0;
P6SEL0 |= BIT0;
//Remember timer from SMCLK and SMCLK is set to 24MHz
//Setup Timer3_B7 for P6.0
TB3CCR0 = 1000-1; // PWM Period
TB3CCTL1 = OUTMOD_7; // CCR1 reset/set
TB3CCR1 = 500; // CCR1 PWM duty cycle
//Setup Timer2_B3 for P5.0
TB2CCR0 = 1000-1; // PWM Period
TB2CCTL1 = OUTMOD_7; // CCR1 reset/set
TB2CCR1 = 500; // CCR1 PWM duty cycle
//
TB2CTL = TBSSEL_2 | MC_1 | TBCLR; // SMCLK, up mode, clear TBR
TB3CTL = TBSSEL_2 | MC_1 | TBCLR; // SMCLK, up mode, clear TBR
}
int main(void)
{
msg_received=0;
//ms_counter_value = 0;
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
P3DIR |= BIT6;
P3OUT &= ~BIT6;
init_clock();
init_PWM_pins();
PM5CTL0 &= ~LOCKLPM5;
__enable_interrupt();
while(1)
{
P3OUT ^= BIT6;
delay_ms(1000);
//__bis_SR_register(LPM3_bits | GIE); // Enter LPM3
}
//__no_operation(); // For debug
}
// Timer B0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = TIMER0_B0_VECTOR
__interrupt void Timer_B (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER0_B0_VECTOR))) Timer_B (void)
#else
#error Compiler not supported!
#endif
{
ms_counter++;
us_counter++;
}
Thanks in advance!
Diana