2012-8-2
经过反复试验发现一个困惑已久的问题:之前总以为不开 GIE 中断或者 RXIE 中断,
RXBUF 中是不能接收数据的,但现在看来似乎 RXBUF 能不能接收数据与 MSP430 的中断
打开与否没有直接关系。在接收时,只要 START 信号发送出去,RXBUF 中就会接收到想
要的数据。看来中断在此时的功能只不过是要不要让 CPU 去读 RXBUF 中的数。
UCB0CTL1 = UCSSEL_2 + UCTXSTT;
while (UCB0CTL1 & UCTXSTT);
UCB0CTL1 |= UCTXSTP;
UCB0IE = UCRXIE;
__bis_SR_register(LPM0_bits + GIE);
__no_operation();
以上 6 行指令,当执行完第一条时,RXBUF 中就会有数(设为 A),当执行第三条时 ,
RXBUF 中的数立刻更新为下一个要读取的数(设为 B),暂时不知道这是为什么。不知是
否跟一再强调的只读取一个数据时要注意的问题有关。
最 新 发 现 , 当 单 步 执 行 时 , 会 出 现 上 述 问 题 , 但 如 果 全 速 运 行 至
__bis_SR_register(LPM0_bits + GIE);则此时 RXBUF 中的数据依然是第一个(A),而不会
变为下一个(B)。
现在的问题是,读取完后,中断程序不能成功退出,总是跑飞。
2012-8-2
分
对 SAF7113 的调试部分成功!可以顺利写入、回读、并一一比对相符。之前回读无法
退出中断是因为在中断函数最后错误地使用了__bic_SR_register(LPM0_bits);实际应该是用_
_bic_SR_register_on_exit(LPM0_bits);该语句专门用于从中断函数返回时将 CPU 的 SR 寄存
器的某些位清零。但是为什么在中断中使用 __bic_SR_register(LPM0_bits)就会导致无法退
出中断暂时还不明白。
PS:之前一直以为 MSP430 的 5 种低功耗模式(LPM0~LPM4)中 LPM0 是功耗最低的,
但现在发现其实 LPM4 才是功耗最低的,纠正一下,以后学习还是不要想当然。
另外,MSP430 还有 LPM5 模式。在该模式下内核电压 Vcore 被关闭,所有的模块也被
关闭,可通过上电或者 RST/NMI 事件唤醒。
关于
__bic_SR_register_on_exit( )
与
__bic_SR_register ( )
的异同点: