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.

MSP430FR5043: BSL频率问题

Part Number: MSP430FR5043

我现在正在用MSP430FR5043做一个项目,需要用到BSL功能。在TI官方文档中提到了BSL必需运行在8MHz的主频率以下,但是我在板子上调试的结果是如果芯片一直运行再8MHz频率以内,包括8MHz,那么BSL毫无问题。但是如果芯片先运行在16MHz的频率,然后在BSL之前降低到8MHz以内,那么BSL就会失败,表现为在发送default password的时候显示:[ACK_ERROR_MESSAGE]Unknown ACK value!

请问如何解决这个问题?谢谢

  • 您好,我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

  • 您好,从从 16MHz 切换后,您是怎样验证主频率是 8MHz的 ?

  • 谢谢回复。我用MSP430的库里面的CS_getMCLK()函数看频率的,修改频率后略微延时看到了函数返回值是8000000。我之前使用MSP432的时候一直使用这个方法监视单片机频率,没有遇到过问题,所以我自己默认这种方法是正确的

  • 补充提问:我今天用外接16MHz晶振试了下,结果是如果使用HFXT那么无论如何BSL都不会成功,必须满足以下条件BSL才能成功:1.BSL之前切换到DCO和8MHz的MCLK,2.单片机在任何时候不能使用HFXT并设置MCLK为16MHz(也就是说可以初始化时用HFXT和8MHz的MCLK,当需要BSL时候切换到DCO才可以)。我用单片机引脚直接输出MCLK/SMCLK/ACLK的频率都是正确的,BSL是在程序中软件调用进入的。

  • 您好,当您以 16MHz 运行时,应该使用 1 wait state。 当下降至 8MHz 时,您有没有将wait state复位为 0 ?

  • 系统初始化如下:

    CS_setDCOFreq(CS_DCORSEL_1,CS_DCOFSEL_4); //High range and 16MHz

     CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_2);

    FRCTL0 = (FRCTLPW | NWAITS_1);

    …………………………………………………………………………

    当需要BSL时,在降低频率后,已将wait state复位到0,没有任何不同,依然无法进行BSL。

    这段代码是:

    CS_setDCOFreq(CS_DCORSEL_1,CS_DCOFSEL_3); //High range and 8MHz
    CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    // Configure wait states to be able to use 8 MHz MCLK
    FRCTL0 = (FRCTLPW | NWAITS_0);
    __delay_cycles(16000);
    __disable_interrupt(); // to eliminate echo of int8_ts
    ((void (*)())0x1000)(); // jump to Z-area of BSL

  • 抱歉回复晚了,工程师用 MSPFET 编程器试着重现该问题,是没有问题的。 请问您使用什么工具?

  • 谢谢回复,没关系不着急,慢慢解决。

    我也用MSPFET编程器调试和下载代码,并且用一根普通USB转串口线通过UART3端口进行BSL,因为在现场工地使用的时候只能由操作人员使用常见的USB转串口线操作

    是否只有使用MSPFET的时候才可以从16MHz切换到8MHz进行BSL,而使用其他线缆的时候只能一直使用8MHz呢?

  • 您好,因为工程师这边没办法重现该问题,您能否尝试将代码大小降至绝对最小值,然后看下问题是否仍然存在?以下为工程师的项目,您可以参考下:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <msp430.h>
    #include <stdbool.h>
    #include <stdint.h>
    /**
    * main.c
    */
    int main(void)
    {
    WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
    // GPIO initialization specific to HW
    P1DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7);
    P1OUT = 0x00;
    P1SEL0 = (BIT2 | BIT3);
    P2DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT6 | BIT7);
    // enable pullup on P2
    P2OUT = BIT5;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 非常感谢!我试着加上了改变频率之前的降低到1MHz并且把分频设置为4,现在可以完美运行在16MHz下并且用8MHz进行BSL了。

    再麻烦问下,这个errata在哪里可以找到呢,应该是我没有留意这个errata所以一直没有解决这个问题

  • 抱歉回复晚了,您可以看下errata中的CS12。

x 出现错误。请重试或与管理员联系。