主题中讨论的其他器件: 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 中的实际中断表?
谢谢你
