標題:
MSP430單片機BasicTimer定時器通用程序庫
[打印本頁]
作者:
51hei單片
時間:
2016-3-14 19:58
標題:
MSP430單片機BasicTimer定時器通用程序庫
本程序是《MSP430系列單片機系統(tǒng)工程設計與實踐》書里面的源碼,(包含工程文件 (例3.1.6))完整例程下載:
http://www.torrancerestoration.com/bbs/dpj-46245-1.html
關于本程序的詳細解說大家可以點擊上圖下載電子書
/*
MSP430F4XX系列BasicTimer定時器通用程序庫
說明:該程序庫包含了BasiTimer(基礎定時器)常用的功能,如設置溢出頻率、
休眠延時等,可以作為各種程序的底層驅動使用。
要使用該庫函數(shù),需要將本文件(BasiTimer.c)添加進工程,并在
需要調用顯示函數(shù)的文件開頭處包含"BasiTimer.h"
(C)西安電子科技大學 測控技術與儀器教研中心 編寫:謝楷 2008/02/02
*/
//
//
// MSP430F4XX
// +---------------+
// | |
// | XOUT|-----
// | | 32.768KHz Watch Crystal
// | XIN|-----
// | |
// +---------------+
#include "msp430x42x.h" /*單片機寄存器頭文件*/
char BT_Flag=0;
/****************************************************************************
* 名 稱:BT_Init()
* 功 能:對BasicTimer進行初始化設置
* 入口參數(shù):Div_Sec: 定時器每秒產生中斷次數(shù)。
* 出口參數(shù):無
* 說 明: 如需使用后面的函數(shù),在主循環(huán)之前必須先調用該初始化函數(shù)
****************************************************************************/
char BT_Init(int Div_Sec)
{
switch(Div_Sec)
{
case 20: BTCTL = BTDIV+BT_fCLK2_DIV256;break; // 2s BT Int
case 1: BTCTL = BTDIV+BT_fCLK2_DIV128;break; // 1s BT Int
case 2: BTCTL = BTDIV+BT_fCLK2_DIV64;break; // 1/2s BT Int
case 4: BTCTL = BTDIV+BT_fCLK2_DIV32;break; // 1/4s BT Int
case 8: BTCTL = BTDIV+BT_fCLK2_DIV16;break; // 1/8s BT Int
case 16: BTCTL = BTDIV+BT_fCLK2_DIV8;break; // 1/16s BT Int
case 32: BTCTL = BTDIV+BT_fCLK2_DIV4;break; // 1/32s BT Int
case 64: BTCTL = BTDIV+BT_fCLK2_DIV2;break; // 1/64s BT Int
case 128:BTCTL = BT_fCLK2_DIV256;break; // 1/128s BT Int
case 256:BTCTL = BT_fCLK2_DIV128;break; // 1/256s BT Int
case 512:BTCTL = BT_fCLK2_DIV64;break; // 1/512s BT Int
case 1024:BTCTL = BT_fCLK2_DIV32;break; // 1/1024s BT Int
case 2048:BTCTL = BT_fCLK2_DIV16;break; // 1/2048s BT Int
case 4096:BTCTL = BT_fCLK2_DIV8;break; // 1/4096s BT Int
case 8192:BTCTL = BT_fCLK2_DIV4;break; // 1/8192s BT Int
case 16384:BTCTL =BT_fCLK2_DIV2;break; // 1/16384s BT Int
default : return(0);
}
IE2 |= BTIE; // Enable Basic Timer interrupt
_EINT();
return(1);
}
/****************************************************************************
* 名 稱:Cpu_SleepDelay()
* 功 能:靠CPU休眠實現(xiàn)延遲。
* 入口參數(shù):BT_Time: BasicTimer中斷次數(shù)
* 出口參數(shù):無
* 說 明: 需要設置BasicTimer定時器,并開啟中斷。該延遲函數(shù)極省電
****************************************************************************/
void Cpu_SleepDelay(int BT_Time)
{
for(;BT_Time>0;BT_Time--)
{
BT_Flag=0;
while(BT_Flag==0) LPM3; //只有BT中斷才能喚醒CPU
BT_Flag=0;
}
}
/****************************************************************************
* 名 稱:Cpu_SleepWaitBT()
* 功 能:CPU休眠,等待BT中斷喚醒。
* 入口參數(shù):無
* 出口參數(shù):無
* 說 明: 需要設置BasicTimer定時器,并開啟中斷。該函數(shù)極省電
****************************************************************************/
void Cpu_SleepWaitBT()
{
BT_Flag=0;
while(BT_Flag==0) LPM3; //只有BT中斷才能喚醒CPU
BT_Flag=0;
}
/****************************************************************************
* 名 稱:BT_ISR()
* 功 能:定時喚醒CPU。
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
#pragma vector = BASICTIMER_VECTOR
__interrupt void BT_ISR(void) // 1/Div_Sec 秒一次中斷(由BasicTimer所產生)
{
BT_Flag=1;
/*
在這里寫中斷服務程序,如掃描鍵盤、實時鐘走時等。
*/
__low_power_mode_off_on_exit(); //喚醒CPU
}
復制代碼
main.c上面程序的調用方法:
#include <msp430x42x.h>
#include "BasicTimer.h"
#define LED1_ON P1OUT |= BIT1
#define LED1_OFF P1OUT &=~ BIT1
unsigned char LED1_Status=0;
/********************************************************************
* 名 稱:LED1_SetStatus()
* 功 能:設置LDE1的狀態(tài)
* 入口參數(shù): 0:滅 1:亮 2:慢閃 3:快閃
* 出口參數(shù):無
********************************************************************/
void LED1_SetStatus (unsigned char Status)
{
LED1_Status= Status;
}
/********************************************************************
* 名 稱:LED1_Process()
* 功 能:LED1處理任務
* 入口參數(shù):Ticks: 該函數(shù)每秒被調用的次數(shù)。
* 出口參數(shù):無
* 說 明: 該函數(shù)需要被周期性地調用。可放于主循環(huán)或定時中斷內
********************************************************************/
void LED1_Process (Ticks)
{
static unsigned int LED1_TimerS;
static unsigned int LED1_TimerF;
LED1_TimerS++; if(LED1_TimerS >= Ticks ) LED1_TimerS=0;
LED1_TimerF++; if(LED1_TimerF >= Ticks/4) LED1_TimerF=0;
switch(LED1_Status)
{
case 0: LED1_OFF; break;
case 1: LED1_ON; break;
case 2: if(LED1_TimerS >= Ticks/2) LED1_ON;
else LED1_OFF;
break;
case 3: if(LED1_TimerF >= Ticks/8) LED1_ON;
else LED1_OFF;
break;
}
}
void main( void )
{
unsigned int Timer=0;
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
FLL_CTL0 |= XCAP18PF; // 配置晶振負載電容
P1DIR |= BIT1 + BIT3 + BIT4; // 三個LED所在IO口設為輸出
P1OUT =0; // 全滅
BT_Init(16); // BasicTimer設為1/16秒中斷一次
while(1)
{
Cpu_SleepWaitBT(); //休眠,等待BT喚醒,以下代碼1/16秒執(zhí)行一次
LED1_Process (16); //LED1狀態(tài)處理任務
Timer++;
if(Timer==80) LED1_SetStatus(0); //滅5秒
if(Timer==160) LED1_SetStatus(1); //亮5秒
if(Timer==240) LED1_SetStatus(2); //慢閃5秒
if(Timer==320) {LED1_SetStatus(3); Timer=0;} //快閃5秒
}
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1