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/MSP430F2619S-HT:IAR/CS中的DCO校准常数不同?

Guru**** 2615675 points

Other Parts Discussed in Thread: MSP430F2619

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/667159/ccs-msp430f2619s-ht-dco-calibration-constants-different-in-iar-ccs

部件号:MSP430F2619S-HT
主题中讨论的其他部件:MSP430F2619MSP430WARE

工具/软件:Code Composer Studio

大家好,我正在从一个工作的传统IAR移植到CCS,当 程序计数器到达调用函数设置16MHz的代码时,CCS代码将标记OFIFG标志。CCS代码与时钟定义/声明完全相同。

详细了解IAR和CCS之间的MSP430f2619.h文件,我注意到内部时钟的校准常量不同。下面是IAR和CCS之间16MHz函数和校准常量的声明。

下面是代码和声明。感谢您提供任何帮助。

编辑:出于某些原因,我看不到我插入的代码-请点击"回复"按钮查看整个帖子

// msp430fxxx.h文件中的声明来自CCS//

#define CAL_DCO_16MHz (0x0002) /* 16MHz DCOCTL校准数据索引*/
#define CAL_BC1_16MHz (0x0003) /* 16MHz BCSCL1校准数据的索引*/
#define CAL_DCO_12MHz (0x0004) /* 12MHz DCOCTL校准数据的索引*/
#define CAL_BC1_12MHz (0x0005) /* 12MHz BCSCL1校准数据的索引*/
#define CAL_DCO_8MHZ (0x0006) /* 8MHz DCOCTL校准数据索引*/
#define CAL_BC1_8MHZ (0x0007) /* 8MHz BCSCL1校准数据的索引*/
#define CAL_DCO_1MHz (0x0008) /* 1MHz DCOCTL校准数据的索引*/
#define CAL_BC1_1MHz (0x0009) /* 1MHz BCSCL1校准数据的索引*//**************************************************************



*信息内存中的校准数据
****************************************************** /

#ifndef __DisableCalData

SFR_8位(CALDCO_16MHz); /* 16MHz *的DCOCTL校准数据/
SFR_8位(CALBC1_16MHz); 16MHz *的/* BCSCL1校准数据/
SFR_8位(CALDCO_12MHz); /* 12MHz的DCOCTL校准数据*/
SFR_8位(CALBC1_12MHz); /* 12MHz *的BCSCL1校准数据/
SFR_8位(CALDCO_8MHZ); /* 8MHz */
SFR_8位的DCOCTL校准数据(CALBC1_8MHZ); /* 8MHz的BCSCL1校准数据*/
SFR_8位(CALDCO_1MHz); /* 1MHz的DCOCTL校准数据*/
SFR_8位(CALBC1_1MHz); /* 1MHz的BCSCL1校准数据*//



来自IAR// msp430fxxx.h文件


的声明#define CAL_DCO_16MHz (0x0000u)/* 16MHz DCOCTL校准数据索引*/
#define CAL_BC1_16MHz (0x0001u)/* 16MHz BCSCL1校准数据索引*/
#define CAL_DCO_12MHz (0x0002u)/* 12MHz DCOCTL校准数据索引*/
#define CAL_BC1_12MHz (0x0003u)/* 12MHz的BCSCL1校准数据索引*/
#define CAL_DCO_8MHZ (0x0004u)/* 8MHz * DCOCTL校准数据索引/
#define CAL_BC1_8MHZ (0x0005u)/* 8MHz BCSCL1校准数据索引*/
#define CAL_DCO_1MHz (0x0006u)/* 1MHz DCOCTL校准数据索引*/
#define CAL_BC1_1MHz (0x0007u)/* 1MHz BCSCL1校准数据索引*//************************************************



*信息内存中的校准数据
****************************************************** /

#ifndef __DisableCalData

#define CALDCO_16MHz_ (0x10F8u)/* 16MHz DCOCTL校准数据*/
只读DEFC (CALDCO_16MHz ,CALDCO_16MHz_)
#define CALC1_16MHz_ (0x10F9u)/* BCSCL1 16MHz校准数据*/
只读DEFC (CALC1_16MHz ,CALC1_16MHz_)
#define CALDCO_12MHz_ (0x10FAu)/* 12MHz DCOCTL校准数据*/
只读DEFC( CALDCO_12MHz) ,CALDCO_12MHz_)
#define CALC1_12MHz_ (0x10FBu)/* BCSCL1 12MHz校准数据*/
只读DEFC (CALC1_12MHz ,CALC1_12MHz_)
#define CALDCO_8MHZ_ (0x10FCu)/* 8MHz DCOCTL校准数据*/
只读DEFC (CALDCO_8MHZ) ,CALDCO_8MHZ_)
#define CALC1_8MHZ_ (0x10FDu)/* BCSCTL1 8MHz校准数据*/
只读DEFC( CALC1_8MHZ ,CALC1_8MHZ_)
#define CALDCO_1MHz_ (0x10FEu)/* 1MHz DCOCTL校准数据*/
只读DEFC (CALDCO_1MHz ,CALDCO_1MHz_)
#define CALC1_1MHz_ (0x10FFu)/* BCSCL1用于1MHz的校准数据*/
只读DEFC( CALC1_1MHz) ,CALC1_1MHz__////////////////////////////////////////////////////////////////////////////////////


void Clock_16MHz ()
{
IE1 &=~(OFIE); //禁用OSC故障中断

DCOCTL = DCO2 + DCO0; //将频率设置为16MHz,DCOx = 4
BCSCTL1 = XT2OFF + RSEL3 + RSEL2 + RSEL1 + RSEL0;//RSELx = 15
BCSCTL2 = 0x00; //分隔符=0表示MCLK,SMCLK = DCO
BCSCTL3 = LFXT1S_3 | XCAP_0; //LFXT1CLK源:-外部振荡器,XCAP = 1pF

__DELAY_CYCLES (100);

IFG1 &=~(OFIFG); //清除OSC标志
IE1 |= OFIE; //启用OSC故障中断
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    // msp430fxxx.h文件中的声明来自CCS//
    
    #define CAL_DCO_16MHz (0x0002) /* 16MHz DCOCTL校准数据索引*/
    #define CAL_BC1_16MHz (0x0003) /* 16MHz BCSCL1校准数据的索引*/
    #define CAL_DCO_12MHz (0x0004) /* 12MHz DCOCTL校准数据的索引*/
    #define CAL_BC1_12MHz (0x0005) /* 12MHz BCSCL1校准数据的索引*/
    #define CAL_DCO_8MHZ (0x0006) /* 8MHz DCOCTL校准数据索引*/
    #define CAL_BC1_8MHZ (0x0007) /* 8MHz BCSCL1校准数据的索引*/
    #define CAL_DCO_1MHz (0x0008) /* 1MHz DCOCTL校准数据的索引*/
    #define CAL_BC1_1MHz (0x0009) /* 1MHz BCSCL1校准数据的索引*//**************************************************************
    
    
    
    *信息内存中的校准数据
    ****************************************************** /
    
    #ifndef __DisableCalData
    
    SFR_8位(CALDCO_16MHz); /* 16MHz *的DCOCTL校准数据/
    SFR_8位(CALBC1_16MHz); 16MHz *的/* BCSCL1校准数据/
    SFR_8位(CALDCO_12MHz); /* 12MHz的DCOCTL校准数据*/
    SFR_8位(CALBC1_12MHz); /* 12MHz *的BCSCL1校准数据/
    SFR_8位(CALDCO_8MHZ); /* 8MHz */
    SFR_8位的DCOCTL校准数据(CALBC1_8MHZ); /* 8MHz的BCSCL1校准数据*/
    SFR_8位(CALDCO_1MHz); /* 1MHz的DCOCTL校准数据*/
    SFR_8位(CALBC1_1MHz); /* 1MHz的BCSCL1校准数据*//
    
    
    
    来自IAR// msp430fxxx.h文件
    
    
    的声明#define CAL_DCO_16MHz (0x0000u)/* 16MHz DCOCTL校准数据索引*/
    #define CAL_BC1_16MHz (0x0001u)/* 16MHz BCSCL1校准数据索引*/
    #define CAL_DCO_12MHz (0x0002u)/* 12MHz DCOCTL校准数据索引*/
    #define CAL_BC1_12MHz (0x0003u)/* 12MHz的BCSCL1校准数据索引*/
    #define CAL_DCO_8MHZ (0x0004u)/* 8MHz * DCOCTL校准数据索引/
    #define CAL_BC1_8MHZ (0x0005u)/* 8MHz BCSCL1校准数据索引*/
    #define CAL_DCO_1MHz (0x0006u)/* 1MHz DCOCTL校准数据索引*/
    #define CAL_BC1_1MHz (0x0007u)/* 1MHz BCSCL1校准数据索引*//************************************************
    
    
    
    *信息内存中的校准数据
    ****************************************************** /
    
    #ifndef __DisableCalData
    
    #define CALDCO_16MHz_ (0x10F8u)/* 16MHz DCOCTL校准数据*/
    只读DEFC (CALDCO_16MHz ,CALDCO_16MHz_)
    #define CALC1_16MHz_ (0x10F9u)/* BCSCL1 16MHz校准数据*/
    只读DEFC (CALC1_16MHz ,CALC1_16MHz_)
    #define CALDCO_12MHz_ (0x10FAu)/* 12MHz DCOCTL校准数据*/
    只读DEFC( CALDCO_12MHz) ,CALDCO_12MHz_)
    #define CALC1_12MHz_ (0x10FBu)/* BCSCL1 12MHz校准数据*/
    只读DEFC (CALC1_12MHz ,CALC1_12MHz_)
    #define CALDCO_8MHZ_ (0x10FCu)/* 8MHz DCOCTL校准数据*/
    只读DEFC (CALDCO_8MHZ) ,CALDCO_8MHZ_)
    #define CALC1_8MHZ_ (0x10FDu)/* BCSCTL1 8MHz校准数据*/
    只读DEFC( CALC1_8MHZ ,CALC1_8MHZ_)
    #define CALDCO_1MHz_ (0x10FEu)/* 1MHz DCOCTL校准数据*/
    只读DEFC (CALDCO_1MHz ,CALDCO_1MHz_)
    #define CALC1_1MHz_ (0x10FFu)/* BCSCL1用于1MHz的校准数据*/
    只读DEFC( CALC1_1MHz) ,CALC1_1MHz__////////////////////////////////////////////////////////////////////////////////////
    
    
    void Clock_16MHz ()
    {
    IE1 &=~(OFIE); //禁用OSC故障中断
    
    DCOCTL = DCO2 + DCO0; //将频率设置为16MHz,DCOx = 4
    BCSCTL1 = XT2OFF + RSEL3 + RSEL2 + RSEL1 + RSEL0;//RSELx = 15
    BCSCTL2 = 0x00; //分隔符=0表示MCLK,SMCLK = DCO
    BCSCTL3 = LFXT1S_3 | XCAP_0; //LFXT1CLK源:-外部振荡器,XCAP = 1pF
    
    __DELAY_CYCLES (100);
    
    IFG1 &=~(OFIFG); //清除OSC标志
    IE1 |= OFIE; //启用OSC故障中断
    }
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    E2E系统隐藏部分帖子的方式非常奇怪。 我有人在看这个。
    我仍然能够看到代码发布。

    如果您检查系列用户指南中的索引值,它们将与IAR . h文件中显示的值匹配。 这些似乎是校准TLV结构的正确索引。

    我也检查了CCS的.h版本,它与您的版本匹配,似乎与家庭用户指南中的内容不匹配。
    我将与商业团队核实并回复。
    此致,
    涉水
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    他们可以编辑html来修复隐藏的代码。
    此致,
    涉水
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您抽出宝贵的时间-我正在重新分析我的代码,实际上我没有使用代码中的校准常量...因此,即使它们不同,对我来说也不重要。

    仍然是,磁鼓继续说明振荡器导致NMI中断的原因。

    我还注意到IAR在最高级别进行了优化,而在CCS中,我可以使用优化级别0进行编译和构建。 这会影响运行性能吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    具有不同IDE的不同优化级别肯定会影响性能,尤其是在使用SW延迟循环时,并且在不同优化级别处理这些优化级别时,两个IDE都有不同的规则。 为了缩小问题的范围,您需要找出触发OFIFG的特定标志。 我的赌注是一个偶然的错误。 我认为这是因为你只给xtal 100个周期在16MHz稳定. 这是不够的。 在清除振荡器故障电路之前,您需要给XTAL更多的启动时间,并且您可以启用NMI。传统上,这是在一个循环中完成的,它先清除xtal故障标志,然后清除振荡器故障标志, 然后检查OFIFG是否仍然设置。 如果是,则再次执行循环。 这样,循环将重复,直到xtal稳定。这是因为如果xtal不稳定,则会自动设置触发OFIFG的xtal故障标志。 与OFIFG达成相同交易。 如果设置了提供它的任何故障标志,则它将自动设置。 当所有故障最终清除后,回路将会退出,您知道您的时钟是稳定的。 然后,您可以为振荡器故障启用NMI中断,就像在该时间点之后发生了任何事情一样,然后您就知道您遇到了问题。

    这是否合理? 如果您需要上述回路示例,请查看MSP430Ware中用于此器件的时钟示例,其中设置了XTAL。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jace:
    我同意您在优化方面的观点-但我不认为振荡器有问题,因为我在运行IAR时没有遇到中断。

    我从IFG1寄存器中的OFIFG标志收到错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该代码适用于IAR,但不适用于CCS -不是硬件问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    在OFIFG中,问题总是与硬件有关,因为该标志直接与HW有关。OFIFG由LF_OICFault,XT1_OICFault和XT2_OICFault标志触发。 根据硬件稳定性,这三个都将自动触发。 由于IDE中存在差异,IAR可能会留出一些额外的时间,这是因为IAR处理XT1的代码时会稳定下来,而CCS则不会稳定下来。 这就是为什么建议执行上述回路,以确保XTAL有足够的时间稳定。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jace,我同意您的上述建议 -尝试在中断处理程序中添加无限循环以使振荡器稳定,但仍然存在相同的问题,事实上,我观察到的是OFIFG标志始终保持设置(从main.c中的第1行)。 我做了以下事情以了解更多信息-

    -已卸载v7并已安装v 6.2

    -卸载并重新安装MSP430UIF驱动程序

    -在v 6.2 中运行简单代码-但具有相同的NMI。

    有趣的是,我有一段代码最初是在CCS v6中编写的,它对时钟的声明与我当前代码中的声明相同,但是,我没有发现代码卡在该代码中的NMI中断(OFIFG)中... 我想我在这里有点疯狂,想要运行简单的代码。

    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;	//停止看门狗计时器
    IE1 &=~(OFIE); //禁用OSC故障中断
    IF (CALC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF)
    {
    同时(1)
    ; //如果清除的校准常量未加载,则捕获CPU!
    !}
    BCSCTL1 = CALC1_8MHZ; //将DCO设置为4MHz
    DCOCTL = CALDCO_8MHZ;
    BCSCTL2 = 0x00; //分隔符=0表示MCLK,SMCLK = DCO*/
    
    IFG1 &=~(OFIFG); //清除OSC标志
    IE1 |= OFIE; //启用OSC故障中断
    
    同时(1)
    {
    unsigned int test_var =0;
    对于(test_var =99;test_var >= 10;test_var--)
    ;}
    
    
    }
    
    #pragma vector=NMI_vector
    __interrupt void NMI_ISR(void){
    
    
    // if ((IFG1 & OFIFG)== 2)
    	while ((IFG1 & OFIFG)== 2)
    {
    IFG1 &=~OFIFG;
    }
    }
    

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

    如果在您清除OFIFG后仍在设置,则需要检查提供它的各个故障标志,以查看设置它的内容。 在我们清楚了解导致设置OFIFG的原因后,我们可以进一步调试该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外,您要执行的循环是沿着以下行的内容:

    //等待xtal稳定
    DO
    {
    IFG1 &=~OFIFG; //清除OSCFault标志
    (i = 0x47FF;i > 0;i --); //标记设置
    时间}
    同时((IFG1 & OFIFG)); // OSCFault标志是否仍然设置? 

    您希望在设置您的XTAL之后,但在启用OFIE之前执行此操作,就像您希望在启用故障中断之前XTAL稳定下来一样。