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/MSP430I2041:在外部电阻器模式下选择DCO操作的正确方法是什么?

Guru**** 662690 points
Other Parts Discussed in Thread: MSP-TS430RHB32A, MSP430I2041, MSP430I2040
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/664693/ccs-msp430i2041-what-is-the-correct-method-of-selecting-dco-operation-in-external-resistor-mode

部件号:MSP430I2041
主题中讨论的其他部件:MSP-TS430RHB32AMSP430I2040

工具/软件:Code Composer Studio

我正在使用MSP-TS430RHB32A - 32引脚目标开发板上安装的MSP430i2041,并且我希望在外部电阻器模式下使用DCO。

我正在使用BLINK程序进行测试。

我已在CCS V7-3工作区的项目文件列表中添加了文件“low_lever_init.c”(请参阅随附图像)

我已将行“CSCTL0 = DCOR;”插入 到“LOW_LEVE_INIT.c”文件中,如下所示:

       /*校准DCO */
       CSIRFCAL =*(TLV_address_for _parse + TLV_CAL_CSIRFCAL);
       CSIRTCAL =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_CSIRTCAL);
       CSCTL0 = DCOR;
       CSERFCAL =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_CSERFCAL);
       CSERTCAL =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_CSERTCAL);

我的两个具体问题是:

1)上述代码片段是否足以对MSP430进行编程以使用外部DCO电阻器,或者我是否需要其他代码?

2) CCS编译器-链接程序编译器是否会自动创建.obj并 包括我修改的“low_level_init.c”,或者我是否需要在某个选项面板中标记此选项?

谢谢

千斤顶

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

    Jack,您好!

    1)是的,“CSCTL0=DCOR”将切换您的DCO以使用外部电阻器,并将其它CSCTL0位保留在其默认值上。 有关 所有详细信息,请参阅《MSP430i2xx系列用户指南》的4.2 .1.2 部分。

    2)我不确定我是否完全理解这个问题。 你需要把你的DCO代码片段插入到一个函数中(它被正确声明和定义),然后在你的blink.c中进行函数调用(我假设它包含你的main(),对吗?)。 这是否回答了您的问题?

    请告诉我这是否回答了您的问题,或者我是否误解了这些问题。

    此致,

    Britta.

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

    Britta,感谢您的迅速回复。 我仍然对时钟和"low_lever_init.c"链接有疑问。

    我将提供更多背景信息来澄清我的问题:

    Q1)在发布之前,我搜索过此论坛,还研究了I20xx用户指南的4.2 .1.2 部分,尝试回答我自己的问题。

    但是,实际上,我发现用户指南的以下章节更令人困惑,而不是有用:

    4.2。4.2 用例2:使用外部电阻器进行DCO操作–无故障

    说明

    1.在BOR之后,DCO在内部电阻模式下启动。

    2.在指定的DCO启动时间后,DCO以未校准的频率产生时钟信号。

    3.用户代码将TLV表中的内部电阻器频率校准值加载到闪存信息中

    CSIRFCAL寄存器中的内存。

    注:步骤3至5确保16.384 -MHz校准时钟在内部可用

    故障安全操作期间的电阻器模式。

    4.写入CSIRFCAL时,时钟停止,校准过程在DCO内启动。

    5.校准完成后,DCO会产生一个校准后的16.384 -MHz时钟,带有内部

    电阻器。

    6.用户代码通过设置COR位来选择外部电阻器模式。

    7.立即断言DCO故障信号,这会设置DCOF和OFIFG位。

    8.时钟停止,故障检测电路在DCO内打开。

    9. DCO对连接到ROSC引脚的电阻器执行运行状况检查。

    在这种使用情况下,假设推荐的电阻器已正确连接到ROSC引脚上。

    10.在DCO启动延迟(tdcoon)之后,DCO在外部电阻器中产生一个未校准的时钟

    模式。

    11. DCO取消断言DCO故障信号,从而清除DCOF位。 OFIFG位保持不变

    设置直至被软件清除。

    12.用户代码检查DCOF位并继续加载外部电阻器频率校准值

    从闪存信息存储器中的TLV表到CSERFCAL寄存器。

    13.写入CSERFCAL时,时钟停止,校准过程在DCO中启动。

    14.校准完成后,DCO会产生一个带有外部电阻器的16.384 -MHz时钟。

    SLAU335–

     我知道我的用户代码负责设置DCOR位,

    但是,步骤6-14涉及许多其他过程,包括 停止时钟,故障检查,启动延迟,故障标志, 由处理器等设置的位数

    我不知道msp430i2041神奇地执行了多少这种操作,以及我应该编码或解释哪些部分。

    问1a)在将 CSCTL0=DCOR设置为等待步骤9,10和11竞争后,是否需要在代码中添加延迟循环?

    问题1b)或者芯片上的启动过程是否会停止处理器执行,直到完成外围设备自检?

    问1c)在加载CSERFCAL寄存器之前,我是否真的需要执行步骤12 (DCOF位检查)? (我仍要如何处理答案?)

    问1D)如何确认时钟系统正在使用外部电阻器? 我不能只使用示波器来查看I/O引脚上的时钟信号,因为无论使用内部电阻器还是外部电阻器,时钟频率都是相同的。

    我的第二个问题是CCS如何将神秘的low_lever_init.c例程链接到可执行文件。

    使用CCS内的资源管理器创建新项目代码示例(如BLINK)时,仅创建main.c。

    当代码示例取自ti slac676f时,main.c和 low_leve_init.c都可用。

     low_lever_init.c的注释部分说明:

    //************************************************************************************************
    // MSP430i20xx初始化例程- low_leve_init.c
    //
    //在调用"main"之前,此函数由启动代码调用,和
    //执行数据段初始化之前。 该功能会影响
    //以下模块:
    // - JTAG - JTAG已禁用
    // - TLV -执行TLV校验和
    // - PMM -共享参考校准为1.16V
    // -时钟系统- DCO校准为16.384MHz
    // - SD24 - SD24参考电压微调已校准
    //
    //此函数的返回值控制数据段是否初始化
    //应该发生。 如果返回0,则绕过它。
    //
    //为MSP430i20xx编写的任何代码示例或应用程序
    //建议包括任何受影响模块的优势
    //功能确保应用程序完全校准。
    //
    //此外,建议将此初始化例程用于小的,短的
    //确保JTAG解锁的代码示例。 的i20xx系列
    //器件需要执行64个MCLK周期才能解锁JTAG。
    //如果设备不执行64个MCLK周期,则无法通过JTAG访问它。
    //************************************************************************************************

    BLINK示例注释状态:

    // MSP430i20xx演示-闪烁LED示例
    //
    // 说明:软件中的LED闪烁。
    //
    // ACLK = 32kHz,MCLK = SMCLK =校准DCO = 16.384MHz
    // *在构建/运行此示例时,确保包含low_lever_init.c *

    Q2a)所以很显然我不需要从主程序内部调用例程,因为它是由启动代码调用的,无论它在哪里,也可能是在芯片上,或者可能是由编译器生成的?

    Q2b)当 使用CCS内的资源管理器创建项目代码示例时,low_lever_init.c在项目中不存在,但链接程序不会发出提示,它显示为的是版本
    low_level_init.ojb在其中一个.h文件,库的其中一个文件或其他地方可用?

    Q2c)在CCS中创建空项目,然后从  slac676f复制blink.c和low_lever_init.c时,CCS生成操作是否自动使用我的LOW_LEVE_init.c本地项目版本创建.obj并正确链接它, 或者它是否使用其中一个已存在的库版本,我如何辨别哪个版本?

    很抱歉,如果此问题应该出现在CCS论坛中,但low_lever_init.c似乎特定于msp430I20xx系列。 用户指南似乎未讨论i20xx的这方面。

    很抱歉回答新手的问题,但是CCS是一个非常"功能丰富"的程序,它是一个"极其复杂"的委婉说法,构建过程中发生的许多事情对我来说都是一个谜。

    再次感谢您的迅速回复。

    千斤顶

     

     

    用户码通过设置DCOR位来选择外部电阻器模式。

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

    请原谅我的回答延迟,我花了一段时间来处理您的问题。
    关于您的第二个问题:
    Q2c)如果我理解正确,您希望在low_lever_init.c中进行更改,并确保CCS使用您的本地文件。 构建之前,CCS应检查项目中是否有low_lever_init.c,如果有,则使用该文件。 事实上,这不是MSP430I20xx专用的,但MSP430确实如此。

    我仍在调查您问题1的所有详细信息,希望在本周内为您提供最佳答案。 请再次对延迟回复表示歉意。

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

    您好,Britta,

    感谢您对low_lever_init.c问题的回答。这是有意义的。

    我也在周末进行了研究,在 TI slac676f中找到了一些示例代码(msp430i20xx_cs_03.c),代码示例下载

    这准确地显示了如何正确选择外部电阻器。

    当它显示语句    CSCTL0 = DCOR;应该放在主例程中,就在看门狗计时器禁用之后,请参见下面的代码。

    因此我将此帖子标记为已回答,再次感谢。

    此外,作为POST脚本,我查看了low_lever_init.c代码,我有一个建议,推荐给可能使用此处理器的任何人。

    我评论 了以下行:

       //  SYSJTAGDIS = JTAGDISKEY;(参见下文)

    这避免了JTAG锁定(在测试/调试期间发生在我身上)的问题

    此语句可能对生产代码有用,但在测试过程中使用它太危险。

    再次感谢您的帮助

    千斤顶

    -----------

    //************************* msp430i20xx_cs_03.c ***********************************************************************************
    // MSP430i20xx演示-基本时钟,MCLK = DCO/2,SMCLK = DCO/4,外部电阻器
    //
    // 描述:WFP 1.0 上的BUFFER MCLK(DCO/2)和WFP 1.1 上的SMCLK(DCO/4)。 对于
    //   外部电阻器模式,建议连接一个20kOhm电阻器
    //   至ROSC引脚。
    //
    // ACLK = 32kHz,MCLK = DCO/2 = 8.192MHz,SMCLK = DCO/4 = 4.096MHz
    // *在构建/运行此示例时,确保包含low_lever_init.c *
    //
    //              MSP430i20xx
    //-----------             
    //        /|\|               |
    //         | ROSC|--\\/\\--AVSS            
    //         --|RST            | 20kOhm
    //           |               |
    //           |           WFP 1.1 |-->SMCLK = DCO/4
    //           |           WFP 1.0 |-->MCLK = DCO/2
    //
    // T.Witt
    // 德州仪器(TI)
    // 2013年9月
    // 使用Code Composer Studio v 5.5 构建
    //************************************************************************************************
    包括"MSP4S.h"

    void main (void){
       WDTCTL = WDTPW | WDTHOLD;      //停止看门狗计时器

       CSCTL0 = DCOR;               //外部电阻器
       CSCTL1 |= DIVM__2 | DIVs__4;  // MCLK = DCO/2,SMCLK = DCO/4

       P1DIR ||  BIT0 | BIT1;       // WFP 1.0 ,WFP 1.1 输出
       P1SEL1 ||  BIT0 | BIT1;       // MCLK,SMCLK引脚功能
       P1SEL0 &=~(BIT0 | BIT1);

       同时(1);
    }

    --------  如何避免使MSP430快速发展-------

    low_lever_init代码片段:

       /*检查JTAG密码位置,如果密码不匹配,则禁用JTAG。
        *否则,JTAG将在重置后的第64个周期中启用。
        */
       如果(*jtagPwd != 0x0万)&&(*jtagPwd != 0xFFFFFFFFFFFFFFF))
       {
           /*禁用JTAG */
       //  SYSJTAGDIS = JTAGDISKEY;注释掉以避免处理器意外损坏
       }


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    John,您好,显然我已经支持了MSP430i2041,您知道如何再次启用JTAG吗? 我一直在阅读有关BSL的信息,但我找不到与此系列相关的文档,感谢您的建议,避免使用MSP430,我将在将来考虑使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Fidel,很遗憾听到您禁用了JTAG访问,我对此表示同情,因为我完全了解您的感受。

    当我遇到这种情况时,我还浏览了msp430i20xx文档和这些论坛,只找到了对其他MSP430系列(在重新启动时需要串行通信和特殊代码)的BSL,大量擦除命令的引用。 因此我无法尝试恢复芯片,而是更换了设备,幸运的是,开发板有一个简单的ZIF插座。 我已经为msp430i2040设计并组装了自己的电路板,因此如果我将其中一个电路板制成砖,它将需要焊接来替换,因此我在启动例程中对代码进行了注释。

    对不起,我没有太多帮助,但如果这是安慰的话,msp430i2041芯片可以制作非常非常小的砖块。

    千斤顶

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

    您好,Jhon:

    感谢您的快速回复,幸运的是,我正在使用开发板,我即将更换MSP,现在我在使用修改后的low_lever_init时遇到了一些问题,我将其放在我的项目中,并将其包含在主文件中,但我收到了有关重新定义的错误, 您能否为我提供一些有关如何使用修改后 的low_lever_init文件的指导,如果这是一个新问题,那么很抱歉,我是使用CCS和MSP的新问题。

    Fidel

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

    菲德尔,您好!

    我不记得有过重新定义错误(?) 我自己。你可以用修边工具来筛选错误并将其发布在这里。

    一个建议:

    确保主程序不包含对l low_lever_init的调用,因为这会自动发生,

    编译器链接器生成调用,因此您不必这样做。

    如果仍然存在问题:您可以考虑启动一个新的线程,其中包含错误的详细描述,并可以查看您的屏幕。

    新线程得到了广泛关注。

    千斤顶

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

    我已经重新阅读了所有这篇文章,似乎我只需要将low_lever_init.c文件放在项目内,CCS将自动使用它,我甚至不需要包括它或调用它,对吗? 或者我错过了什么? ,如果我理解正确,这可以解决我的问题,感谢您的帮助。

    Fidel
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引述:"我只需要将low_lever_init .c文件放入项目中,CCS将自动使用它,我甚至不需要包括它或调用它,对吗?"
    答:是的
    这就是您正常需要做的所有事情。
    千斤顶