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.
您好!
IM 我的应用程序、使用 USART1接收来自其他 控制单元的命令、一旦接收到地址、就会触发计时器、计时器过期时、会发出软件生成的 Port1中断来解释内容
这是 USART1 RX 中断例程
#pragma LOCATION ="Vector_UART1"
#pragma vector=UART1RX_vector
_interrupt void RX_VMU_byte (void)
{
IF (URCTL1 & URXWIE)
{
IF (RXBUF1 = BMS_ID)
{
URCTL1 &=~URXWIE;//地址和数据
VMU_Frame_Rcv_Counter = VMUmdTimerStrt; =>开始计时器!!!!!!!!!!!!!!!!
VMU_Rec_Num = 0;
}
}
其他
{
VMURS485Buf[VMU_Rec_Num]= RXBUF1;
if (VMU_Rec_Num < MAX_SIZE)
{
VMU_Rec_Num++;
}
}
}
这是计时器中断
#pragma LOCATION ="Vector_TimerB"
#pragma vector=TIMERB0_vector
_interrupt void Timer_B (void)
{
#ifdef EnableVMURS485Com
if (VMU_Frame_Rcv_Counter!=定时器停止)
{
IF (((VMU_Frame_Rcv_Counter > 0)&&(VMU_Rec_Num <(MaxVMUMulWrtCmdByte-1))))
{
VMU_Frame_Rcv_Counter --;
}
其他
{
SET_BRUSA_CHGR_COM (); // P1IFG |= BIT1 =>生成 Port1软件中断!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
VMU_Frame_Rcv_Counter =定时器停止;
}
#endif
}
这是 Port1中断
#pragma LOCATION ="Vector_Port1"
#pragma vector=Port1_vector
_interrupt void BRUS_CHGR_100ms_timer (void)
{
U8结果;
IF (P1IFG 和 BIT1)
{
VMU_Frame_Rcv_Counter =定时器停止;
CLR_BRUSA_CHGR_COM ();
_EINT();//允许短整型:1. Timer_B 内部和2。 RX_Byte 3。 VMU_RX_Byte
结果= VMU_FRM_analysis();
if (结果==MulRd)
{
Reply_MULRD_CMD (VMURS485Buf[1]、VMURS485Buf[2]、VMURS485Buf[4]);
VMU_TIMEOUT_Counter = 0;
}
否则、如果(结果= MulWrt)
{
Reply_MULWRT_CMD (VMURS485Buf[1]、VMURS485Buf[2]、VMURS485Buf[5]);
VMU_TIMEOUT_Counter = 0;
}
其他
{
;
}
}
URCTL1 |= URXWIE;
}
很好地编译和链接应用程序、并使用生成的 TXT 文件进行测试、一切都很好、很棒。
但是、当我将应用程序转换为可下载的版本时、使用闪存中的引导加载 程序下载应用程序、软件生成的 Port1中断机制将不再起作用。
不产生端口1中断。
实际上、如果我将解释移动到可下载代码中的计时器、则它将再次起作用。
这很奇怪。
最恰当的考虑。
尊敬的 Kevin:
您使用什么 IDE?
引导加载程序是由您自己开发的? 您是否测试过它是否起作用?
顺便说一下、您可以仔细检查存储器以查看固件是否已正确下载到闪存中。
您好、Gary、
IDE 是 IAR。 引导加载程序由我自己创建。 应用程序下载良好。 它经过测试。
最恰当的考虑。
您好、Gary、
下载完成后会进行 CRC 校验。
最恰当的考虑。
这里有两个问题:
1.您是否尝试通过 JTAG 下载应用程序?它是否起作用?
2.应用程序代码 无法触发 Port1中断,以便其它函数正常工作? 执行代码的剂量?
您好、Gary、
不可下载的版本通过 JTAG 加载、并且运行良好。 我是说端口1触发中断正常。
可下载版本无法 触发 Port1中断。 我将解析器从 Port1 ISR 移至计时器 ISR 模块、它按预期工作。
代码的其他部分也起作用、例如收集电池数据等。 请记住、Port1中断通过软件触发在计时器 ISR 中标记。
最恰当的考虑。
由于 Port1是位于0xFFE8的 INT04、您能否帮助检查该地址的值是多少?
请检查映射文件以查找 Port1 ISR 起始地址的位置。
您好、Gary、
在矢量地址0xFFE8处、该值为00E0
在 mapfile 中,Port1起始地址为 E000 - E061
最恰当的考虑
尊敬的 Kevin:
我需要 Port1的入口地址、如下所示:Port_2入口地址是 C6D2
您好、Gary、
最恰当的考虑。
您好、Gary、
注意事项。
您好、Gary、
您提醒我检查我的引导加载程序,我发现了问题。 我未将 E000放置到端口2矢量地址、而不是端口1矢量。
谢谢你。
最恰当的考虑。