大家好,
我正在处理BSL项目,该项目运行良好,直到我继续实施LPM0并启用通过ISR接收UART字符,而不是在设置RXIFG时读取RX缓冲区。
我的项目将UCA0用于UART,将WDT计时器间隔用于超时。 当它工作时,没有启用中断例程,将查找 IFG2和UCA0RXIFG以 直接从UCA0RXBUF接收。 我实施了LPM0,它改变了接收机制,现在我在 启用 IE2 |= UCA0RXIE后在__interrupt void usart0_rx(void)中接收;它将帮助我 从LPM0唤醒,因为它会产生中断。 在我的初始化序列中,我使用 IE1 &=~WDIE禁用监视程序计时器中断,然后清除监视程序间隔计时器标志。
当我发送.txt文件时,我的UART接收似乎工作正常,并且在接收字符时不使用超时。 但是,当我通过Xmodem传输固件时,程序在我认为的第一个字节就中断,转到 _c_int00_noargs_noexit()。
__interrupt void usart0_rx(void)将收到的字符放入我的Rx_buf环缓冲区中,我使用以下函数从环缓冲区中读取字符。 GetCharTM()中的一个使用超时。
extern "C"
__interrupt void usart0_rx(void)
{
字符;
CH = UCA0RXBUF; //获取我们已阅读的字符
IF (!rx_buf.put (ch))
{
}
否则
{
}
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);
}
int main (int argc,char* argv[])
{....
//串行端口初始化
UCA0CTL1 = UCSSEL1 + UCSSWRST; //**初始化USCI状态机**
IE2 &=~UCA0RXIE; //禁用USI_A0 RX中断
UCA0BR0 = 0x15;//0xAD;//0x11; // 16MHz/5.76万 =//10MHz/9600 = 1041.667 = 0x0411 -> 9600波特的除数
UCA0BR1 = 0x01;//0x00;//0x04; // 277.78 = 0x115 //10MHz/5.76万 = 173.111 = 0x00AD -> 5.76万波特的除数
UCA0MCTL = UCBRS2 + UCBRS0; //调制UCBRSx = 5舍入错误
UCA0CTL1 &=~UCSWRST; //**初始化USCI状态机**
P3SEL || BIT4 + BIT5; // WFP 3.4 ,5 = USI_A0 TXD/RXD
P3SEL || BIT0;
P3DIR &=~BIT0;
//监视器计时器初始化-我们将监视器计时器置于间隔模式
//将WDT+更改为间隔计时器模式,ACLK,时钟/8192间隔
IE1 &=~WTIE; //禁用看门狗计时器中断-我们不使用
IFG1 &=~WDTIFG; //清除看门狗间隔计时器标记
WDTCTL = WDTPW + WDTCNTCL + WDTTMSEL + WDTIS0; //将WDT+更改为间隔计时器模式
//初始化变量
//P3OUT |= 0x08;
IE2 |= UCA0RXIE; //启用USI_A0 RX中断
__bis_sr_register (GIE); //启用全局中断,当前的Rx中断来自Mac和Hso
...
,同时(1)
{
__bis_sr_register(LPM0_bits+GIE);
...
/*从环形缓冲区读取char cmd[256]此处*/
ProcessCommand(cmd);//将命令传递给命令处理器
}
}
作废TimerSpin()
{
静态int timer_tick_count = 2;
static int secCounter = timer_tick_count;
IF((IFG1 & WDTIFG)&&--secCounter )
{
secCounter = timer_tick_count;
IFG1 &=~WDTIFG;
//倒计时任何处于活动状态的时间
IF( getCharTimer!=0) getCharTimer--;
}
return;
}
Int16_t GetChar()
{
字符;
while (!rx_buf.get (ch))
{
TimerSpin();
}
返回通道
;}
Int16_t GetCharTMo (uint16_t TMO)
{
字符;
getCharTimer = TMO;
while (!rx_buf.get (ch))
{
TimerSpin();
IF( getCharTimer ==0)
返回-1;
}
返回ch;
}
注:在LPM0中,我的程序等待接收字符。 一旦接收到字符,它将从低功耗模式唤醒,并在接收中断例程中禁用LPM0,然后在正常模式下等待固件。
暂停调试模式将显示以下堆栈。
我不知道是什么导致我的计划中断。 当我开始通过Xmodem接收时,无法在终端上打印任何内容。 开始发送固件映像时中断。 我认为这与中断有关。 任何调试帮助都将受到欢迎。