This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于pmm理解的问题

大家好,我刚刚拿到exp430f5529的开发板,正在学习中。但是遇到了一个问题,我把开发板上的xt2  的4M 晶振,直接换成了 24兆晶振。并且SMCLK  二分频12兆 与  MCLK 为24兆 。且全部用i/o输出来 。

当利用 msp430ware里面的工程文件中的 的函数:

void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}

去提高核心电压时,

SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);

我用示波器去读取,i/o口输出的时钟,频率是对的。但是峰峰值只有1.5v。 

无论怎么改变,SetVcoreUp (0x01); 这个函数,他的峰峰值都不变。

是不是我理解错了,SetVcoreUp (0x01);设置这个的值,与输出频率的峰峰值没有关系? 还有能不能告诉我核心电压到底是什么电压??

  • fangwei,

    为了达到性能和功耗的最佳匹配,MSP430F5xxx系列的PMM非常灵活,有4个level的核电压,分别可以支持逐步升高的CPU主频,需要的供电电压也逐步提高。示意图如下图,如果想要使得CPU达到最高的25MHz,则需要先将Vcore升至level3,当然此时的供电电压Vcc必须在2.4V~3.6V之间。即主频增高,则需要供电Vcc足够高,Vcore level够,当然,此时功耗也在提高。

    具体数据请查看对应datasheet。同时,TI也提供了‘MSP430F5xx and MSP430F6xx Core Libraries’来帮助用户简化控制,请从http://www.ti.com/lit/zip/slaa448下载源代码,并从网上下载对应文档。

  • fangwei wang,

    核心电压就是供给CPU的电压,MSP430F5xx内部有个LDO,你可以看看user guide。SetVcoreUp就是将供给CPU核的电压提高,意味着可以跑给高的主频,同时也需要更高的外部供电电压,也输出频率的峰峰值无关,你的供电电压是多少?你再试试如果只是设置I/O为输出,输出的高电平又是多少?

  • 谢谢您耐心的回答,我的供电是直接用exp430f5529开发板上的仿真器直接供电,I/O的输出电压是:3.635,  vcc也是3.635。那SetVcoreUp与输出电压有关吗?

    还有个问题,

    UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt

    UCA1IE |= UCTXIE; // Enable USCI_A0 X interrupt

    这个两个同时打开时,uart 就不能工作。 关闭了  uctxie 中断,就可以工作。是不是这两个中断不能同时开。

    void Uart_int(void)
    {

    UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
    P4SEL = BIT4+BIT5; // P4.4,5 = UART1 TXD/RXD
    UCA1CTL1 = UCSSEL__SMCLK; // ACLK
    UCA1BR0 = 78; // 12MHz 9600 12MHZ/9600=3.41
    UCA1BR1 = 0;
    UCA1MCTL = UCBRS_2+UCBRF_14 + UCOS16; // Modulation UCBRSx = 3
    UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
    UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
    //UCA1IE |= UCTXIE; // Enable USCI_A0 RX interrupt
    __bis_SR_register(GIE); // Enter LPM0, interrupts enabled

    }

    这是初始化的程序。

  • 我也改变了SetVcoreUp的值,输出电压没有改变,还有3.635V,说明SetVcoreUp 与输出电压无关。只是uart中断还是不懂。

  • Hi, Fangwei,

    你好!

    1.CoreVoltage与I/O voltage没有关系,建议看一下PMM部分的users manual,里面有详细的解释,MSP430 MCU为了降低功耗,内核电压比较低。

    2.USCIA只有一个中断向量,故就一个中断函数,开启接受与发射中断后,无论哪个中断标志响应都会进入USCIA的ISR,进去之后要判断哪个中断标志发生了,再做相应的操作,简单的可以参考F5529 USCIA的例程,给一个ISR的例子,希望能够帮到你。


    // Echo back RXed character, confirm TX buffer is ready first
    #pragma vector=USCI_A0_VECTOR
    __interrupt void USCI_A0_ISR(void)
    {
    switch(__even_in_range(UCA0IV,4))
    {
    case 0:break; // Vector 0 - no interrupt
    case 2: // Vector 2 - RXIFG
               while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
               UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
               break;
    case 4:break; // Vector 4 - TXIFG
    default: break;
    }
    }

    Regards,

    Hardy

  • fangwei wang,

    CoreVoltage与I/O voltage确定是没有关系,我让你测试I/O可输出电压,只是为了确认I/O本身的功能是好的。另外,在datasheet中,对这点有说明,如下: