您好!
■请求
我想通过根据所需的 LPM 电平向 SR 寄存器写入一个值来传输到 LPM。
■查询内容
使用断点并在下面 C 源代码的第77行停止。
之后、当程序重新启动且 SR 寄存器被写入时、PUC 发生。
请告诉我如何解决此错误。
(补充说明)
汇编代码中描述的 SR 寄存器的写入指令是一个20位算术指令(BISx.W)。
从下面的说明中可以看出、没有观察到 SR 寄存器的20位写保护约束。
CCS 版本为7.4.0版。
谢谢、
科基
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.
您好!
■请求
我想通过根据所需的 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 并将其传递给宏*/
返回;
}
===================================================================================================
谢谢、
科基
[问题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 并将其传递给宏*/
返回;
}
===================================================================================================
谢谢、
>本实验帮助您了解路由原因是您不能使用 BISx.W
1.是否可以识别由于这次写入 SR 的20位值而发生的错误?
>关于发生这种情况的原因,MSP430内核如何分析命令,很抱歉我不知道。
写入 SR 的值被定义为无符号短整型16位数据。
为什么在使用代码=大且数据=受限设置进行编译时写入20位值?
如果数据不是按类型定义的大小处理的、我担心其他数据将是可以的。
请详细说明为什么会发生这种现象以防止再次发生。
谢谢、
科基