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.

[参考译文] MSP430F1611:软件在可下载应用程序与不可下载应用程序中生成的 Port1中断

Guru**** 2030840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1180019/msp430f1611-software-generated-port1-interrupt-in-downloadable-application-vs-non-downloadable-application

器件型号:MSP430F1611

您好!

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矢量。

    谢谢你。

    最恰当的考虑。