MSP430單片機(jī)常用程序框架
前一段時間一直在用TI公司的MSP430系列的單片機(jī),總結(jié)了點(diǎn)430常用的程序框架。
a.循環(huán)低功耗、中斷服務(wù)程序喚醒
void main()
{
關(guān)閉開門狗;
初始化時鐘;
初始化端口;
初始化屏幕;
其他外圍必要的初始化;
開中斷;
while(1)
{
進(jìn)入低功耗模式;
執(zhí)行某函數(shù);
}
}
中斷函數(shù)1
{
退出低功耗;
中斷服務(wù)程序;
}
例如:
1 #pragma vector=ADC12_VECTOR
2 __interrupt void ADC12ISR (void) //AD轉(zhuǎn)換中斷服務(wù)程序
3 {
4 static unsigned char index = 0;
5 LPM3_EXIT;
6 switch(__even_in_range(ADC12IV,34))
7 {
8 case 0: break; // Vector 0: No interrupt
9 case 2: break; // Vector 2: ADC overflow
10 case 4: break; // Vector 4: ADC timing overflow
11 case 6: // Vector 6: ADC12IFG0
12 if(index < 8)
13 {
14 results[index] = (ADC12MEM0*2.048/4096);
15 index++;
16 }
17 if(8==index) { index=0; }
18 S_judge=1;
19 break;
20 default: break;
21 }
22 }
23
24 void main()
25
26 {
27
28 WDTCTL = WDTPW + WDTHOLD;
29 Init_CLK() ;
30 LCD_Init() ;
31 Clear_LCD(Color_BK);
32 Init_Port() ;
33 Init_RTC();
34
35 _EINT(); //開全局中斷
36
37 Init_ADC();
38 ADC12CTL0 |= ADC12SC; //開始AD轉(zhuǎn)換
39 while(1)
40 {
41 LPM3;
42 Show_Clock();
43 if(S_judge==1)
44 {
45 for(int n=0;n 46 { 47 fsum+=fresults[n]; 48 } 49 m=fsum/Num_of_Results; 50 sprintf(str,"%02.1f",m); 51 PutStringEN24(104,260,str); 52 fsum=0; 53 S_judge=0; 54 ADC12CTL0 |= ADC12SC; 55 56 } 57 } b.低功耗、中斷服務(wù)程序 該種結(jié)構(gòu)比較簡單,與第一種結(jié)構(gòu)的差別在于主程序沒有循環(huán)執(zhí)行某函數(shù)。 void main() { 關(guān)閉開門狗; 初始化時鐘; 初始化端口; 初始化屏幕; 其他外圍必要的初始化; 開全局中斷; 進(jìn)入低功耗; } 中斷服務(wù)程序1 { 退出低功耗; 中斷服務(wù)程序; } c.開機(jī)設(shè)定、低功耗、中斷服務(wù)程序 void main() { 關(guān)閉開門狗; 初始化時鐘; 初始化端口; 初始化屏幕、鍵盤; 初始化其他外圍; 開全局中斷; 鍵盤設(shè)定數(shù)據(jù),開機(jī)初始化; 鍵入低功耗; } { 退出低功耗; 中斷服務(wù)程序; } 比如在第一種模式里加入開機(jī)設(shè)定的部分。 d.菜單按鍵方式 void main() { 關(guān)閉開門狗; 初始化時鐘; 初始化端口; 初始化屏幕、鍵盤; 初始化其他外圍; 開全局中斷; while(1) { 掃描按鍵; switch(鍵值) { case... } 更改顯示; } }
中斷服務(wù)程序1