TI中文支持网
TI专业的中文技术问题搜集分享网站

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!

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

Cherry Zhou:

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

,

Cherry Zhou:

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

,

Kai Shan:

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

,

Kai Shan:

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

,

Cherry Zhou:

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

,

Kai Shan:

系统初始化如下:

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

,

Cherry Zhou:

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

,

Kai Shan:

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

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

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

,

Cherry Zhou:

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

#include <msp430.h>#include <stdbool.h>
#include <stdint.h>/*** main.c*/
int main(void)
{WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer// GPIO initialization specific to HWP1DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7);P1OUT = 0x00;P1SEL0 = (BIT2 | BIT3);P2DIR= (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT6 | BIT7);// enable pullup on P2P2OUT= BIT5;P2REN= BIT5;PM5CTL0 &= ~LOCKLPM5;// FIRST START UP AT 16MHZ// Configure one FRAM waitstate as required by the device datasheet for MCLK// operation beyond 8MHz _before_ configuring the clock system.FRCTL0 = FRCTLPW | NWAITS_1;// Clock System SetupCSCTL0_H = CSKEY_H;// Unlock CS registersCSCTL1 = DCOFSEL_0;// Set DCO to 1MHz// Set SMCLK = MCLK = DCO, ACLK = VLOCLKCSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;// Per Device Errata set divider to 4 before changing frequency to// prevent out of spec operation from overshoot transientCSCTL3 = DIVA__4 | DIVS__4 | DIVM__4;// Set all corresponding clk sources to divide by 4 for errataCSCTL1 = DCOFSEL_4 | DCORSEL;// Set DCO to 16MHz// Delay by ~10us to let DCO settle. 60 cycles = 20 cycles buffer + (10us / (1/4MHz))__delay_cycles(60);CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;// Set all dividers to 1 for 16MHz operationCSCTL0_H = 0;// Lock CS registers// Lock CS registers// THEN DROP DOWN TO 8MHZ BEFORE INVOKING BSL__delay_cycles(16000000);CSCTL0_H = CSKEY_H;// Unlock CS registersCSCTL1 = DCOFSEL_0;// Set DCO to 1MHz// Per Device Errata set divider to 4 before changing frequency to// prevent out of spec operation from overshoot transientCSCTL3 = DIVA__4 | DIVS__4 | DIVM__4;// Set all corresponding clk sources to divide by 4 for errataCSCTL1 = DCOFSEL_3 | DCORSEL;// Set DCO to 8MHz// Delay by ~10us to let DCO settle. 60 cycles = 20 cycles buffer + (10us / (1/4MHz))__delay_cycles(60);CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;// Set all dividers to 1 for 16MHz operationCSCTL0_H = 0;// Lock CS registers// Lock CS registers// Configure zero FRAM waitstate as required by the device datasheet for MCLKFRCTL0 = FRCTLPW | NWAITS_0;while(1){// Toggle LED1 to signal application is runningP1OUT ^= BIT0;// If switch is pressed, enter BSL modeif((P2IN & BIT5) != BIT5){// Set LED2 to signal entry into BSLP1OUT |= BIT1;((void (*)())0x1000) ();}_delay_cycles(1000000);}}

,

Kai Shan:

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

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

,

Cherry Zhou:

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

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR5043: BSL频率问题
分享到: 更多 (0)