MSP430F5529学习记录:芯片超频运行及超频后的串口使用

首先,说点个人看法:如果你是为了准备电赛才使用430的,那我建议你直接准备MSP432,两年,430的苦只有用了才知道,那干脆别用的好

当你用到这块板子,多半不是电赛就是电赛的路上。深知各位道友的苦恼,我们尽可能不说寄存器,不说操作,直接放配置和说明。
F5529默认是直接按照外部高速时钟的频率运行的,经过官方例程的锁相环倍频后也只能达到25MHz的运行频率。在默认频率下甚至使用串口时115200的波特率都无法使用,既然倍频那我们索性直接修改芯片内核参数,直接超频运行到40MHz,这个数据是大佬们实验出来的,40MHz的主频拿来使用绰绰有余了,我们直接拿来用就行。

void clock_init(unsigned char Fre)//修改主频程序
{
    P5SEL |= BIT2|BIT3|BIT4|BIT5;//开启外部两个时钟

    UCSCTL6 |= XCAP_3|XT1OFF;          // XT1 相关 配置
    UCSCTL6 |= XT2DRIVE_0 |XT2OFF;     // XT2 相关 配置
//以下是提升核心电压部分的代码
    PMMCTL0_H = 0xA5;                                         //开PMM电源管理
    SVSMLCTL |= SVSMLRRL_1 + SVMLE;                            //配置SVML电压
    PMMCTL0 =  PMMPW + PMMCOREV_3;                             //配置内核电压
    while((PMMIFG & SVSMLDLYIFG ) == 0);                       //等待设置完成
    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);
    if((PMMIFG & SVMLIFG) == 1)                                //判断内核电压是否上升到VSVML
         while((PMMIFG & SVMLVLRIFG) == 0);                    //如果没有等待
    SVSMLCTL &= ~SVMLE;                                        //关掉SVML模块
    PMMCTL0_H = 0X00;

    __bis_SR_register(SCG0);                 //该语法为固定格式,意为将括号内的变量置位,SCG0与系统工作模式有关,此时 MCLK 暂停工作
    UCSCTL0 = 0;                             //先清零,FLL 运行时,该寄存器系统会自动配置,不用管
    UCSCTL6 = (UCSCTL6&(~(XT2OFF|XT1OFF))|XCAP_3|XT2DRIVE_0);
    UCSCTL3 = (5<<4)|(2<<0);                 // 选择 XTAL2 的时钟信号作为参考信号 并且分频到1MHz
    UCSCTL4|= SELA_5;
    if(Fre < 5)
        UCSCTL1 = DCORSEL_2;
    else if(Fre<15)
        UCSCTL1 = DCORSEL_4;
    else
        UCSCTL1 = DCORSEL_7;
   UCSCTL2 = (Fre-1);
    __bic_SR_register(SCG0);
    __delay_cycles(782000);
    while (SFRIFG1 & OFIFG) {                               // Check OFIFG fault flag
      UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);           // Clear OSC flaut Flags
      SFRIFG1 &= ~OFIFG;                                    // Clear OFIFG fault flag
    }
    UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
}

主函数上插入这段代码,主函数中调用:
clock_init(40);//40Mhz就实现了超频。

超频后系统对应的时钟频率也会发生改变,使用串口时要注意时钟源的选择
115200波特率使能UCA0:

void USART0_Config(void)
{
    //串口初始化
     P3SEL    |=  BIT3+BIT4 ;                        // P5.6,7 = USCI_A1 TXD/RXD
     UCA0CTL1 |=  UCSWRST;                      // **Put state machine in reset**
     UCA0CTL1 |=  UCSSEL_1;                     // ACLK
     UCA0BR0   =  0x02;                         // 4MHz 9600 波特率为115200
     UCA0BR1   =  0x00;                             // 4MHz 115200
     UCA0MCTL |=  UCBRS_3 + UCBRF_2 + UCOS16;           // Modulation UCBRSx=1, UCBRFx=0
     UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
     UCA0IE   |=  UCRXIE;                       // Enable USCI_A1 RX interrupt 使能中断
}

unsigned char Char = 0;
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
    _DINT();
    switch (__even_in_range(UCA0IV,4))
    {
    /*
     * UCA1IV中断向量分组:
     * 00h = 没有中断
     * 02h = 收到数据中断,中断优先级高
     * 04h = 发送缓冲区为空
     */
    case 0:break;
    case 2:
        Char  = UCA0RXBUF;
        break;
    case 4:break;
    default:break;
    }
    _EINT();
}

使用串口一时配置把对应的0改成1就行。

9600波特率时初始化:

void UCA0_Init(void)
{
    P3SEL |=BIT3+BIT4;      //使用P33 P34口 USCI_A0 TXD/RXD
    UCA0CTL1 |=UCSWRST;     //串口状态复位 使能软件复位操作
                            //(需要先使能UCSWRST该位才能软件配置串口设置)
    UCA0CTL1 |=UCSSEL_1;    //串口时钟选择ACLK
    UCA0BR0 = 0x03;         //波特率9600--> 32768Hz,9600时UCBR1=3
    UCA0BR1 = 0X00;         //UCBRx=UCAxBR0+UCAxBR1*256
    UCA0MCTL |=UCBRS_3 + UCBRF_0;   //UCBRSx=1,UCBRFx=0
    UCA0CTL1 &= ~UCSWRST;   //禁止软件复位操作
    UCA0IE |= UCRXIE;       //使能串口中断
}

Code and life
人生不易,请珍惜眼前人

物联沃分享整理
物联沃-IOTWORD物联网 » MSP430F5529学习记录:芯片超频运行及超频后的串口使用

发表评论