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.

[参考译文] MSP430FR2311:[自定义 BSL]在 MSP430FR 问题中映射代理中断矢量表

Guru**** 2551820 points
Other Parts Discussed in Thread: MSP430FR2311, CC1200

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/592033/msp430fr2311-custom-bsl-mapping-proxy-interrupt-vector-table-in-msp430fr-issue

器件型号:MSP430FR2311
主题中讨论的其他器件: CC1200

您好!

(这是我第一次尝试 MSP430)我现在使用 IAR 6.5将定制 BSL 从 slaa600移植到 MSP430FR2311。 我已经完成了 BSL、但在 APP2中、尝试将"实际"中断表(0xFF80~0xFFFF)映射到代理中断表时遇到问题。 我已经搜索了一些有关定制 BSL 的线程、但没有太多信息。  

在 G 模型中、我发现可以像这样完成映射

extern __interrupt void P1_ISR (void);
extern __interrupt void Dummy_ISR (void);

# ifdef __IAR_systems_ICC_#
pragma location="app_proxy_vectors"
__root const uint16_t ProxyVectorTable[]=
# Elif defined (__TI_Compiler_version__)
# pragma DATA_SECTION (ProxyVectorTable、".app_proxy_vectors")
# pragma RETAIN (ProxyVectorTable)
const uint16_t ProxyVectorTable[]=
# endif
{
0x4030、(uint16_t) P1_ISR、 // app_proxy_vector (0) P1
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (1) p2.
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (2) ADC10
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (3) USCI SPI TX
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (4) USCI SPI RX
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (5) TA0_1
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (6) T0_0
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (7) WDT
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (8) COMP_A
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (9) TA1_1
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (10) TA1_0
0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (11) NMI
0x4030、(uint16_t)虚拟 ISR、
0x4030、(uint16_t)虚拟 ISR、
0x4030、(uint16_t)虚拟 ISR、
};

但在 FR 模型中、它显示了

//
////常量表
//
//* FR5xx 不需要代理表*/ 

问题1:如果 FR 模型中没有可用的代码、为什么 G 模型和 FR 模型存在差异、那么代理矢量表如何映射到中断表?  

我尝试将 G 模型复制到 FR 以使其正常工作(如上所述)、但失败了。 并显示了大量误差

ERROR[Pa128]:在常量表达式中截断转换...
# ifdef __IAR_systems_ICC_#
pragma location="app_proxy_vectors"
__root const uint32_t ProxyVectorTable[]=
# Elif defined (__TI_Compiler_version__)
# pragma DATA_SECTION (ProxyVectorTable、".app_proxy_vectors")
# pragma RETAIN (ProxyVectorTable)
const UINT32_t ProxyVectorTable[]=
# endif
{
0x4030、(uint32_t) P1_ISR、 // app_proxy_vector (0) P1...

我从 uint16_t 更改为 uint32_t、错误消失了、 但是、当按下端口1上的按钮时、它不会跳转到中断功能、它显示当我按下位于地址0x10000处的停止按钮时会发生一些情况、该地址超出存储器大小(FR2311的最大值为0xFFFF)。 因此、我认为映射是错误的、因此它无法跳转到正确的矢量。  

问题2:为什么使用 G 模型时 可以使用 uint16_t、但在 FR2311中显示错误? 由于我需要将其更改为 uint32_t、因此我的代理中断表变得非常大、浪费了 FRAM (FR2311只有3.75kB FRAM)    

正如我在存储器映射中看到的、0xFF88~0xFFFF 中的实际中断矢量表、这意味着有120个字节、但大多数字节未使用、msp430fr2311.h 中只定义了15个中断矢量

#define ECOMP0_vector (45 * 2U)/* 0xFFE2 */
#define port2_vector (46 * 2U)/* 0xFFE4 */
#define Port1_vector (47 * 2U)/* 0xFFE6 */
#define ADC_Vector (48 * 2U)/* 0xFFE8 */
#define EUSCI_B0_Vector (49 * 2U)/* 0xFFEA */
#define EUSCI_A0_Vector (50 * 2U)/* 0xFFEC */
#define WDT_Vector (51 * 2U)/* 0xFFEE */
#define RTC_Vector (52 * 2U)/* 0xFFF0 */
#define Timer1_B1_vector (53 * 2U)/* 0xFFF2 */
#define Timer1_B0_vector (54 * 2U)/* 0xFFF4 */
#define TIMER0_B1_Vector (55 * 2U)/* 0xFFF6 */
#define TIMER0_B0_Vector (56 * 2U)/* 0xFFF8 */
#define UNMI_Vector (57 * 2U)/* 0xFFFA */
#define SYSNMI_Vector (58 * 2U)/* 0xFFFC */
#define RESET_Vector (59 * 2U)/* 0xFFFE */ 
下面是我的 APP2链接器文件: 
//应用程序校验和地址 -D_Appl_Checksum =_flash_start -D_appl_Checksum;8=(_flash_start+2) //应用程序起始地址(校验和之后) D-Appl_Start=(_flash_start+3)//F100+3=F103 //应用程序结束地址 -D_appl_end=(_boot_Start-1)//F388-1=F387 //应用程序复位矢量 -D_appl_Reset_Vector=(_appl_end-1) //代理矢量表的起始地址 -D_appl_Proxy_Vector_Start=(_appl_Reset_Vector-30) //代理矢量表的结束地址 -D_App_Proxy_Vector_End=(_Appl_Reset_Vector-1) //由 CRC 计算的面积大小(App+ProxyTable) -D_CRC_SIZE =(_appl_end-_appl_Start+1) -Z (const) app_proxy_vectors=_appl_Proxy_Vector_Start-_App_Proxy_Vector_End -Z (code) intvec=_appl_Proxy_Vector_Start-_Appl_End -Z (code) reset_Appl_Reset_Reset_End-Appl_Reset_Reset_Appl_End-Appl_Reset_End-Appl_Reset

问题3:那么、我是否可以在应用程序的代理矢量表中仅使用30个字节来保存内存? 如果没有 、请建议代理矢量表的大小以使用上述所有中断 (如果我想使用)、以及为什么?

问题4:我看到在"自定义 ISR 结构"中、将文件"interrupt proxy.asm"直接添加到 IAR 工程中、是否可以像这样添加汇编.asm 文件?(编译器理解? 或者必须设置任何配置? )。 我尝试添加它、链接器似乎不知道在哪里调用#include "msp430fr2311.h"  

问题5:如何将代理中断表映射到 IAR 中的实际中断表?

谢谢你

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

    您好!

    请参阅我在以下 E2E 主题上的回答:

    虽然 MSP430FRBoot 没有针对 MSP430FR2311的确切示例、但它更适用于您尝试实现的目标。 请首先阅读 MSP430FRBoot 应用报告、该报告解释了 FRAM 器件不需要代理中断矢量表的原因。 这也将为您节省代码大小。

    但是、由于 MSP430FR2311只有3.5K 的 FRAM、因此它不是使用位于主存储器中的引导加载程序的最佳选择。 除非您的应用的尺寸小于1.5k、否则我怀疑您是否能够同时安装在 FR2311中。 您是否了解过使用已驻留在器件中的 UART BSL? 虽然这不能被定制、因为它驻留在 ROM 上、但是它可被用于对部件进行编程、而无需任何额外的代码开销。 下面是对 FR2311的 BSL 用户指南的类似介绍: 《MSP430FR4xx 和 MSP430FR2xx 引导加载程序(BSL)用户指南》(修订版 C)

    此致、

    Caleb Overbay

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

    您好、已计算

    感谢您的回复、

    我已经在 FR2311上完成了我的定制 BSL、现在开发应用程序了。 是的、现在的 Booloader 只有2.3kB、我的应用程序小于1.2kB、因此、到目前为止、我对大小没有任何问题。 我理解您的疑问、自从项目开始以来、许多 FAE 都告诉我这是不可能的、但由于我们已经安装了闪存、应用程序非常简单(只需闪烁 LED、蜂鸣器和 ADC 以检查电池状态)。 选择 FR2311时、我们会估算代码大小、因为 ROM BSL 没有 OTA 函数、我需要更新 FW 无线(OTA)函数(将其与 CC1200配合使用)、因此我们选择定制 BSL。 现在、custome BSL 的 OTA 运行良好。 唯一的问题是应用程序(我现在仍有1.2kB 应用程序)。

    我在 修改定制 BSL 之前多次读取 MSP430FRBoot (www.ti.com/.../slaa721a.pdf)、并研究示例代码、 但是、如果不将中断函数与 FRAM 中的矢量表映射、我无法解释在应用中如何调用中断函数(本手册仅介绍了代理表在闪存中的工作方式、而不解释其在 FRAM 中的工作方式、而在这里、我提到了"可以对中断进行重新编程")。

    MSP430FRBoot 专为包括 MSP430FR5994在内的 FRAM 器件而制作、不需要为中断提供代理矢量表。 
    这意味着没有矢量重定向、中断处理几乎与典型应用中的相同。 使用它作为起点
    解决您当前遇到的中断问题。
    所有中断都可以在
    FRAM 器件中重新编程、而不会有擦除复位矢量的风险 

    假设以上所有陈述都是正确的、那么它是如何工作的? 如何重新编程中断表? 我不需要在链接器文件中添加代理表、也不需要在源代码中进行声明、只需声明即可  

    _interrupt P1_ist (void)
    {
    我的代码...
    } 

    它将在发生中断事件时自动跳转到该中断功能? 我尝试了这种方法、但没有工作。

    请帮助您详细解释上述陈述(以及问题1、对我来说很重要)并提供一些代码供参考; 我不知道在哪里可以提出此问题。 非常感谢。


    BR、

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

    问题1:如果 FR 模型中没有可用的代码、为什么 G 模型和 FR 模型存在差异、那么代理矢量表如何映射到中断表?
    答:区别在于 G 模型为闪存、FR 模型为 FRAM。 闪存存储器分为多个段、而一个段是可被擦除的最小闪存容量。 MSP430上通常为512字节。 MSPBoot 代码与默认中断矢量表位于同一闪存段中。 因此、如果向您的应用程序添加了新的中断、MSPBoot 将面临自行删除的风险。 因此、默认中断矢量表映射到不在同一段中的代理中断矢量表。

    FRAM 不需要分段、可以将其视为 RAM。 每个单独的 FRAM 单元可在不影响其周围单元的情况下擦除和编程。 这意味着默认矢量表已足够、无需映射到代理中断矢量表。

    这里的所有魔法都在链接器文件中完成。 我假设自从您开始使用 MSPBoot 以来、您的链接器文件包含代理中断矢量表。 此链接器文件不是默认文件、已根据 MSPBoot 的需要进行修改。 查看 MSP430FRBoot 的链接器文件之一、了解默认中断矢量位置如何仍然保持不变。 您可以使用 MSP430FRBoot 中包含的链接器生成 Perl 脚本为 FR2311创建合适的链接器文件。 请记住、MSPBoot 和 MSP430FRBoot 之间的一些命名规则不同、因此您的项目很可能不会立即编译。

    此致、
    Caleb Overbay