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.

[参考译文] MSP430FR4133:程序在 fs_add.asm 或 fs_div.asm 中停止

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1278502/msp430fr4133-program-stopping-in-fs_add-asm-or-fs_div-asm

器件型号:MSP430FR4133
主题中讨论的其他器件:MSP430FR6877

您好!
我尝试在 LPM4模式下使用 MSP4133以实现功耗敏感型操作、为此、我使用的是32.768kHz 的外部晶体振荡器。
所需的功能如下所示。
我的模块中有两个通过 UART 连接的微控制器。
在另一个微控制器(MSP430fr6877)上按下某个按钮时、它会通过 UART 向4133模块发送特定的符号/字符。 4133模块有2个屏幕、1 -总升2 -流速、
接收到该字符后、4133模块应显示第二个屏幕一段时间、然后跳回到默认屏幕、即屏幕1。 但是,当接收到该字符时,第二个屏幕将显示为空白, 并在经过一段时间后返回到默认屏幕。 当我尝试在按下另一个控制器上的按钮后暂停程序时,程序停止进入 fs_add.asm fs_div.asm。
我将所有浮点变量更改为整数、问题仍然存在。

以下是相关代码

//UART 中断

#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (USCI_A1_vector))) USCI_A1_ISR (void)
#else
#错误编译器不受支持!
#endif
{
__ bic_SR_register_on_exit (LPM4_bits);
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE:中止;
案例 USCI_UART_UCRXIFG:
while (!(UCA0IFG&UCTXIFG));
gucrcvChar = UCA0RXBUF;
gucRxBuffer[guiRXIndex]= gucrcvChar;
if (gucrcvChar='*')                        //用于在流速和电流升之间切换的循环。
{
displayflowratebag^=1;
if (displayflowratebag==0)
{
Flowrate Display_Count = 0;
LCDM7 |= 0x00;
LCDM13 = 0x00;
LCDM10 |= 0x00;


///clear_data ();
计数= 1;

// guiRXIndex++;

中断;
USCI_UART_UCTXIFG 情况:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;


//显示环路。

while (1)
{

if ((gulPulseTimeCount >(RefPulseTimeCount * 2))&&((RampFlag=1)||(RPMRampFlag==1))
{
tempFloat = 0;
PtoPFlowrate=0;
RPM_flowrate=0;
TempIndex = 0;
RPM_tempindex=0;
START_TIMER=0;
PtoPstart_timer_flag=0;
avgarr[0]= 0;
avgarr[1]= 0;
avgarr[2]= 0;
avgarr[3]=0;
avgarr[4]=0;

RPMavgarr[0]= 0;
RPMavgarr[1]= 0;
RPMavgarr[2]= 0;
RPMavgarr[3]=0;
RPMavgarr[4]=0;

gulPulseTimeCount = 0;
//pulseofftime = 0;
// RampFlag = 0;
// RPMRampFlag=0;


if (GUC_SetupMode)
{
Setup_Mode ();//设置模式以编辑比例因子

if (gucReset_TT_Flag)
{
GucReset_TT_Flag = 0;
SYSCFG0 &=~PFWP;//将 FRAM 写使能编程
FRAM_GUD_TT_LTR = 0;
SYSCFG0 |= PFWP;//程序 FRAM 受写保护(不可写)
Wait();

if ((Gui_dispParameter=1)&&(guc_SetupMode=0)&&(displayflowratefLAL=1)&&(flowrate Display_Count <=25000))
{
if ((PtoPFlowRate > MIN_flowrate)&&(START_TIMER >= 200))
{
tempFloat=RPM_flowrate;
nop();


否则
{
tempFloat= PtoPFlowRate;

if (count)
{
clear_data();
计数= 0;

Display_FLOW (tempFloat);

if ((Gui_dispParameter=1)&&(guc_SetupMode=0)&&(displayflowratefala==0))
{

Display_TOTAL ((unsigned long int) FRAM_GUD_TT_LTR);

__ bis_SR_register (LPM4_BITS | GIE);  
__ no_operation ();//表示调试器

非常感谢您提供宝贵意见。
此致
Pratik.

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

    Pratik、您好!

     FS_add 和 FS_div 是什么、好像是数学操作代码、是由您还是由库定义?  

    完成案例和代码需要花费我一些时间、我将在本周更新反馈。

    我建议您首先进行一些测试:

    1.第二个屏幕是否可以正常显示? 您可以直接显示它并检查结果。

    2.当使用其他 LP 模式,如 LPM0时,您的代码是否正常工作。

    B.R.

    萨尔

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

    大家好、
    感谢您的回复
    1.是如果 我将第二个屏幕设为默认屏幕、它会正确显示
    2.将会这样做。
    我观察到的一个现象是、如果我通过脉冲发生器向模块提供脉冲(它是流量计操作、因此脉冲用于模拟液体流量)
    屏幕可以进行切换。 只有当模块处于空闲状态时、问题才会出现。 (流计算逻辑包含在定时器中断中)
    这是计时器中断代码片段。

    void __attribute__((interrupt (Timer1_A1_vector)) Timer1_A1_ISR (void)
    {

    //1ms 计时器

    switch (__even_in_range (TA1IV、TA1IV_TAIFG))
    {
    TA1IV_NONE 情况:break;//无中断
    案例 TA1IV_TACCR1:break;// CCR1未使用
    案例 TA1IV_TACCR2:break;// CCR2未使用
    案例 TA1IV_3:break;//保留
    情况 TA1IV_4:break;//保留
    情况 TA1IV_5:break;//保留
    情况 TA1IV_6:break;//保留
    案例 TA1IV_TAIFG://溢出
    guiKeyDeeboung++;

    {
    gulPulseTimeCount++;
    RPM_pulsetime_count++;


    if (displayflowratefLAG)
    {
    流程 Display_Count ++;

    if (流程 Display_Count >15000)
    {
    流程 Display_Count = 0;
    displayflowratefLAG = 0;
    clear_data();
    __ bic_SR_register_on_exit (LPM4_bits);
    计数= 1;


    此致  
    普拉蒂克

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

    FS_xxx 看起来是浮点库的一部分。

    执行不会在这些代码位中停止、因为没有什么东西可以停止执行。 它将停在设置了低功耗模式的点。 然后等待中断发生。 ISR 退出后、不一定会导致恢复正常运行。

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

    将代码粘贴到邮件中会删除格式。 如果没有空格、您的代码就很难遵循、因此我倾向于放弃。

    编辑器的"插入:代码"功能会创建一个可滚动窗口,而不会删除空格。

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

    Pratik,

    我将所有浮点变量改为整数后问题仍然存在。

     当第二个屏幕不显示时、如果不使用浮点光栏、当前代码滞留在何处?

    然后屏幕可以切换。 仅当模块处于空闲状态时才出现问题。

    有脉冲与无脉冲情况下器件的输出有何差异? 也许你可以在这两个条件下检查接收到的数据。

    B.R.

    萨尔