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.
给位工程师:
你们好,最近研究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;");//串口中断重定义 }
#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(); }
主要是想了解中断的重定义,比如我在boot文件中怎么跳转到app的中断函数,app的中断函数中是不是需要pop哪些东西出来。我的boot程序里面未用到中断,未开启中断,只是定义了中断服务函数,这个中断服务函数是为了服务app中中断服务程序先跳转到boot的中断函数,之后通过br 指令跳转到app的中断函数,现在就是卡在了这个跳转过程。
我从编译器的汇编窗口看到我生成txt文档貌似缺少一个压栈的过程。那个0x81A2那个地方直接就是串口接收中断服务程序的入口,这样从boot跳转过来缺少压栈的过程,是不是这个导致问题的出现。
@8100 31 40 00 0A B0 12 0C 81 B0 12 B0 81 B2 40 80 5A 20 01 F2 C0 80 00 57 00 E2 C3 02 00 7E 43 01 3C 7E 53 5E 93 FD 2F E2 B3 02 00 F6 2F F2 D0 88 00 58 00 B0 12 6C 81 5E 42 2A 00 F2 43 2A 00 C2 43 29 00 3F 40 FE 08 3D 40 3D 00 3F 53 3D 63 FD 2F F2 43 29 00 3F 40 FE 08 3D 40 3D 00 3F 53 3D 63 FD 2F C2 43 29 00 32 D0 10 00 FD 3F F2 D0 30 00 1B 00 F2 D0 C0 00 04 00 F2 D0 10 00 70 00 F2 D0 10 00 71 00 F2 40 03 00 74 00 C2 43 75 00 F2 40 4A 00 73 00 D2 C3 70 00 F2 D0 40 00 00 00 32 D2 30 41 0E 12 5E 42 76 00 F2 E3 29 00 3E 41 00 13 30 40 B4 81 30 40 B8 81 FF 3F @FFF2 A2 81 @FFFE 00 81 q
您好,您可以先看下应用手册,里面有说明怎样管理interrupt table,应用手册中使用jump table,如下表,然后工作的:
在boot中,通过array元素的地址填充硬件中的中断矢量表,如下图: