给位工程师:
你们好,最近研究msp430f149的iap,目前是调试阶段,已经写好简单的boot文件和app文件,在boot文件中也加入了中断跳转的指令。如果app文件中没有中断,程序可以执行,一旦app程序中打开串口接收中断,串口发送指令后程序就跑停了。在boot程序中也将串口中断向量重定义了。
#include "io430.h"
#include "flash.h"
void USART_Init(void);
void main( void )
{
char i=0;
WDTCTL = WDTPW + WDTHOLD;
flash_init();
USART_Init();
while(1)
{
while (IFG1 & URXIFG0)
{
rec[i]=RXBUF0;
i++;
if(i==count)
{
i=0;
flash_write(rec);
asm(" br &0x8100;");//接收到升级程序后跳转
}
}
}
}
void USART_Init(void)
{
P3SEL |= BIT4+BIT5; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 使能USART0收发
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // 初始化UART0状态机
IE1 |= URXIE0; // 使能接收中断
// _EINT();
}
#pragma vector=USART0RX_VECTOR
__interrupt void USART0RX_ISR(void)
{
asm(" br &0x81A2;");//串口中断重定义
}上面是b#include "msp430x14x.h"
#define CPU_F ((double)8000000) //精确延时
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
void USART_Init(void);
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (char z = 0xFF; z > 0; z--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
USART_Init();
P2DIR|=0XFF;
P2OUT=0X00;
delay_ms(2000);
P2OUT=0Xff;
delay_ms(2000);
P2OUT=0X00;
while(1)
{
LPM0;
}
}
#pragma vector=USART0RX_VECTOR
__interrupt void USART0RX_ISR(void)
{
char r;
r=RXBUF0;
P2OUT^=0xFF;
}
void USART_Init(void)
{
P3SEL |= 0x30; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 使能USART0收发
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // 初始化UART0状态机
IE1 |= URXIE0; // 使能接收中断
_EINT();
}
oot程序,下面是app程序,麻烦帮忙看下,是不是app的中断程序跳转有问题。


