您好!
我在论坛上找不到有关此主题的其他主题、因此我想制作一个主题。 我目前正在使用 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(){ }