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.

MSP430FR5992是否比5969运行速度慢?急!!!

Other Parts Discussed in Thread: MSP430FR5992, MSP430FR5969

在做一个产品,最初第一版是用msp430fr5969做的,后来产品升级ROM不够用了,就将mcu更换为了msp430fr5992,这两个单片机管脚完全兼容,ROM比之前的5969大一倍。但是更换后发现了一个问题,相同的时钟配置下,5992的运行速度比之前5969的慢了好多,比如之前的一个计算函数在5969单片机上运行需要11ms,在5992单片机上运行则需要26ms,不知道是什么原因?请高手指点一下。

MCLK用的是内部的DOC,我配置的是21MHz(NWAITSX bit也全设置为了1),SMCLK用的是外部HF(12MHz),ACLK用的是外部LF(32.768KHz)。

  • 做产品不建议超频使用啊,这两个mcu的最高频,数据手册里写的都是16MHz。

    如果运算比较多,注意用好硬件乘法器。

  • 硬件乘法器已经使能了,产品中浮点数据的运算量比较大,三角函数调用比较多,所以只能超频了,极限是24M,我只用到了21M,我的疑问是相同的时钟配置,相同的函数,为什么在5992上运行比在5969上慢,两个程序我没有看出有什么明显区别啊?
  • 我怀疑5992的实际运行频率可能并没到21MHz,你把时钟通过io输出,用示波器观察一下实际的运行频率。

  • 另外您可以先看一下 www.ti.com/.../slaa801.pdf 的 2.1.1 Optimization Settings,可以帮助您提高代码运行速度

    相对来说频率较高的时候,功耗也会相应增加
  • 我试着把SMCLK设置为DOC,然后在IO口上看过,是21M左右,正式产品上SMCLK是外部HF,但是MCLK是用的DOC(21M),因此MCLK就是21M,问题是相同的时钟设置和运行函数,在5992上运行时间比5969慢好多啊。这个不理解啊,产品升级更换MCU后计算速度慢了进一倍。现在是要解决这个问题。
  • 我用的是IAR,代码优化我选的是LOW,这个办法在产品第一版时就实验过,过分提高级别会导致优化后代码表达的意思不完全对,另外新添加的功能需要的ROM很大,所以只能更换MCU了,问题是在时钟配置几乎相同的情况下,原来的函数运行时间都慢了很多,这个是什么原因,我甚至单独建了两个测试工程(和产品功能完全脱离),一个是5969的,一个是5992的,两个使用相同的时钟配置,都调用同一个函数(函数内容是一大堆浮点的乘法和加法),结果5969用了107ms,5992用了238ms,太奇怪了,难道是5992性能不如5969?
  • 时钟初始化代码如下:
    void clk_init(void)
    {
    // LED1_CLOSE;
    FRCTL0=0XA500+NACCESS0+NACCESS1+NACCESS2;//晶振大于8M时需要设置NWAITS为1
    //FRCTL0=NACCESS0;
    PJDIR=0x00;
    PJOUT=0;
    PJREN=0xFF;
    PJSEL0=PJSEL0_6+PJSEL0_7;
    PJDIR|=(BIT5+BIT7);
    CSCTL0=0xA500;//password
    CSCTL1=DCOFSEL0+DCOFSEL2+DCORSEL;//DCORSEL=高速模式 101=21M
    CSCTL2=0;
    CSCTL2=SELS0+SELS2+SELM0+SELM1;//MCLK=DOC SMCLK=HF
    CSCTL3=0;
    CSCTL4=VLOOFF+LFXTDRIVE0+LFXTDRIVE1+HFXTDRIVE0+HFXTDRIVE1+HFFREQ1+LFXTOFF;//关闭VLO


    CSCTL5=0;
    CSCTL6=ACLKREQEN+MCLKREQEN+SMCLKREQEN+MODCLKREQEN;//
    // LED1_OPEN;
    do
    {
    PM5CTL0 &= ~LOCKLPM5;
    CSCTL0=0xA500;//password
    CSCTL0_H=0xa5;
    CSCTL5 &= ~(LFXTOFFG+HFXTOFFG);
    SFRIFG1&=~OFIFG;
    delay(0x8f);
    }
    while(CSCTL5&HFXTOFFG);//SFRIFG1&OFIFG

    }
  • 请问能否给出您具体的测试代码?
  • #include "io430.h"
    typedef unsigned char uchar;
    typedef signed char schar;
    typedef unsigned int uint;
    typedef signed int sint;
    typedef unsigned long int ulint;
    typedef signed long int slint;
    #define PI 3.14515926

    void delay(uint i)
    {
    while(i--);
    }


    void clk_init(void)
    {
    // LED1_CLOSE;
    FRCTL0=0XA500+NACCESS0+NACCESS1+NACCESS2;//晶振大于8M时需要设置NWAITS为1
    //FRCTL0=NACCESS0;
    PJDIR=0x00;
    PJOUT=0;
    PJREN=0xFF;
    PJSEL0=PJSEL0_6+PJSEL0_7;
    PJDIR|=(BIT5+BIT7);
    CSCTL0=0xA500;//password
    CSCTL1=DCOFSEL0+DCOFSEL2+DCORSEL;//DCORSEL=高速模式 101=21m
    CSCTL2=0;
    CSCTL2=SELS0+SELS2+SELM0+SELM1;
    CSCTL3=0;
    CSCTL4=VLOOFF+LFXTDRIVE0+LFXTDRIVE1+HFXTDRIVE0+HFXTDRIVE1+HFFREQ1+LFXTOFF;//关闭VLO


    CSCTL5=0;
    CSCTL6=ACLKREQEN+MCLKREQEN+SMCLKREQEN+MODCLKREQEN;//
    // LED1_OPEN;
    do
    {
    PM5CTL0 &= ~LOCKLPM5;
    CSCTL0=0xA500;//password
    CSCTL0_H=0xa5;
    CSCTL5 &= ~(LFXTOFFG+HFXTOFFG);
    SFRIFG1&=~OFIFG;
    delay(0x8f);
    }
    while(CSCTL5&HFXTOFFG);//SFRIFG1&OFIFG

    }




    void timerA0_init(void)// 1ms定时器 用于测量计算时间
    {

    TA0CTL=TASSEL1+MC0+ID1+ID0;//+TAIE; 12M 12/8=1.5
    TA0CCR0=1500;//32
    __bis_SR_register(GIE);

    TA0R=1499;TA0CCTL0=CCIE;
    }

    uint count=0;
    #pragma vector = TIMER0_A0_VECTOR
    __interrupt void TimeA0(void)
    {
    count++;

    }




    //测试用变量
    uint ii,jj;
    float f1[100],f2[100],f3[100];



    int main( void )
    {
    // Stop watchdog timer to prevent time out reset
    WDTCTL = WDTPW + WDTHOLD;

    clk_init();//初始化时钟
    delay(65530);
    timerA0_init();//初始化定时器 1ms定时

    for(ii=0;ii<100;ii++)//初始化测试变量
    {
    f1[ii]=PI;
    f2[ii]=2*PI;
    f3[ii]=f1[ii]*f2[ii];
    }
    do
    {
    count=0;//清除计数
    for(jj=0;jj<100;jj++)
    {
    for(ii=0;ii<100;ii++)
    {
    f3[ii]=f1[ii]*f2[ii];
    }
    }
    //运行到此后count的值就是运行时间 两个for循环就是测试代码
    }
    while(1);

    return 0;

    }
  • 不知能不能从我的测试代码中看到操作不对的地方,另外我将DOC从21M降到了7M,测试的结果还是5992运行速度比5969慢,5992耗时716模ms,5969耗时322ms。
  • 好奇怪,是不是时钟配置哪里有区别,会不会寄存器哪个位不一样。
  • 楼主调试看看汇编代码是不是哪个芯片程序编译后能自动调用硬件乘法器,一个不可以。
  • 我将测试代码改为了整数相加,测试结果还是5992比5969慢一倍多点,汇编代码不太熟悉,所以没有测试,在IAR配置中我都是默认使用了硬件乘法器。
    以前我测试运行时间是用定时器测试的,今天测试使用的是CPU寄存器中的CYCLECOUNTER的值观察的,相同代码,5992的CYCLECOUNTER变化量比5969大一倍多点。
  • 太奇怪,没道理呀,我觉得得多看看手册比较比较两个芯片看是不是哪里有点区别
  • 我直接用汇编写了100个nop指令,在5992里运行后发现CYCLECOUNTER寄存器居然变化了284,按照21M时钟计算应该是284/21=13.5us,我用示波器测量了一下,100个Nop耗时大约13.7us,这两个时间应该是差不多,毕竟21M也不太准,但是一个nop使用2.84个时钟周期就不太对了,不应该是1个时钟周期吗?请指教!
  • 你好

    我这边没有FR5992的芯片但是我用FR5994测试了一下运行速度是一样的。
    MCLK 使用默认设置1MHz. 跑的代码是

    P1DIR |= BIT2;
    P1OUT &= ~BIT2;
    P3DIR |= BIT4;
    P3SEL1 |= BIT4; // Output SMCLK
    P3SEL0 |= BIT4;
    PM5CTL0 &= ~LOCKLPM5;
    delay(65);

    P1OUT |= BIT2;
    for(ii=0;ii<100;ii++)
    {
    f1[ii]=PI;
    f2[ii]=2*PI;
    f3[ii]=f1[ii]*f2[ii];
    }
    P1OUT &= ~BIT2;

    我测试的是P1.2 拉高的时间 FR5969 和 FR5994 都是20 ms.
    你可以在你的硬件上测试一下。
  • 我这几天稍微有了一点头绪,但是还是有一些事情解释不了。
    就以我运行100个nop指令为测试代码,观察cyclecounter的变化率来计算时间,首先我的MCLK=21M,使用的是DCO,根据文档要求大于8M时需要设置NWAITSx Bit位,我的测试结果是在5969上,如果不设置NWAITSx (x=0、1、2),我的初始化程序完成不了,暂时不管原因了,以后再查,但是只要设置了NWAITSx (x=0、1、2)的任何一个位或者多个位,执行100个nop就需要125个时钟周期,正常情况下应该是100个时钟周期才对,多的这25个周期暂时认为是设置了NWAITSx 位以后系统为了降低操作速度主动插入的延时吧,我暂时也只能这样理解了。但是在5992上测试时发现了一些区别,MCLK还是21M,用的也是DCO,当NWAITSx 全部设置为0时初始化顺利通过(初始化函数相同),并且运行100个nop指令时用了101个时钟周期,非常接近理论值,但是当NWAITS0设置为1时用了126个时钟周期,NWAITS1设置为1时用了151个时钟周期,NWAITS2设置为1时用了201个时钟周期,NWAITS0、NWAITS1、NWAITS2全部设置为1时用了276个时钟周期,也就是NWAITSx的值越大,运行100个nop指令需要的机器周期就越多,花费时间就越长。
    手册上也写了一但主频超过典型值8M后,NWAITSx 需要设置为1,但是NWAITSx 的这三个位和频率应该怎么匹配啊,全部设置为1后速度降低的太多了,设置小了又怕出问题,真实太纠结了,这是第一个问题。
    还有一个问题就是在5969上测试,只要设置了NWAITSx 的任何一个位,运行100个nop指令都是需要125个机器周期,它并没有随着NWAITSx 的值增大而变大,这个现象和5992不同,为什么?
    请大家积极讨论!谢谢。另外大家在做测试时主频最好也能使用DCO,并且使用21M,当然大于8M现象估计都是一样的。
  • 你的测试结果之所以一样,可能就是因为你的主频低于8M,没有使用NWAITSx位。你可以把主频设置为21M(DCO)试试看。
    如果您知道主频超过8M后应该如何设置NWAITSx (x=0、1、2),也请告知一下。期待您的回复!谢谢!
  • 我在5969下测试了一下MCLK=8M,不设置NWAITSx位,执行100个nop需要101个时钟周期,这个应该是正常的,设置NWAITSx任何一个bit为1后就需要125个时钟周期,由此可见,多花的时钟周期就是与NWAITSx有关。
  • 超过8MHz 一定要加NWAITSx 设置为1的, 超过16M 要设置成2.
    想提高运算速度可以考虑使用基于MPY32 和 LEA 的IQMATH/QMATH LIB
    www.ti.com/.../MSP-IQMATHLIB
    software-dl.ti.com/.../MSP430-IQmathLib-UsersGuide.pdf
    应该可以大幅提高你的运算速度