给位工程师:
你们好,最近研究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的中断程序跳转有问题。