MSP430低功耗模式-while循环失效
如下代碼實現MSP430G2553單片機兩個led交替閃爍
#include <msp430.h>
/*** main.c*/
int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timerP1DIR|=BIT0+BIT6;P1OUT|=BIT0;while(1){unsigned int i;i=50000;while(i--);P1OUT^=BIT0+BIT6;}
}
發現燈光顯示異常兩燈常亮。
為什么呢?在老師幫助下了解了是因為Msp430這款板子默認的低功耗模式導致了cpu不干預而使這種while(i--)的空循環失效。
MSP430G2553單片機有6種功耗模式如下:
1、活動模式-----AM
正常的工作模式,這時CPU消耗的電能最大.
2、低功耗模式0-----LPM0
CPUOff置位,CPU停止活動,但外圍模塊繼續工作,ACLK和MCLK信號保持活動,MCLK的鎖頻壞控制正常工作.有關控制位設置為:SCG0=0,SCG1=0,OscOff=0,CPUOff=1。
3、低功耗模式1-----LPM1
CPUOff置位,CPU停止活動,但外圍模塊繼續工作,MCLK的鎖頻環控制停止工作,ACLK與MCLK保持活動,有關控制位設置為:SCG0=0,SCG1=1,OscOff=0,CPUOff=1。
4、低功耗模式2-----LPM2
CPUOff置位,CPU停止活動,但外圍模塊繼續工作,MCLK的鎖頻環控制停止,ACLK活動,MCLK停止,有關控制位設置為:SCG0=0,SCG1=1,OscOff=0,CPUOff=1。
5、低功耗模式3-----LPM3
CPUOff置位,CPU停止活動,但外圍模塊繼續工作,MCLK的鎖頻環控制和MCLK停止工作,DCO的DC發生器關閉,但ACLK信號仍保持活動,有關控制位設置為:SCG0=1,SCG1=1,OscOff=0,CPUOff=1。
6、低功耗模式4-----LPM4
CPUOff置位,CPU停止活動,但外圍模塊繼續工作,MCLK的鎖頻環控制和MCLK停止工作,晶振停止,有關控制位設置為:SCG0=x,SCG1=x,OscOff=1,CPUOff=1。
處理器進入低功耗模式以后,一般由中斷來喚醒。可以是外部中斷,也可以是內部的定時器等中斷。
而具體到上述問題從TI網站上查到相應的資料:翻譯后如下
MSP430提供各種類型的定時器和時鐘,可配置為無需CPU干預即可運行。當需要延遲時,可以利用其中一個定時器外設來產生這種延遲,而CPU不會保持活動狀態。該方法顯著降低了設備的功耗。這些定時器可使MSP430微控制器保持低功耗模式,直到定時器喚醒CPU。
風險,嚴重程度
在微控制器中,CPU是整體功耗的最大貢獻者。當應用程序執行延遲時,如果CPU保持活動模式,則會浪費大量的功率和能量。
為什么會這樣
當在項目中的任何代碼文件中發現延遲時,將發出此注釋。
檢查代碼中是否包含僅包含以下任一行的循環,而不包含任何其他代碼:
?__no_operation();
?_NOP();
任何空循環。例如:
?volatile int i = MAX_VALUE;
?而(i--> 0);
?出現這種情況://上述問題所在
?__delay_cycles(NUMBER_OF_CYCLES);
補救
利用其中一種MSP430低功耗模式,并使用MSP430器件中的一個定時器模塊在一段時間后喚醒。
代碼示例
?// ********* ******************************
?// MSP430G2xx3演示 - ?Timer_A,切換P1.0,CCR0續。模式ISR,DCO SMCLK
?//
?//描述:使用軟件和TA_0 ISR切換P1.0。切換每一個
?// 50000個SMCLK周期。 SMCLK為TACLK提供時鐘源。
?//在TA_0 ISR期間,切換P1.0并添加50000個時鐘周期
?// CCR0每50000個周期觸發TA_0 ISR。 CPU通常是關閉的
?//僅在TA_ISR期間使用。
?// ACLK = n / a,MCLK = SMCLK = TACLK =默認DCO
?//
?// MSP430G2xx3
?// ---------------
?// / | \ | XIN | ?-?
?// | | |
?// ?- ?| RST XOUT | ?-?
?// | |
?// | P1.0 | ?- > LED
?//
?// D. Dang
?#include <msp430g2553.h>
?void main(void)
?{
???WDTCTL = WDTPW + WDTHOLD; //停止WDT
???P1DIR | = 0x01; // P1.0輸出
???CCTL0 = CCIE; //啟用CCR0中斷
???CCR0 = 50000;
???TACTL = TASSEL_2 + MC_2; // SMCLK,contmode
?
???_BIS_SR(LPM0_bits + GIE); //輸入LPM0 w / interrupt
?}
?
?//定時器A0中斷服務程序
?#pragma vector = TIMER0_A0_VECTOR
?__interrupt void Timer_A(void)
?{
???P1OUT ^ = 0x01; //切換P1.0
???CCR0 + = 50000; //將偏移添加到CCR0
?}
具體代碼現在搞不太懂,但是大體上兩種解決方法,第一用delay函數實現用時鐘定時,第二個就是用中斷進入其他的例如AM退出低功耗模式,然后就可以調用cpu來實現循環。
應該是這樣,現在第一次學真的搞不來這些代碼,只能這樣了。
?
總結
以上是生活随笔為你收集整理的MSP430低功耗模式-while循环失效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA求是否为闰年,for-while
- 下一篇: POJ-1041 John's trip