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.
大家好,我刚刚拿到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下载源代码,并从网上下载对应文档。
谢谢您耐心的回答,我的供电是直接用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
}
这是初始化的程序。
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