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/MSP430FR2633:适用于 FR2633的定制引导加载程序

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430FR5739, MSP430FR2633

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/612592/ccs-msp430fr2633-custom-bootloader-for-fr2633

器件型号:MSP430FR2633
主题中讨论的其他器件:MSP430FR5739

工具/软件:Code Composer Studio

您好!

由于标准引导加载程序不可用、我们将为 FR2633系列实施自定义引导加载程序、在测试期间、由于链接器脚本中的存储器重叠很少、我们使控制器出现故障。 请根据 FR2633存储器映射找到以下更新的链接器脚本、了解已修改(来自 MSP430FR5739)的引导加载程序。 请确认链接器脚本是否正常。 还想知道"boot_shared_callbacks"用于什么? 根据政治计算、它应该为0xFF78。 是将其放置在0xFF70中的一个问题、即在 BSLsignature & JTAGSignature 开始之前未使用接下来的8个字节。

谢谢你

此致、

穆鲁加

引导加载程序链接器文件

/* RAM 内存地址*/
_RAM_Start = 0x2000;                             /* RAM 开始 */
_RAM_END = 0x2FFF;                              /* RAM 结束 */
                                       /*应用程序和引导加载程序之间共享的 RAM,必须保留*/
   passwd = 0x2000;                             /*应用程序发送的强制引导 模式的密码*/
   StatCtrl = 0x2002;                            /*通信 使用的状态和控制字节*/
   CI_State_Machine = 0x2003;                     /* Comm 使用的状态机变量*/
   CI_Callback_PTR = 0x2004;                  /*指向 Comm 回调结构的指针*/
                                       /*用于引导加载程序或应用程序的未保留 RAM */
   _nonreserved_RAM_Start = 0x2006;             /*非保留 RAM */

/*闪存地址*/
_Flash_Start = 0xC400;                         /*闪存开始*/
_Flash_end = 0xFFFF;                             /*闪存结束*
                                       //为引导加载程序区域保留的闪存位置*/
   __Boot_Start = 0xFA00;                        /*启动闪存*/
   __Boot_Reset = 0xFFFE;                        /* Boot reset 向量*/
   __Boot_VectorTable = 0xFF88;                  /*引导矢量表*/
   __Boot_SharedCallbacks_Len = 8;             /*共享回调的长度(2个调用=4B (MSP430)或8B (msp430x)*/
   __Boot_SharedCallbacks = 0xFF70;             /*共享回调开始从 FF80更改为 FF70以避免 JTAG 签名和 BSL 签名的内存重叠*/
                                       /*应用领域的保留闪存位置*/
   _AppChecksum =(__Flash_Start);                //应用程序的 CRC16
   _AppChecksum 8 =(__Flash_Start+2);            //应用程序的 CRC8
   _App_Start =(__Flash_Start+3);                /*应用程序区域*/
   _App_End =(_Boot_Start-1);                   //应用程序区域结束(启动前)*/
   _crc_size =(_App_end -_App_Start +1);        //为 CRC 计算的字节数*
   _App_Reset_Vector =(_Boot_Start-2);          //应用程序复位矢量的地址*
   _App_Proxy_Vector_Start = 0xF988;             /*已更改以容纳更多4个矢量代理中断表*/


/*内存定义,根据上面的定义进行调整*/
存储器

   SFR                    :origin = 0x0000、length = 0x0010
   外设_8位       :origin = 0x0010、length = 0x00F0
   peripherals_16BIT      :origin = 0x0100、length = 0x0100
   //   RAM from _nonreserved_RAM_Start -__RAM_END
   //   Muruga   4K RAM
   RAM                    :origin = 0x2006、length = 0xFFA       
   //   Muruga 512 for 2633
   INFOBOOT               :origin = 0x1800,length = 0x200       
   //   从__Boot_Start 闪存-(__Boot_SharedCallback 或 INT_Vector_table)
   闪存                  :origin = 0xFA00,length = 0x570
   //   由 Muruga 补充
   JTAGSIGNATURE          :origin = 0xFF80,length = 0x0004,fill = 0xFFFF
   BSLSIGNATURE           :origin = 0xFF84,length = 0x0004,fill = 0xFFFF
   //   从__Boot_SharedCallback + Len 共享回调(使用时)
   boot_shared_callback  :origin = 0xFF70,length = 8
   //   从__Boot_VectorTable-__Boot_Reset 启动矢量表
   Int_vector_table       :origin = 0xFF88,length = 0x76
   //   从__Boot_Reset-__Flash_End 复位引导
   复位                  :origin = 0xFFFE,length = 0x0002


/ /
/*指定段分配到内存                             中*/
/ /
部分

   .bss       :{}> RAM               /*全局和静态 VARS             */
   .data      :{}>RAM               /*全局和静态 VARS             */
   .sysmem    :{}> RAM               /*动态内存分配区域   */
   .stack     :{}> RAM (高)        /*软件系统堆栈            */

   .text      :{}>> FLASH |INFOBOOT  /* code                */
   .cinit     :{}>> FLASH |INFOBOOT  /*初始化表*/
   .const     :{}>> FLASH |INFOBOOT  /*常量数据       */
   .cio       :{}> RAM               /* C I/O 缓冲                     器*/

   boot_app_vectors :{}> boot_shared_callback
   /* MSP430中断矢量         */
   boot_vector_table:{}> INT_vector_table
   .reset      :{}              > reset /* MSP430 reset vector        */


/ /
/*包括外设内存映射                                          */
/ /

-l MSP430FR2633.cmd

应用程序引导加载程序

/* RAM 内存地址*/
_RAM_Start = 0x2000;                             /* RAM 开始 */
_RAM_END = 0x2FFF;                              /* RAM 结束 */
   /*应用程序和引导加载程序之间共享的 RAM,必须保留*/
   passwd = 0x2000;                             /*应用程序发送的强制引导 模式的密码*/
   StatCtrl = 0x2002;                            /*通信 使用的状态和控制字节*/
   CI_State_Machine = 0x2003;                     /* Comm 使用的状态机变量*/
   CI_Callback_PTR = 0x2004;                  /*指向 Comm 回调结构的指针*/
   /*用于引导加载程序或应用程序的未保留 RAM */
   _nonreserved_RAM_Start = 0x2006;             /*非保留 RAM */

/*闪存地址*/
_Flash_Start = 0xC400;                         /*闪存开始*/
_Flash_end = 0xFFFF;                             /*闪存结束*
   //为引导加载程序区域保留的闪存位置*/
   __Boot_Start = 0xFA00;                        /*启动闪存*/
   __Boot_Reset = 0xFFFE;                         /* Boot reset 向量*/
   __Boot_VectorTable = 0xFF88;                  /*引导矢量表*/
   __Boot_SharedCallbacks_Len = 8;             /*共享回调的长度(2个调用=4B (MSP430)或8B (msp430x)*/
   __Boot_SharedCallbacks = 0xFF70;             /*开始共享回调*/
   _BOOT_APPVECTOR =__Boot_SharedCallback;      //应用程序表的定义            */
   /*应用领域的保留闪存位置*/
   _AppChecksum =(__Flash_Start);                //应用程序的 CRC16                         
   _AppChecksum 8 =(__Flash_Start+2);            //应用程序的 CRC8                          
   _App_Start =(__Flash_Start+3);                /*应用程序区域                            */
   _App_End =(_Boot_Start-1);                   //应用程序区域结束(启动前)       */
   _crc_size =(_App_end -_App_Start +1);        //为 CRC 计算的字节数          *
   _App_Reset_Vector =(_Boot_Start-2);          // FA00 -2 =应用程序复位矢量的 F9FE 地址*/
   _App_Proxy_Vector_Start = 0xF988;             /*已更改以容纳更多4个矢量代理中断表*/

/*内存定义,根据上面的定义进行调整*/
存储器

   SFR                    :origin = 0x0000、length = 0x0010
   外设_8位       :origin = 0x0010、length = 0x00F0
   peripherals_16BIT      :origin = 0x0100、length = 0x0100
   // RAM from _nonreserved_RAM_Start -__RAM_END
   // 4K RAM
   RAM                    :origin = 0x2006、length = 0xFFA
   //对于 FR2633为512字节
   INFOA                  :origin = 0x1800,length = 0x200
   //从_App_Start 闪存->(app_proxy_vectors-1)
   // 378D 更改为357D。 根据计算、0x5FE (1534字节)被分配给引导扇区
   //减小闪存大小以容纳额外的中断矢量
   FRAM                     :origin = 0xC403、length = 0x357D
   //   已添加
   JTAGSIGNATURE         :origin = 0xFF80,length = 0x0004,fill = 0xFFFF
   BSLSIGNATURE          :origin = 0xFF84,length = 0x0004,fill = 0xFFFF
   //从 _App_Proxy_Vector_Start->(reset-1)中删除了中断代理表
   INT00                 :origin = 0xF988、length = 0x0002
   INT01                 :origin = 0xF98A,length = 0x0002
   INT02                 :origin = 0xF98C、length = 0x0002
   INT03                 :origin = 0xF98E,length = 0x0002
   INT04                 :origin = 0xF990,length = 0x0002
   INT05                 :origin = 0xF992、length = 0x0002
   INT06                 :origin = 0xF994、length = 0x0002
   INT07                 :origin = 0xF996,length = 0x0002
   INT08                 :origin = 0xF998、length = 0x0002
   INT09                 :origin = 0xF99A、length = 0x0002
   INT10                 :origin = 0xF99C、length = 0x0002
   INT11                 :origin = 0xF99E、length = 0x0002
   INT12                 :origin = 0xF9A0,length = 0x0002
   INT13                 :origin = 0xF9A2,length = 0x0002
   INT14                 :origin = 0xF9A4,length = 0x0002
   INT15                 :origin = 0xF9A6,length = 0x0002
   Int16                 :origin = 0xF9A8、length = 0x0002
   INT17                 :origin = 0xF9AA、length = 0x0002
   INT18                 :origin = 0xF9AC,length = 0x0002
   INT19                 :origin = 0xF9AE,length = 0x0002
   INT20                 :origin = 0xF9B0,length = 0x0002
   INT21                 :origin = 0xF9B2、length = 0x0002
   INT22                 :origin = 0xF9B4,length = 0x0002
   INT23                 :origin = 0xF9B6、length = 0x0002
   INT24                 :origin = 0xF9B8、length = 0x0002
   INT25                 :origin = 0xF9BA,length = 0x0002
   INT26                 :origin = 0xF9BC,length = 0x0002
   INT27                 :origin = 0xF9BE,length = 0x0002
   INT28                 :origin = 0xF9C0,length = 0x0002
   INT29                 :origin = 0xF9C2、length = 0x0002
   INT30                 :origin = 0xF9C4,length = 0x0002
   INT31                 :origin = 0xF9C6、length = 0x0002
   Int32                 :origin = 0xF9C8,length = 0x0002
   INT33                 :origin = 0xF9CA,length = 0x0002
   INT34                 :origin = 0xF9CC,length = 0x0002
   INT35                 :origin = 0xF9CE、length = 0x0002
   INT36                 :origin = 0xF9D0,length = 0x0002
   INT37                 :origin = 0xF9D2、length = 0x0002
   INT38                 :origin = 0xF9D4,length = 0x0002
   INT39                 :origin = 0xF9D6、length = 0x0002
   INT40                 :origin = 0xFBD8、length = 0x0002         //   Captivate
   INT41                 :origin = 0xFBDA,length = 0x0002         //   p2
   INT42                 :origin = 0xFBDC,length = 0x0002         //   P1
   INT43                 :origin = 0xFBDE,length = 0x0002         //   ADC
   INT44                 :origin = 0xFBE0、length = 0x0002         //   USCI_B0
   INT45                 :origin = 0xFBE2,length = 0x0002         //   USCI_A1
   INT46                 :origin = 0xFBE4,length = 0x0002         //   USCI_A0
   INT47                 :origin = 0xFBE6、length = 0x0002         //   WDT
   INT48                 :origin = 0xFBE8、length = 0x0002         //   RTC
   INT49                 :origin = 0xFBEA,length = 0x0002         //   TIMER3_A1
   INT50                 :origin = 0xFBEC,length = 0x0002         //   TIMER3_A0
   INT51                 :origin = 0xFBEE,length = 0x0002         //   TIMER2_A1
   INT52                 :origin = 0xFBF0,length = 0x0002         //   TIMER2_A0
   INT53                 :origin = 0xFBF2、length = 0x0002         //   Timer1_A1
   INT54                 :origin = 0xFBF4,length = 0x0002         //   Timer1_A0
   INT55                 :origin = 0xFBF6、length = 0x0002         //   TIMER0_A1
   INT56                 :origin = 0xFBF8,length = 0x0002         //   TIMER0_A0
   INT57                 :origin = 0xFBFA,length = 0x0002         //   USNMI
   INT58                 :origin = 0xFBFC,length = 0x0002         //   SYSNMI
   //从_App_Reset_Vector 复位应用程序
   复位                  :origin = 0xF9FE,length = 0x0002


/ /
/*指定段分配到内存                             中*/
/ /

部分

 组(all_FRAM)
   {
      组(READ_WRITE_MEMORY)
      {
         .TI.persistent:{}/*               for #pragma PERSISTENT           */
      }

      组(只读_存储器)
      {
         .cinit     :{}                  /*初始化表            */
         .pinit     :{}                  /* C++构造函数表           */
         binit     :{}                  /*启动时初始化表  */
         init_array:{}                  /* C++构造函数表           */
         .mspabi.exidx:{}                /* C++构造函数表           */
         .mspabi.extab:{}                /* C++构造函数表           */
         .const     :{}                  /*常量数据                    */
      }

      GROUP (可执行文件存储器)
      {
         .text      :{}                  /*代码                             */
      }
   }> FRAM

#ifdef __TI_Compiler_version__
 #if __TI_Compiler_version__>=15009000
   #ifndef __large_data_model__
   .TI.ramfunc:{} load=FRAM、run=RAM、table (BINIT)
   其他
   .TI.ramfunc:{} load=FRAM | FRAM2、run=RAM、table (BINIT)
   #endif
 #endif
#endif

   .jtagsignature:{}> JTAGSIGNATURE/*  JTAG Signature                   */
   bslsignature :{}> BSLSIGNATURE   /* BSL Signature                    */


   .bss       :{}> RAM               /*全局和静态变量             */
   .data      :{}>RAM               /*全局和静态变量             */
   .TI.noinit :{}>RAM               /* for #pragma noinit               */
   .cio       :{}> RAM               /* C I/O 缓冲                     器*/
   .sysmem    :{}> RAM               /*动态内存分配区域   */
   .stack     :{}> RAM (高)        /*软件系统堆栈            */

   infoA    :{}>INFOA             /* MSP430 INFO FRAM 内存段*/

      /* MSP430中断矢量         */
   .int00      :{}>int00               
   .int01      :{}>INT01               
   .int02      :{}>INT02               
   .int03      :{}>INT03               
   .int04      :{}>INT04               
   .int05      :{}>INT05               
   .int06      :{}>INT06               
   .int07      :{}>INT07               
   .int08      :{}>INT08               
   .int09      :{}>INT09               
   .int10      :{}>int10               
   .int11      :{}>int11               
   .int12      :{}>int12               
   .int13      :{}>int13               
   .int14      :{}>int14               
   .int15      :{}>INT15               
   .int16      :{}>int16               
   .int17      :{}>INT17               
   .int18      :{}>INT18               
   .int19      :{}>INT19               
   .int20      :{}>INT20               
   .int21      :{}>INT21               
   .int22      :{}>INT22               
   .int23      :{}>INT23               
   .int24      :{}>INT24               
   .int25      :{}>INT25               
   .int26      :{}>INT26               
   .int27      :{}>INT27               
   .int28      :{}>INT28               
   .int29      :{}>INT29               
   .int30      :{}>int30               
   .int31      :{}>int31               
   .int32      :{}>int32               
   .int33      :{}>int33               
   .int34      :{}>int34               
   .int35      :{}              > int35
   .int36      :{}>int36               
   .int37      :{}>INT37               
   .int38      :{}>INT38               
   .int39      :{}>INT39               
   CapTIvate   :{*(.int40 )}> INT40 type = VECT_init
   端口2       :{*(.int41 )}> INT41类型= VECT_INIT
   端口1       :{*(.int42 )}> INT42类型= VECT_INIT
   ADC         :{*(.int43 )}> INT43 TYPE = VECT_INIT
   USCI_B0     :{*(.int44 )}> INT44 TYPE = VECT_INIT
   USCI_A1     :{*(.int45)}> INT45 type = VECT_init
   USCI_A0     :{*(.int46)}> INT46 TYPE = VECT_INIT
   WDT         :{*(.int47 )}> INT47 TYPE = VECT_INIT
   RTC         :{*(.int48 )}> INT48 type = VECT_INIT
   TIMER3_A1   :{*(.int49 )}> INT49 TYPE = VECT_INIT
   TIMER3_A0   :{*(.int50 )}> INT50 TYPE = VECT_INIT
   TIMER2_A1   :{*(.int51 )}> INT51 type = VECT_INIT
   TIMER2_A0   :{*(.int52)}> INT52 type = VECT_INIT
   Timer1_A1   :{*(.int53)}> INT53 type = VECT_init
   Timer1_A0   :{*(.int54)}> INT54 type = VECT_init
   TIMER0_A1   :{*(.int55 )}> INT55 TYPE = VECT_INIT
   TIMER0_A0   :{*(.int56 )}> INT56 TYPE = VECT_INIT
   UNMI        :{*(.int57 )}> INT57 TYPE = VECT_INIT
   SYSNMI      :{*(.int58 )}> INT58 TYPE = VECT_INIT
   重置      :{}>              重置
   /* MSP430复位矢量                */


/ /
/*包括外设内存映射                                          */
/ /

-l MSP430FR2633.cmd

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

    MSP430FR2633上已经有一个支持 UART 和 I2C 接口的引导加载程序、除非默认 ROM 版本不能满足您的需求、否则您不应使用自定义主存储器引导加载程序。 然后、您应遵循 MSP430FRBoot 示例作为指南。 linkerGen 实用程序能够生成满足您需求的必要链接器文件。 如果您计划将总线用于 UART 通信和 BSL 命令、则需要进行回调、但在签名之前放置回调时没有任何问题、且中间有空格。

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

    我们确实尝试使用 LinkerGen 来生成链接器脚本,这就是我们欺骗控制器的方法,基本上,在分析链接器脚本时缺少 JTAGSIGNATURE、BSLSIGNATURE 的内存分配。 因此、我们将生成的并组合链接器脚本作为自定义脚本。 我们想知道它是否被正确修改。 我们已根据生成的参数验证了所有参数。 我们需要对以下参数进行澄清。 由于这一修改是为了适应 JTAGSignature 和 BSLSignature、下面的行是 MSP430FR2633的正确行。 如果 FR2633的长度为4或8、

    __Boot_SharedCallbacks_Len = 8; /*共享回调的长度(2个调用=4B (MSP430)或8B (msp430x)*/
    __Boot_SharedCallbacks = 0xFF70; /*开始共享回调*/

    我们无法使用内置 BSL、因为我们在 RS485上进行 OTA、因此需要更多地控制 UART 驱动程序。 我们很高兴能够共享当前的 BSL 固件、以便修改驱动程序中所需的参数。

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

    我已经解释过、回调长度取决于您为共享通信外设初始化的回调数量、而您尚未共享这些回调数量。 但是、由于您似乎只将外设用于 BSL、而不是与 UART 通信一起使用、因此这不是问题。 此外、如果使用4或8则无关紧要、因为在0xFF80和中间为空空间之前不会出现签名。 您将需要进一步调试系统并提供有关器件如何被欺骗的更多详细信息。 ROM BSL 无法修改、不由 TI 提供。

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

    感谢您的参与。

    对定制 BSL 的阐述很少

    我们指的是文档 SLAU610C、根据文档 UART BSL 命令是
    标头(1字节)长度(2字节) BSL 内核命令(1字节)校验和(2字节)

    TI 提供的适用于 BSL 的示例 MSPBoot 固件- MSPBoot_1_01_00_00与上述命令格式不匹配、具体取决于长度、引导加载程序固件中的长度设置为1。 MSP430BSL_1_00_12_00与文档中描述的命令格式相匹配。 我们已将 MSPBoot_1_01_00_00配置为 BSL、所有内核命令都匹配。

    混淆了、如果我们需要使用 Win_Scripter 应用程序进行固件更新、我们是否应该使用 MSP430BSL_1_00_12_00文件。

    由于有限的限制、我们正在努力获取主存储器引导加载程序。

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

    我的错误是、SLAU610C 参考错误。 请参见 SLAA600b。 能够从引导加载程序获取所有仿真命令的响应。

    测试 Erase 函数时、应解决一些问题。

    谢谢你

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

    我假设您将引用 MSP430FR2633的 SLAA721 (MSP430FRBoot)资源、但会声明命令数据包长度为1。 MSP430BSL_1_00_12_00是具有 F5xx/F6xx/G2xx 闪存 BSL 源/映像的定制 BSL430封装、与 MSP (FR) Boot 不相关。 BSL 脚本编写器用于工厂 ROM BSL 通信、因此您应该在 MSP430FRBoot 代码包随附的主机示例上为您的定制编程器解决方案建模。

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

    已解决所有错误、并能够使用 TI-TXT 解析器将 TI_TXT 文件合并为一个文件、并使用示例应用(LED 闪烁)对其进行测试

    我们在实际应用13k 时也尝试了相同的方法、但它不起作用。 我们怀疑中断矢量、因为应用程序使用的是所有中断、而示例应用程序没有任何中断、我们主要使用 captate 来实现所有功能。 我们正在向示例应用程序添加中断例程以进行确认;您认为这会有所帮助。

    此致、
    穆鲁加
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到您通过简单的闪烁 LED 程序取得了进展。 在通过主存储器引导加载程序进行编程后、您应该读出存储器内容、以确认所有应用代码、包括中断和复位矢量都已正确存储。

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

    我们进行了调试、发现问题与中断或中断矢量定义有关。 定义根据引导加载程序和应用程序的示例代码进行。

    观察结果是、一旦启用第一个中断、控制器就会挂起。 因为我们无法调试、所以 UART 上的打印内容如下所示。 如果在启用中断后移动了 print 语句、则不会进行打印。 还在中断例程中添加了一个未打印的打印。

    请告诉我们如何解决此问题。

    定时器配置
    TA2CTL |= TASSEL_SMCLK; // SMCLK
    sendTestText ("已配置和启动计时器");
    TA2CTL |= MC_UP|TAIE;

    中断例程
    TA2CTL &=~(TAIE); //禁用计时器中断
    sendTestText ("输入的定时器中断");
    COUNTER++;

    此致、
    穆鲁加
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查0xFFEE (TA2IFG 中断向量)是否被转换为 C 文件的应用程序以及在引导加载后加载了正确的中断地址。 此问题可能与主机编程器有关。 您是否已将此应用程序作为独立程序进行了测试? 我不确定 UART 打印机将在主存储器引导加载程序中工作。

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

    该应用程序作为独立程序进行了广泛测试。

    应用程序中断向量不应指向链接器文件中定义的代理中断向量位置。 作为示例引导加载程序应用程序_1、使用的中断矢量是代理位置、引导加载程序使用实际的中断矢量。 应用不应同时指向标准矢量表、因为它在架构中是硬接线的。 在这种情况下,定义代理矢量表的目的是什么。
    目前、具有修改后的链接器的应用程序中断指向代理中断矢量、猜猜是因为它中断不起作用、而是挂起。

    您能不能告诉我们我们可以纠正这一问题。 我们按照提供的应用程序和引导加载程序进行操作。

    我们还想知道、解决此问题后、是否有可以为其他用户上传文件的位置。

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

    代理中断向量的理念是 MSPBoot 的命名规则项、实际上并未使用、这将在 MSP430FRBoot 的未来版本中修复。 闪存擦除的最小大小是一个段、在 MSP430微控制器中为512字节。 考虑到这一点、整个中断表受到保护、不会被擦除。 为了在应用程序级别允许中断、实施了软件矢量重定向方法来修复默认矢量表的内容并指向驻留在应用程序空间中的代理表。

    FRAM 没有最小擦除大小的限制、因此可以在 FRAM 器件中重新编程所有中断、而不会有擦除复位矢量的风险。 FR5xx/6xx 器件使用 MPU 来保护引导加载程序区域(在重新编程中断矢量时禁用)、但 MSP430FR2xx/4xx 上不提供此功能。 相反、您必须在复制中断表之前关闭 SYSCFG0的 PFWP 位(并在之后重新启用)、因为您已经成功创建了引导加载程序应用程序减去了中断、所以应该具有的代码。 这应该在 TI_MSPBoot_MI_FRAM 文件的 TI_MSPBoot_MI_WriteByteDirect 函数中完成。

    此致、
    Ryan