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.

[参考译文] MSP430AFE253:带有主存储器引导加载程序(MSPBoot)的中断矢量表

Guru**** 2511985 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/933119/msp430afe253-interrupt-vector-table-with-main-memory-bootloader-mspboot

器件型号:MSP430AFE253
主题中讨论的其他器件:MSP430F5529

您好!

我目前正在基于 MSPBOOT_2_00_00_01开发定制的主存储器引导加载程序。 我修改了 MSP430F5529的示例代码、引导加载程序本身工作正常。 但是、中断矢量表写入似乎不正确。 据我所知、中断矢量表(对于 AFE253、为0xFFE0 - 0xFFFF)应填充代理矢量、该矢量指向应用程序存储器中的位置、而应用程序的"中断矢量"又驻留在该位置。 我还修改了引导加载程序向量的链接器文件(使用 IAR):

-Z (code) intvec=_flash_vectors_start-_flash_end
-Z (const) boot_vector_table=_flash_vectors_start-_flash_end
-Z (code) reset=_flash_reset_vector-_flash_end 

其中 _flash_vectors_start = 0xFFE0。 在引导加载程序代码中有一个名为 TI_MSPBoot_VecRed_Boot.c 的文件

/********* //*
使用 MSP430F5529的 MSPBoot 引导加载程序的矢量重定向文件*/*
使用 MSPBootVecRedGen.pl 在2017年8月1日生成的文件*/*/*---
//


//// include 文件
//
#include 
#include "msp430afe253.h"
#include "TI_MSPBoot_Common.h"
#include "TI_MSPBoot_AppMgr.h"

////
链接器文件中的外部变量
//
extern uint16_t _App_Proxy_Vector_Start[];//代理表地址*//


宏和定义
//
//////未使用的矢量
#define (0xBFFF)
/*! 用于计算应用程序代理表中向量地址的宏*/
#define APP_PROXY 向量(x) ((uint16_t)&_App_Proxy_Vector_Start[x*2])

//
//常量表
//
//! MSPBoot 矢量表:它是固定的、因为它不能被擦除和修改。
*指向应用程序区域中的代理矢量表*/
#pragma location="boot_vector_table"
const uint16_t Vector_Table[]=
{
0x1234、//app_proxy_vector (0)、 // FFE0 =未知
APP_PROXY 矢量(1)、 // FFE2 =端口2
APP_PROXY 矢量(2)、 // FFE4 =未知
APP_PROXY 矢量(3)、 // FFE6 =未知
APP_PROXY 矢量(4)、 // FFE8 =端口1
APP_PROXY 矢量(5)、 // FFEA = Timer0_A1、Timer0_A2
APP_PROXY 矢量(6)、 // FFEC = Timer0_A0
APP_PROXY 矢量(7)、 // FFEE =未知
APP_PROXY 矢量(8)、 // FFF0 = USART0发送
APP_PROXY 矢量(9)、 // FFF2 = USART0接收
app_proxy_vector (10)、 // FFF4 =看门狗
APP_PROXY 矢量(11)、 // FFF6 =未知
APP_PROXY 矢量(12)、 // FFF8 = SD24_A
APP_PROXY 矢量(13)、 // FFFA =未知
APP_PROXY 矢量(14)、 // FFFC = NMI
}; 

因此、当我调试引导加载程序时、我希望我的器件在   boot_vector_table (shold 为0xFFE0)放置一个变量 Vector_Table、并以0x1234的值开始。 但是、似乎根本没有放置该表或放置在错误的位置、因为当查看0xFFE0处的存储器时、只有0xFFFF 直到最终放置复位矢量。 您能给我一些提示吗?

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

    你(们)好

    有许多解决方案可以处理中断矢量。 MSPBOOT_2_00_00_01中提到的解决方案的说明 。 它使用放置在应用程序代码中的数组来包含 ISR 的起始地址、如下所示

    原始代码中的0x4030是一个 BRA #dst (或 MOV #dst、PC)指令、后跟16位目的地址。

    您可以看到中断发生的时间将进入 app_proxy_vector (x)、这意味 着((uint16_t)&& appl_Proxy_Vector_Start[x*2])并且 _appl_Proxy_Proxy_Vector_Start 是在名为 ProxyVectorTable 的应用程序代码中定义的数组。

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

    感谢 Gary 指出这一点。。。 实际上、我确实破坏了我的代理表、CPU 执行了错误的代码、但我只是在检查您的代码时才意识到。