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.

[参考译文] MSP430F5244:如何通过根据所需的 LPM 电平向 SR 寄存器写入一个值来传输到 LPM。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/980983/msp430f5244-how-to-transfer-to-lpm-by-writing-a-value-according-to-the-desired-lpm-level-to-the-sr-register

器件型号:MSP430F5244

您好!

 

■请求

我想通过根据所需的 LPM 电平向 SR 寄存器写入一个值来传输到 LPM。

 

■查询内容

使用断点并在下面 C 源代码的第77行停止。

之后、当程序重新启动且 SR 寄存器被写入时、PUC 发生。

请告诉我如何解决此错误。

 

(补充说明)

汇编代码中描述的 SR 寄存器的写入指令是一个20位算术指令(BISx.W)。

从下面的说明中可以看出、没有观察到 SR 寄存器的20位写保护约束。

CCS 版本为7.4.0版。

谢谢、

科基

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

    您是否尝试使用此函数:

     _bis_SR_register (LPM3_bits);    //输入 LPM3

    希望它能帮助您:

    /*------------------ *
    /* MSP430/430X 宏*/
    /*------------------ *
    #define __get_interrupt_state ()__get_SR_register ()

    #define __LOW_POWER_MODE_0 ()__bis_SR_register (0x18)
    #define __LOW_POWER_MODE_1 ()__bis_SR_register (0x58)
    #define __LOW_POWER_MODE_2 ()__bis_SR_register (0x98)
    #define __LOW_POWER_MODE_3 ()__bis_SR_register (0xD8)
    #define __LOW_POWER_MODE_4 ()__bis_SR_register (0xf8)
    #define __LOW_POWER_MODE_OFF_ON_EXIT ()__BIC_SR_REGISTER_ON_EXIT (0xF0)

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

    您好!

    感谢您的快速回复。

      

    [问题1]

    在上一个问题中、SR_SET_DATA 是一个无符号短整型16位、但似乎是20位数据

    写入 SR 寄存器。

    请告诉我为什么会发生这种现象。

    另外、请告诉我、当我直接用十六进制写入时、问题为什么会得到解决。

     

    [问题2]

    修改上次描述的代码后、问题不再出现。

    这种校正方法是否有任何问题?

      

    -changes

    修改此值是为了通过一个类型为 USHORT 的静态变量分配给_ bis_SR_register ()。

    连接正确的更改工作组件。

    ===========================================================================================================

    #define SET_LP_MODE (x)_bis_SR_register (x) volatile static USHORT s_U2_SR_tmp_data;

    void LPM_vdSlepAndIntCtrl (void){

      UCHAR U1_lPM_jg;

      DI();                                                                  /* 中断被禁用*/

      U1_lPM_jg = lPM_u1Control ();                            /* LPM 判断*/

      S_U2_SR_tmp_data = SR_SET_DATA[U1_lPM_jg];

      SET_LP_MODE (s_u2_SR_tmp_data);                   /* 中断使能和 LPM 转换*/

      /*修改为通过 USHORT 类型的静态变量写入 SR 并将其传递给宏*/

      返回;

    ===================================================================================================

    谢谢、

    科基

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

    请参阅该 BISx.W 用于16位地址字处理。 使用 BISx.W 的原因是数据保存在20位地址。  我认为这不是您向 SR 写入20位值所导致的。   

    我不确定是否设置 SR、您只能使用 BIS.W 我的建议是:

    使用之前的代码时、在调试模式下读取 SR 的值。 它可以帮助您检查 SR 是否设置正确。

    2.您可以使用小型内存模型设置尝试以前的代码。

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

    [问题1]

    导致前一代码中出现错误的原因是什么?

    [问题2]

    请告诉我、当写入值直接作为值写入时、为什么会解决这个问题。

    [问题3]

    我将说明更改为以下代码并运行此代码。

    结果看起来该代码工作正常。

    此代码是否有问题?

    请查看以防万一。

    ===========================================================================================================

    #define SET_LP_MODE (x)_bis_SR_register (x) volatile static USHORT s_U2_SR_tmp_data;

    void LPM_vdSlepAndIntCtrl (void){

      UCHAR U1_lPM_jg;

      DI();                                                                  /* 中断被禁用*/

      U1_lPM_jg = lPM_u1Control ();                            /* LPM 判断*/

      S_U2_SR_tmp_data = SR_SET_DATA[U1_lPM_jg];

      SET_LP_MODE (s_u2_SR_tmp_data);                   /* 中断使能和 LPM 转换*/

      /*修改为通过 USHORT 类型的静态变量写入 SR 并将其传递给宏*/

      返回;

    ===================================================================================================

    谢谢、

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

    您好!

    你有更新吗?

    谢谢、

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

    关于您的问题1:

    您能帮我做这两个测试吗? 它可以帮助我了解原因。 非常感谢。

    使用之前的代码时、在调试模式下读取 SR 的值。 它可以帮助您检查 SR 是否设置正确。

    2.您可以使用小型内存模型设置尝试以前的代码。

    关于您的问题2:

    您可以使用您的拆分代码检查汇编示例代码、它们是相同的。

    关于您的问题3:

    代码是正确的。

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

    >您可以使用小型内存模型设置尝试以前的代码。

    在前面的代码中、当我在将其设置为"小"后尝试工作时、没有发生错误。 (未发生 PUC)

    下面是生成的汇编语言。

    代码=大、数据=受限(发生 PUC)

    代码=小、数据=小(未发生 PUC)

    请告诉我原因是什么。

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

    感谢你的帮助!

    数据=大意味着编译器将使用大内存大小来保存数据、并且命令将同时更改。

    您可以看到0x05836是20位地址、0xea84是16位地址。

    本实验可帮助您了解路由原因、即您无法使用 BISx.W (20位地址命令)来清除 SR 寄存器。

    对于发生这种情况的原因、MSP430内核如何分析命令、很抱歉我不知道。

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

    >本实验帮助您了解路由原因是您不能使用 BISx.W

    1.是否可以识别由于这次写入 SR 的20位值而发生的错误?

      

    >关于发生这种情况的原因,MSP430内核如何分析命令,很抱歉我不知道。  

    写入 SR 的值被定义为无符号短整型16位数据。

    为什么在使用代码=大且数据=受限设置进行编译时写入20位值?

    如果数据不是按类型定义的大小处理的、我担心其他数据将是可以的。

    请详细说明为什么会发生这种现象以防止再次发生。

     

    谢谢、

    科基  

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

    您好!

    你有更新吗?

    谢谢、

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

    您好、Koki、

    它 不在 SR 中写入20位数据、在 SR 中写入16位数据。

    请参阅 BISx 的说明。  0x05836 是一个地址、而不是数据。

    伊斯天

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

    谢谢你。

     

    总之、BISx 和 BIS 都向 SR 写入16位。

    BISx 出错、BIS 正常工作。

     

    是否禁止使用 BISx 指令写入 SR?

    UG 中有一个黄色框架的描述。

      

    "注意"是否意味着不应使用 BISx?

    如果是、请告诉我原因。

    谢谢、

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

    我认为是的、因为你可以从 UG 中找到解释、所以我认为问题已经解决了。  很抱歉、我也不知道原因。 要知道原因、我想我需要提到设计 MSP430内核的人、实际上、我找不到他。   

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

    感谢您的反馈。

    检查 SYSRSTIV 寄存器后、PUC 的原因是 PMM 密码违规。  

    我需要知道 PUC 发生的原因是 PMM 密码违规。

    您对此有什么假设吗?

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

    我只能向您展示以下内容:

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

    我知道 PUC 是 PMM 密码违规引起的。

    我想知道 当 SR 被 BISx.W 写入时为什么会发生 PMM 密码违规

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

    解释 SYSRSTIV 时必须小心。 它按优先级顺序而不是按发生顺序返回值。 除非您读取它直到它返回零、否则可能会有一个左置位的标志。

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

    >它按优先级顺序而不是按发生顺序返回值。

    当多个中断发生时、SYSRSTIV 是否传递高优先级因子的值?

    即使如此、如附件中所示、"PMM 密码违规"的优先级最低、但保留的优先级除外。

    因此、我认为这次中断是由 PMM 密码违规引起的。

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

    您好 Kiki、

    这是 PMM 密码违规的原因。 但我仍然不知道为什么会发生这种情况。 很抱歉、这超出了我的知识库。  

    伊斯天