我现在正在用MSP430FR5043做一个项目,需要用到BSL功能。在TI官方文档中提到了BSL必需运行在8MHz的主频率以下,但是我在板子上调试的结果是如果芯片一直运行再8MHz频率以内,包括8MHz,那么BSL毫无问题。但是如果芯片先运行在16MHz的频率,然后在BSL之前降低到8MHz以内,那么BSL就会失败,表现为在发送default password的时候显示:[ACK_ERROR_MESSAGE]Unknown ACK value!
请问如何解决这个问题?谢谢
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!
请问如何解决这个问题?谢谢
您好,从从 16MHz 切换后,您是怎样验证主频率是 8MHz的 ?
系统初始化如下:
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
您好,因为工程师这边没办法重现该问题,您能否尝试将代码大小降至绝对最小值,然后看下问题是否仍然存在?以下为工程师的项目,您可以参考下:
#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);
}
}