TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F149: msp430f149蓝牙升级

Part Number:MSP430F149

给位工程师:

      你们好,最近研究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 characterUTCTL0 |= SSEL0;// UCLK = ACLKUBR00 = 0x03;// 32k/9600 - 3.41UBR10 = 0x00;//UMCTL0 = 0x4A;// ModulationUCTL0 &= ~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 characterUTCTL0 |= SSEL0;// UCLK = ACLKUBR00 = 0x03;// 32k/9600 - 3.41UBR10 = 0x00;//UMCTL0 = 0x4A;// ModulationUCTL0 &= ~SWRST;// 初始化UART0状态机IE1 |= URXIE0;// 使能接收中断_EINT();
}

oot程序,下面是app程序,麻烦帮忙看下,是不是app的中断程序跳转有问题。

Cherry Zhou:

您好我们已收到您的问题并升级到英文论坛,因感恩节假期,预计答复您的时间将稍晚。敬请谅解!

,

lei ji:

好的。谢谢您

,

Cherry Zhou:

您好,我们建议您最好不要在boot项目中使用interrupt,除了复位向量中断(reset vector interrupt)。 您可以参考以下文档:

https://www.ti.com/lit/an/slaa600d/slaa600d.pdf?ts=1638015344315&ref_url=https%253A%252F%252Fwww.ti.com%252Ftool%252FMSPBSL%253FkeyMatch%253D%2526tisearch%253Dsearch-everything%2526usecase%253Dsoftware&_ticdt=MTYzODE2NTU2NHwwMTdiNTI0MWM1NjAwMDE5M2MzMWJjYWViMDk2MDMwNzMwMDE4MDZiMDA4NmV8R0ExLjIuOTY1NDEyNTUzLjE2MzE3NTg5NDk

,

lei ji:

主要是想了解中断的重定义,比如我在boot文件中怎么跳转到app的中断函数,app的中断函数中是不是需要pop哪些东西出来。我的boot程序里面未用到中断,未开启中断,只是定义了中断服务函数,这个中断服务函数是为了服务app中中断服务程序先跳转到boot的中断函数,之后通过br 指令跳转到app的中断函数,现在就是卡在了这个跳转过程。

,

lei ji:

我从编译器的汇编窗口看到我生成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 81q

,

lei ji:

,

Cherry Zhou:

您好,您可以先看下应用手册,里面有说明怎样管理interrupt table,应用手册中使用jump table,如下表,然后工作的:

在boot中,通过array元素的地址填充硬件中的中断矢量表,如下图:

,

lei ji:

我先试试看

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F149: msp430f149蓝牙升级
分享到: 更多 (0)