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.

MSP430F5310搭配CC2500实现无线升级问题

Other Parts Discussed in Thread: CC2500, MSP430F5310

目前在做的一个项目是使用MSP430F5310驱动CC2500实现MSP430F5310的程序升级。

首先简单划分了下Flash区域,0x8000-0xA7FF共10K为bootloader所用,0xA800-0xFF7F共约22K为user_app所用。两块程序的中断向量地址都为

-Z(CODE)INTVEC=FF80-FFFF
-Z(CODE)RESET=FFFE-FFFF

(之前有试过从网上找到的MSP430的升级案例,他们的处理方式是将中断bootloader的中断向量进行偏移,user_app仍使用默认的地址,但是采用此方式在msp430f5310上不成功)。

目前采用动态确定中断入口地址的方法,即将中断向量地址放入约定好的RAM中,如下
__no_init void (*intvec[23])() @ 0x2400; //定义指向函数指针的数组,用于映射新的中断向量
//重新映射中断向量地址
#pragma vector=USCI_A0_VECTOR //
__interrupt void USCI_A0_VECTOR_ISR(void)
{
asm("push R15");
asm("mov #0x243C,R15");
asm("call @R15");
asm("pop R15");
}
然后在应用程序中进行中断向量的映射,如
intvec[15] = USCI_A0_Isr;// 串口中断

bootloader和user_app在中断这部分处理是完全相同的。

bootloader和user_app的xcl文件部分配置为:

bootloader:

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-33FF
-Z(DATA)CODE_I
-Z(DATA)CSTACK+_STACK_SIZE#

-Z(CONST)INFO=1800-19FF
-Z(CONST)INFOA=1980-19FF
-Z(CONST)INFOB=1900-197F
-Z(CONST)INFOC=1880-18FF
-Z(CONST)INFOD=1800-187F

-Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=8000-A7FF

-Z(CODE)CSTART,ISR_CODE,CODE_ID=8000-A7FF
-P(CODE)CODE=8000-A7FF

-Z(CODE)INTVEC=FF80-FFFF
-Z(CODE)RESET=FFFE-FFFF

user_app:

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-33FF
-Z(DATA)CODE_I
-Z(DATA)CSTACK+_STACK_SIZE#

-Z(CONST)INFO=1800-19FF
-Z(CONST)INFOA=1980-19FF
-Z(CONST)INFOB=1900-197F
-Z(CONST)INFOC=1880-18FF
-Z(CONST)INFOD=1800-187F

-Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=A800-FF7F

-Z(CODE)CSTART,ISR_CODE,CODE_ID=A800-FF7F
-P(CODE)CODE=A800-FF7F

-Z(CODE)INTVEC=FF80-FFFF
-Z(CODE)RESET=FFFE-FFFF

 现在遇到以下几个问题:

1. 因bootloader程序占RAM空间较大,所以不想采用bootloader和user_app共同占用6k的RAM空间。所以该如何处理才能实现从bootloader跳转至user_app中时,会初始化user_app中的RAM而清除bootloader占用的RAM。从bootloader中采用汇编指令直接跳转到user_app的__program_start位置可以吗?

2. 跳转时可以采用MOV &0xB130, PC (0xB130是我这边的__program_start地址)或者br &0xB130这样的指令吗?

3. 现在的中断处理函数是调用普通的函数处理中断事件,不是真正的中断处理函数,好像无法使用LPM3_EXIT只有的指令,编译器会报错,这个该怎么处理?

谢谢帮我解答问题或者给点提示!