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.

[参考译文] CCS/MSP-EXP430FR2355:MSP430:文件加载器:在始终将24MHz 配置为 SMCLK 时验证失败

Guru**** 2589300 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/961867/ccs-msp-exp430fr2355-msp430-file-loader-verification-failed-while-configuring-24mhz-to-smclk-always

器件型号:MSP-EXP430FR2355

工具/软件:Code Composer Studio

大家好、团队、

我遇到了错误

MSP430:文件加载器:验证失败:地址0x08170上的值不匹配请验证目标存储器和存储器映射。

MSP430:GEL:文件:C:\Users\Lenovo \workspace_v10\Timer_Interrupt\Debug\Timer_Interrupt.out:发生数据验证错误、文件加载失败。

下面是我尝试加载到目标器件但遇到上述错误的代码。 我已将24MHz 时钟配置为 SMCLK 并使用 TimerB0生成中断。

不明白错误是什么以及为什么没有加载到目标。 请帮助我解决此错误。

#include

define DCOCLK_FREQUENCY 24000000
#define MCLK_FREQUENCY DCOCLK_FREQUENCY
#define SMCLK_FREQUENCY DCOCLK_FREQUENCY

unsigned int count=0;

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT

//配置 GPIO
P1DIR |= BIT0;
P1OUT = 0;

// P2SEL0 |= BIT7;// P2.7被选为 TB0CLK

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

P2SEL1 |= BIT6 | BIT7;// P2.6~P2.7:晶振引脚

操作

CSCTL7 &=~(XT1OFFG | DCOFFG);//清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;

while (SFRIFG1和 OFIFG);//测试振荡器故障标志

_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_XT1CLK;//将 XT1设置为 FLL 基准源
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 = DCORSEL_7;//设置 DCO = 24MHz
CSCTL2 = FLLD_0 + 731;// DCOCLKDIV = 24MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0);//启用 FLL
while (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1))
;// FLL 锁定

CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK;//将 XT1 (~32768Hz)设置为 ACLK 源
//默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

TB0CCTL0 |= CCIE;//启用 TBCCR0中断
TB0CCR0 = SMCLK_FREQUENCY / 1000000;
TB0CTL = TBSSEL_SMCLK | MC_2;// SMCLK、连续模式

_bis_SR_register (LPM0_bits | GIE);//通过中断输入 LPM0
__no_operation();//进行调试


// Timer0_B0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_B0_vector
_interrupt void Timer0_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_B0_vector)) Timer0_B0_ISR (void)
其他
错误编译器不受支持!
#endif

count += 1;
如果(计数== 2)

计数= 0;
P1OUT ^= BIT0;

_BIC_SR_register (LPM0_BITS);

谢谢、此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在配置时钟之前添加以下行:

    > FRCTL0 = FRCTLPW | NWAITS_2;  // FRAM:2个等待状态

    我无法肯定这是原因、但如果 FRAM 运行得太快、将会导致无法预测的行为。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vamshi、

    也许 Linker 文件指定的内存映射有一些问题?  

    此 e2e 主题 https://e2e.ti.com/support/tools/ccs/f/81/t/738865 和 CCS 调试文章提供了一些有关如何查找问题的建议: https://dev.ti.com/tirex/explore/node?node=APy2XbLelxyqBB2Yz0WR.w__FUz-xrs__LATEST 

    Srinivas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bruce、

    我现在将进行检查。 那么、您是说我们无法将 SMCLK 配置为24MHz 吗?

    我需要1微秒的计时器中断。 因此、我在上面尝试过代码。

    在1微秒配置计时器周期中断是否有更好的方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Srinivas、

    感谢你的答复。  

    我已经交叉检查了链接器文件、但一切都很好。 我认为 Bruce 有一个问题、我需要检查 SMCLK 是否可以配置为24MHz。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以配置 SMCLK=24MHz。 但在此过程中、您还将配置 CPU 时钟、MCLK = 24MHz。 在这种情况下、CPU 将尝试以24MHz 的频率读取 FRAM、并且将失败(最大8MHz)。 该代码行在读取 FRAM 时强制设置2个等待状态、以将其降低至8MHz。

    正如我在另一个线程中提到的、即使在24MHz 下、每1微秒中断一次也是不可行的、因为 ISR 花费的时间太长。 我怀疑还有另一种方法可以做你想做的事,但我不清楚这是什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    谢谢您、代码在您在下面建议的行中运行正常。

    > FRCTL0 = FRCTLPW | NWAITS_2;  // FRAM:2个等待状态

    您告诉  过"即使在24MHz 下、每1微秒中断一次也是不可行的、因为 ISR 花费的时间太长"。  您能告诉我、我们可以生成的最短计时器中断(以微秒为单位)是什么?

    如果我在10微秒生成中断并在 ISR 中切换 DIO、这是否会在10微秒内从该 ISR 发出? 如果不是、请建议指令周期。

    任何帮助都是非常感谢的。

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我通常估计20-30个 CPU 时钟(MCLK)用于"不执行任何操作" ISR。 FRAM 速度限制会使这种估算值变得有点模糊。 如果您不想做太多、10微秒 ISR 应该是可行的。 如果您计划使用 LPM、请务必查看唤醒时间[参考数据表(SLASEC4C)表5-2]。

    如果您的目标(与实验相反)是在100kHz 或1MHz 时切换引脚,那么我建议使用计时器("PWM")输出,因为这不需要 CPU 资源,也不会出现软件抖动。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    非常感谢您的宝贵解释。

    我还想介绍的一点是、我已将 SMCLK 配置为24MHz、并在 Timer0_B0_ISR 中生成了计时器中断和切换 DIO。 然后、我得到周期为5.4毫秒的信号。 现在、我尝试在相同的24MHz SMCLK 上进行10微秒的周期。   

    下面是代码

    define DCOCLK_FREQUENCY 24000000
    #define MCLK_FREQUENCY DCOCLK_FREQUENCY
    #define SMCLK_FREQUENCY DCOCLK_FREQUENCY

    然后在 main 中、我编写了

     TB0CCTL0 |= CCIE;  

    TB0CCR0 = SMCLK_FREQUENCY / 1000000;

    TB0CTL = TBSSEL_SMCLK | MC_2;         // SMCLK、连续模式  

    和 ISR 中

    > P1OUT ^= BIT7;

    要使用24MHz SMCLK 上的计时器中断获得10微秒的周期、我必须做什么更改? 您能不能再看看这个问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > TB0CCR0 = SMCLK_FREQUENCY / 1000000;

    这似乎除以100万(1uec 触发器)而不是1亿(10 uec 触发器)。 尝试:

    > TB0CCR0 = SMCLK_FREQUENCY / 100000UL; // 10usec

    --------

    > TB0CTL = TBSSEL_SMCLK | MC_2;         // SMCLK、连续模式  

    我想您在这里需要向上计数模式:

    > TB0CTL = TBSSEL_SMCLK | MC_1;         // SMCLK、向上计数模式  

    --------

    >#define DCOCLK_FREQUENCY 24000000

    作为一般做法、我建议使用"L"或"UL"标记大于"int"的任何常量、以防止编译器截断。 尝试:

    #define DCOCLK_FREQUENCY 24000000UL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    感谢大家的参与、我已如上所述进行了更改。 现在、周期是20微秒。