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.

[参考译文] MSP430FR5739:执行 main()所需的最短启动时间

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/698311/msp430fr5739-minimum-startup-time-to-execution-of-main

器件型号:MSP430FR5739

 msp430fr5739 使用标准 TI 引导加载程序进入 main()中第一行代码的最短/典型启动时间是多少?

我~的典型启动时间为 Δ t = 6.45ms。 有没有办法减小它? 是否更改为自定义引导加载程序?

对于嵌入了此器件并进行了固件更新的应用、我现在遇到了该器件必须准备2.5ms 而不是10ms 的情况。

我有150、000件库存器件 、 除非找到解决方案、否则这些器件将受到影响并无法使用。

帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    时间受您的硬件设计和软件选择的影响。

    如果不知道您的意愿,我们就不知道。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    内部振荡器。 3.3V。 这必须是一个可量化且经过测试的参数。 有哪些软件选择? 我使用的是 IAR Workbench、但它不应产生任何影响。 我询问从上电到执行第一条用户代码指令的时间。 6.45ms 的声音是否与它的典型值相似、或者我是否应该期待更快? 标准引导加载程序代码中是否存在任何延迟?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如我所指出的、早期启动由许多因素决定、此处未指定任何因素。 我认为、您可以浏览器件的数据表并与其他人分享更多有关您的设计的信息、从而为自己带来极大的好处。

    通常、振荡器需要一些时间才能开始工作。 该时间通常已指定但未经过测试。 该数字的范围从几 ms 到超过100ms、具体取决于供应商和振荡器的速度和时间-低频振荡器需要超过500ms 才能运行。

    尽管如此、TI 对其"即时启动"振荡器感到自豪、因此您的启动时间应该更短、其他一切都是相等的-遗憾的是、这种情况并非如此。

    根据您提供的有限信息、您的特定设计的启动时间除了您自己以外的任何其他内容都是不可知的。

    希望这对您有所帮助。 是的、对于典型的 MCU、6ms 的速度非常快。 如果您希望更快、请考虑使用外部振荡器、尤其是常开振荡器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rick、

    感谢您发帖。 实际上、使 MCU 进入 main 中的第一行代码的启动时间包括两个部分、电源周期时间和引导代码运行时间。

    对于功率循环时间、它与您的电源电路有关、尤其是 dVcc/dt。 如果在电源引脚中使用过大的电容、电压上升速度会太慢、这会导致加电时间增加。  我查看 MSP430FR5739数据表、唤醒时间如下。

    您设计的 MCU 电源似乎由其他器件控制。 缩短上电时间的解决方案是使 MCU 保持上电状态、但通过 GPIO 将其从复位或 LPM4状态唤醒。   

    2.对于引导代码运行时间,如果不 启用 MPU 并且没有要初始化的全局静态变量,则引导代码只执行栈初始化并跳转到 main()。 总 CPU 周期为37、在1MHz 默认加电主频率下约为37us。  

    但自定义引导代码仍可以减小该值。 如果您没有要初始化的全局静态变量、则 C 语言启动代码可替换为汇编启动代码、如下所示。

    此致、

    如果我的帖子有助于解决您的问题、请单击  验证答案    按钮 

    冬季、

    搜索 E2E! 您的问题可能已经得到解答!  

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

    感谢你的答复。 似乎冬季的答复已走上正轨。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。 唤醒 BOR 或加电似乎是相关的。 如果是这种情况、引导代码似乎消耗的是所测量的大部分6.45ms。 在多个器件上测量、看起来一致。

    正确的、此器件作为 I2C 从器件嵌入在另一个器件中、该器件控制电源、因此电源特性超出了我的控制范围、dV/DT 就是它的样子。

    引导代码位于何处、因此我可以将其转储并反汇编、除非有可用的已发布源代码或二进制文件?

    至于我的代码、这里是相关的部分-

    这是我的 main():

    void main (void)

    // SFRRPCR 寄存器在加电时设置了 SYSRSTRE -复位电阻器使能
    // SYSRSTUP -所选的上拉电阻也在加电时设置
    //未设置 SYSNMI。
    //所有这些都使引脚成为非浮点复位输入,因此我们不更改这些输入

    //启动时钟系统最大 DCO 设置、高范围~=23.8mhz

    CSCTL0_H = 0xA5; //解锁寄存器
    CSCTL1 = DCORSEL + DCOFSEL0 + DCOFSEL1;//设置范围和最大值 DCO 设置
    CSCTL2 = SELA_3 + SELS_3 + SELM_3; //设置 ACLK = DCO;SMCLK SOURCE = DCO、MCLK = DCO
    CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; //将所有分频器设置为/1
    CSCTL0_H = 0x01; //锁定寄存器

    //关闭基准
    REFCTL0 |= REFTCOFF;
    REFCTL0 &=~REFON;

    //配置 GPIO
    P1OUT = 0xfb;//尽早将外部 ASIC rst 置为低电平
    P2OUT = 0xff;

    P1DIR =(BIT0 + BIT1 + BIT2 + BIT4);//输出:debug0、debug1、ASIC_rst、(SPI cs on 4、SCK on 5、i2c sda on 6 SCK on 7)
    //位3上输入 ASIC_rdy

    P1SEL1 |=(BIT5 + BIT6 + BIT7);// 1.
    // P1SEL0 |=(BIT5 + BIT6 + BIT7);// 0 (次级模块功能在5、6和7上

    //将端口2.0和2.1配置为辅助模块功能(SPI)、SIMO 和 SOMI

    P2SEL1 |=(BIT0 + BIT1);// 1.
    // P2SEL0 &=~(BIT0 + BIT1);// 0 (辅助模块功能在0和1上

    WDTCTL = WDTPW + WDTHOLD; //停止 WDT

    application();//执行函数


    以下是我的主要应用程序全局空间:

    // BSS、但未初始化为0
    _no_init uint8 Printer2ChipData[IIC_Receive_buffer_size];//保留来自器件的消息
    _NO_INIT uint16 Printer2ChipCount;

    _no_init uint8 Chip2PrinterData[IIC_SEND_buffer_size];//保留器件的生成消息
    _NO_INIT uint16 Chip2PrinterCount;

    __no_init uint8 spi_rec_Buf[256];//最高为 ASIC
    _no_init uint8 ASIC_rev[2];
    _no_init uint16 tc;//用于计时测试

    __no_init uint8 SAuthData[AUTH_Challenge_size];//传入
    _no_init uint8 SAuthReply[AUTH_Reply_size]; //传出

    _NO_INIT uint8 FlashInitialized; //如果为 true 则为1

    _no_init uint8后门_已打开;//如果为 true

    __no_init uint16 number_for_received_commands;//加电后从0开始

    //多个序列号数据指针
    _no_init uint8 * cmd20dp;
    _no_init uint8 * cmd28dp;
    _no_init uint8 *粉笔;
    _no_init uint8 * rwdp;
    _no_init uint8 * rodp;

    //未初始化的持久性数据(以 fram 为单位)
    _persistent uint8 TableFlag;//如果为0、则使用表20、否则使用表28 (位于0xed00)
    _persistent uint8 TablePointer;//表指针(位于0xed01

    const uint8 ApplicationVersion[3]={0x02、0x00、0x0d};//在 NV 存储器中(位于0xed02-0xed04)
    //固件 c 添加了对旧打印机和新打印机设备的支持
    //旧的单声道打印机不会发出 cmd20,因此我们在写入地址0x0020时结婚
    //版本 d 06/21/16将单声道打印机 S 开关更改为从0x440读取

    // JTAG 密码填充06/16/16
    #pragma LOCATION = 0xFF80
    _root const uint16 JTAG_signating[]={0xAAAA、0x0002};

    #pragma LOCATION = 0xFF84
    __root const uint16 BSL_signature1 = 0x5555;//禁用 BSL

    #pragma LOCATION = 0xFF86
    __root const uint16 BSL_signature2 = 0x5555;//禁用 BSL

    #pragma LOCATION = 0xFF88
    _root const uint8 JTAG_password[]={0x01、0x09、0x06、0x02}; /1962年

    #pragma vector = Timer1_A1_vector
    _interrupt void T1_A1_ISR (void)

    //此 ISR 的地址将放置在0xFFE0部分的 BSL 密码0x0x0x0xFFFF 处,地址为0x0x0x0xFFFF


    #pragma vector = Timer1_A0_vector
    _interrupt void T1_A0_ISR (void)

    //此 ISR 的地址将放置在0xFFE2部分的 BSL 密码0x0x0x0xFFFF 中的32个字节
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将此 I2C 中断服务函数设置为从 RAM 执行以提高速度、我认为这可能会在引导代码中花费大量时间:

    在我将 DCO 设置为在 main()中以23.8MHz 运行后,是否有另一种方法来影响此副本?

    //注意:这个函数在闪存中被复制到 RAM 并在那里执行
    _ramfunc void service_i2c_int (void)

    (笑声)


    ///----------------------------------------------
    // void USCIB0_ISR -它是什么
    ///----------------------------------------------

    #pragma vector = USCI_B0_vector
    _interrupt void USCIB0_ISR (void)

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

    我将以下代码放置在__low_level_init()中,以便在执行 cstart_init_copy_ramfunc ()之前将时钟限制在28MHz。

    启动时间从6.45ms 改为2.38ms。

    中断服务例程的大小为0xd4字节、以1MHz (4.74ms)执行需要4749个周期、现在需要1.99ms。

    int __low_level_init (void)

    //启动时钟系统最大 DCO 设置、高范围~=23.8mhz
    CSCTL0_H = 0xA5; //解锁寄存器
    CSCTL1 = DCORSEL + DCOFSEL0 + DCOFSEL1;//设置范围和最大值 DCO 设置
    CSCTL2 = SELA_3 + SELS_3 + SELM_3; //设置 ACLK = DCO;SMCLK SOURCE = DCO、MCLK = DCO
    CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; //将所有分频器设置为/1
    CSCTL0_H = 0x01; //锁定寄存器
    return (1);//使 cstart_init_copy_ramfunc 执行