您好!
我在论坛上找不到有关此主题的其他主题、因此我想制作一个主题。 我目前正在使用 RAM 外的 I2C 开发一种自更新机制。 我需要从 RAM 运行此代码、以便在正在运行的目标上接收并刷写完整的 TI-TXT 固件映像。 作为参考、我将使用 MSP430-GCC 编译器。
到目前为止、我已经能够将此代码下载到器件上、将其自身加载到 RAM 中并开始从 RAM 中执行。 但是、当我尝试向器件发送 I2C 时、会出现问题。 由于某种原因、我的 I2C ISR 未被正确调用。 我已经介绍了用户指南的许多章节、我发现一件有趣的事情是通过 SYSRIVECT 使用基于 RAM 的中断矢量。 也许这是在 RAM 之外运行 ISR 所必需的? 如果能帮助您了解为何 ISR 未被正确调用、将会很好、总之、我们也欢迎您提出建议。
我已经包含了我要跳转到的代码。 在执行此操作之前、我将此"更新程序"代码编程到主闪存的某个部分、然后将 SP 和 PC 设置为跳转。
#include
define str (s)#s
#define ENQUOTE (s) str
(s)#define DO_pragma (x)_Pragma (#x)
#define location (var_name、address) DO_pragma (location (var_name、address)
)#define attribute_section (x)__attribute ((((((section (x)))))
)#define RAM_base 0x1c00
#define RAM_END 0x1ffe
#define BEGIN_RAM_execution()\
asm ("mov #"ENQUOTE (RAM_END)"、R1");\
asm ("br #"ENQUOTE (RAM_base))
#define CODE_BASE 0x8000
#define MAIN_CODE_OFFSET 0x0400
#define BEGIN_ROM_execution () asm ("br #0x8400")
#define I2C_INT_vector 0xxee
#define SCL (1 << 7)
#define SDA (1 << 6)
#define MCU_IRQ (1 << 4)
#define XT1_LF_MODE (LFXTDRIVE_0 + 0x0100)
#endif //defined (__MSP430FR58471__)
寄存器 unsigned int i2c_byte asm ("R4");
寄存器 unsigned int i2c_temp asm ("R5")
;
*在 main 中定义 unsigned intrasc / unsigned inu_mspu 地址("r10)*需要检查#gmspc / unsigned inu_entr/ unsigned inu_mspu
0x1
#define GSC_stage2_ADDR 0x2
#define GSC_stage2_erase 0x3
#define GSC_stage2_word 0x4
#define GSC_stage2_PROG 0x5
void attribute_section (".text")__attribute__((优化("OS"))) main (void){
//*将您的自身从主 ROM 复制到 RAM */
asm ("mov #2、R5"); //存储编号2
asm ("mov #main_entry, r7"); //存储 main_entrance 位置
asm ("mov #the_end、R8"); //存储 the_end 位置
asm ("mov #"ENQUOTE (RAM_base)"、R9");//存储 RAM_base 位置
asm ("memcpy:"); // memcpy 标签(复制循环从此处开始)
asm ("mov @r7、0 (R9)"); //将闪存内容移动到 RAM
asm ("add r5、r7"); //将闪存指针递增2
asm ("添加 R5、R9"); //将 RAM 指针递增2
asm ("cmp r7、r8"); //检查我们是否已到达_end 位置
asm ("jne memcpy"); //如果不是,重复循环
//将 I2C 中断矢量地址写出到矢量表(0xcee)*/
asm ("mov #main_entry, r7"); //存储 main_entrance 位置
asm ("mov #i2c_isr、R8"); //存储 i2c_ISR 位置
asm ("subr7、r8"); //从 i2c_isr addr 中减去 main_entrance addr、R8具有偏移
asm ("添加#"ENQUOTE (RAM_base)"、R8"); //添加 RAM_base 的值以获取 i2c_ISR
asm 的新位置("mov #"ENQUOTE (I2C_INT_vector)"、R9");//存储 i2c 中断矢量
asm 的位置("mov R8、0 (R9)"); //将 I2C ISR 地址写出到矢量表
//跳转到 RAM 并执行*/
begin_RAM_execution();
asm ("main_entration:");
while (1);//循环此处,以便 I2C ISR 具有返回
到}
void attribute_section (".text")__attribute__(优化("O0");//循环,这样 I2C ISR (void
= 021E_)(void _switch)(void = 0x1e_)、iv_i_range (in)(void 0c)(void _isr_)(void 0c)(in_isr
情况0x06: //向量6:STTIFG (启动条件)
(笑声) //此处的其余 UCB0IFG 案例
默认值:
break;
}
}
void attribute_section(".text") the _end(){
}