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功能。在TI官方文档中提到了BSL必需运行在8MHz的主频率以下,但是我在板子上调试的结果是如果芯片一直运行再8MHz频率以内,包括8MHz,那么BSL毫无问题。但是如果芯片先运行在16MHz的频率,然后在BSL之前降低到8MHz以内,那么BSL就会失败,表现为在发送default password的时候显示:[ACK_ERROR_MESSAGE]Unknown ACK value!
请问如何解决这个问题?谢谢
谢谢回复。我用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是在程序中软件调用进入的。
系统初始化如下:
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编程器调试和下载代码,并且用一根普通USB转串口线通过UART3端口进行BSL,因为在现场工地使用的时候只能由操作人员使用常见的USB转串口线操作
是否只有使用MSPFET的时候才可以从16MHz切换到8MHz进行BSL,而使用其他线缆的时候只能一直使用8MHz呢?
您好,因为工程师这边没办法重现该问题,您能否尝试将代码大小降至绝对最小值,然后看下问题是否仍然存在?以下为工程师的项目,您可以参考下:
#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; 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 Setup CSCTL0_H = CSKEY_H; // Unlock CS registers CSCTL1 = DCOFSEL_0; // Set DCO to 1MHz // Set SMCLK = MCLK = DCO, ACLK = VLOCLK CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Per Device Errata set divider to 4 before changing frequency to // prevent out of spec operation from overshoot transient CSCTL3 = DIVA__4 | DIVS__4 | DIVM__4; // Set all corresponding clk sources to divide by 4 for errata CSCTL1 = 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 operation CSCTL0_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 registers CSCTL1 = DCOFSEL_0; // Set DCO to 1MHz // Per Device Errata set divider to 4 before changing frequency to // prevent out of spec operation from overshoot transient CSCTL3 = DIVA__4 | DIVS__4 | DIVM__4; // Set all corresponding clk sources to divide by 4 for errata CSCTL1 = 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 operation CSCTL0_H = 0; // Lock CS registers // Lock CS registers // Configure zero FRAM waitstate as required by the device datasheet for MCLK FRCTL0 = FRCTLPW | NWAITS_0; while(1) { // Toggle LED1 to signal application is running P1OUT ^= BIT0; // If switch is pressed, enter BSL mode if((P2IN & BIT5) != BIT5) { // Set LED2 to signal entry into BSL P1OUT |= BIT1; ((void (*)())0x1000) (); } _delay_cycles(1000000); } }
非常感谢!我试着加上了改变频率之前的降低到1MHz并且把分频设置为4,现在可以完美运行在16MHz下并且用8MHz进行BSL了。
再麻烦问下,这个errata在哪里可以找到呢,应该是我没有留意这个errata所以一直没有解决这个问题