MSP430定時器筆記
1.定時器參數
1.1 基本定時器
typedef enum
{
TIMER_A0 ,
TIMER_A1 ,
TIMER_A2 ,
TIMER_B0 ,
TIMER_NUM ,
}TIMERn; //定時器模塊
1.2 定時器通道引腳、時鐘選擇
const GPIO_PIN TIMER_CHANEL_PIN[TIMER_NUM][TIMER_CH_NUM]=
{// CH0 CH1 CH2 CH3 CH4 CH5 CH6
{{P1,1},{P1,2},{P1,3},{P1,4},{P1,5}}, //TIMER_A0
{{P1,7},{P2,0},{P2,1}}, //TIMER_A1
{{P2,3},{P2,4},{P2,5}}, //TIMER_A2
{{P5,6},{P5,7},{P7,4},{P7,5},{P7,6},{P3,5},{P3,6}} //TIMER_B0
};//通道引腳
const GPIO_PIN TIMER_CLK_PIN[TIMER_NUM] =
{
{P1,0},//TIMER_A0----ACLK----
{P1,6},//TIMER_A1----ACLK----
{P2,2},//TIMER_A2----SMCLK----
{P7,7} //TIMER_B0----MCLK----
};//外部時鐘輸入引腳
2.定時器功能
2.1 實現基本定時
extern STATUS TIMER_Interval_Us (TIMERn, uint32_t us); //初始化一個us級的定時中斷
#define TIMER_Interval_Ms(timer,ms) TIMER_Interval_Us(timer,(uint32_t)ms*1000)
2.1.1 中斷向量設置傳參
/*******************************************************************************
* 函數名稱:Set_Vector_Handler(VECTORn vector,__interrupt void pfunc_handler(void))
* 功能說明:設置中斷向量地址
* 參數說明:
VECTORn vector :中斷向量(枚舉變量,見.h文件)
__interrupt void pfunc_handler(void) : 中斷服務函數
* 函數返回:無
* 使用示例:Set_Vector_Handler(VECTOR_PORT1,GPIO_IRQ_Handler); //設置PPORT1中斷服務函數為GPIO_IRQ_Handler,需要先定義中斷服務函數,另外最好先設置中斷向量,再開啟中斷
********************************************************************************/
void Set_Vector_Handler(VECTORn vector, __interrupt void pfunc_handler(void))
{
if(SYSX->RIVECT == DISABLE) //如果沒有設置中斷向量表到RAM,則設置
{
Set_VectorTable_To_RAM(); //設置中斷向量表到RAM
}
//此處若有警告可忽略
__VECTOR_RAM[vector] = (ISR_TYPE)pfunc_handler; //設置該中斷向量地址
}
2.1.2 定時中斷
/*******************************************************************************
* 函數名稱:TIMER_Interval_Us(TIMERn timer,uint32_t us)
* 功能說明:定時器定時初始化(單位:us)
* 參數說明:TIMERn timer :定時器模塊
uint32_t us : 定時時間
* 函數返回:不成功則返回ERROR,成功則返回SUCCESS
* 使用例程:TIMER_Interval_Us(TIMER_B0,2500); //TB定時間隔2.5ms中斷
********************************************************************************/
STATUS TIMER_Interval_Us(TIMERn timer,uint32_t us)
{
#ifdef DELAY_TIMER
ASSERT((timer != DELAY_TIMER),
"TIMER_Interval_Us",
"定時器已經設置為默認延時功能,不能再作為其他功能使用"); //不允許這種情況下還宏定義該定時器作為延時所用的定時器,請在system.h里修改DELAY_TIMER宏定義
#endif
TIMERX[timer]->CLR = BIT_SET;//置位
TIMERX[timer]->SSEL = TIMER_SSEL_SMCLK;
TIMERX[timer]->ID = 0u;//分頻系數清零
//計數值
uint32_t Counter_Value = (uint32_t)(us * g_sClock.SMCLK.fMHZ);
while(Counter_Value > 65536)
{
TIMERX[timer]->ID ++;
Counter_Value >>= 1;
if((TIMERX[timer]->ID == 3u) && (Counter_Value > 65536)) //這個時候意味得選擇更低頻率的時鐘了
{
if(TIMERX[timer]->SSEL == TIMER_SSEL_ACLK) //如果時鐘已經是最低的ACLK了,那么意味著設置的頻率太低了,失敗返回ERROR
{
return ERROR;
}
//更換為更低的ACLK,從新配置
TIMERX[timer]->SSEL = TIMER_SSEL_ACLK;
TIMERX[timer]->ID = 0u;
Counter_Value = (uint32_t)(us * g_sClock.ACLK.fMHZ);
continue;
}
}
if(Counter_Value <= 1)//出現這種情況,說明頻率不合適
{
return ERROR;
}
TIMERX[timer]->CCR[0] = (uint16_t)(Counter_Value - 1u);//為什么要減一??因為TAR/TBR計數器從CCR0變化到0還有一個計數周期
TIMERX[timer]->CCTL[0].CAPMODE = RESET;//比較模式
TIMERX[timer]->IE = RESET; //關閉溢出中斷
TIMERX[timer]->CCTL[0].IE = RESET; //關閉通道中斷
TIMERX[timer]->MC = TIMER_MC_UP; //增計數模式
return SUCCESS;
}
2.1.3 初始化實例
DisableInterrupts(); //禁止總中斷
Set_Vector_Handler(VECTOR_TIMER0_A0,TIMER_TA0_IRQ_Handler); //設置中斷向量,最好先設置中斷向量,在開啟中斷
TIMER_Interval_Ms(TIMER_A0,200);//初始化一個200ms的定時中斷
//TIMER_Interval_Us(TIMER_A0,1000000); //初始化一個1000ms的定時中斷,不要寫為1000*1000,否則會提示超出范圍
TIMER_ITConfig (TIMER_A0,TIMER_CCR0_IRQn,ENABLE);
EnableInterrupts();
__interrupt void TIMER_TA0_IRQ_Handler()
{
LED_Turn(LED2); //黃燈
//FLAG_10MS=1;
}
2.2 PWM輸出
2.2.1 PWM計數模式
#define TIMER_MC_STOP (0) /* Timer A mode control: 0 - Stop */
#define TIMER_MC_UP (1) /* Timer A mode control: 1 - Up to CCR0 */
#define TIMER_MC_CONTINUOUS (2) /* Timer A mode control: 2 - Continuous up */
#define TIMER_MC_CONTINOUS (2) /* Legacy define */
#define TIMER_MC_UPDOWN (3) /* Timer A mode control: 3 - Up/Down */
2.2.2 PWM輸出模式
typedef enum
{
TIMER_PWM_OUTMOD0 ,
TIMER_PWM_OUTMOD1 ,
TIMER_PWM_OUTMOD2 ,
TIMER_PWM_OUTMOD3 ,
TIMER_PWM_OUTMOD4 ,
TIMER_PWM_OUTMOD5 ,
TIMER_PWM_OUTMOD6 ,
TIMER_PWM_OUTMOD7 ,
}TIMER_PWM_OUTMODn; //PWM波輸出波形
各種計數情況下pwm輸出模式
2.3 pwm輸出
2.3.1 pwm初始化
/*******************************************************************************
* 函數名稱:TIMER_PWM_MultiChannel_Init(TIMERn timer, uint32_t fre, uint8_t ChannelNum,...)
* 功能說明:定時器PWM輸出初始化(可以多個通道同時初始化)
* 參數說明:TIMERn timer :定時器模塊
uint32_t fre :頻率
uint8_t ChannelNum :要初始化的通道數
... :初始化的通道
* 函數返回:不成功則返回ERROR,成功則返回SUCCESS
********************************************************************************/
STATUS TIMER_PWM_MultiChannel_Init(TIMERn timer, uint32_t fre, uint8_t ChannelNum,...)
{
#ifdef DELAY_TIMER
ASSERT((timer != DELAY_TIMER),
"TIMER_PWM_MultiChannel_Init",
"定時器已經設置為默認延時功能,不能再作為其他功能使用"); //不允許這種情況下還宏定義該定時器作為延時所用的定時器,請在system.h里修改DELAY_TIMER宏定義
#endif
ASSERT((timer==TIMER_A0&&ChannelNum<=TIMER_CH4)
||(timer==TIMER_A1&&ChannelNum<=TIMER_CH2)
||(timer==TIMER_A2&&ChannelNum<=TIMER_CH2)
||(timer==TIMER_B0&&ChannelNum<=TIMER_CH6),
"TIMER_PWM_MultiChannel_Init",
"定時器通道參數超出范圍!"); //斷言檢測輸入參數*/
va_list ap;
va_start(ap,ChanelNum);
for(int i=0;i < ChannelNum;i++) //根據初始化的通道數,逐一初始化通道
{
TIMER_CHn ch = va_arg(ap, TIMER_CHn); //讀取要初始化的通道
if((ch == TIMER_CH0) || (ch >= TIMER_CH_NUM)) //判斷通道值是否合理
{
return ERROR; //不合理返回ERROR
}
//初始化端口
GPIO_Init(TIMER_CHANEL_PIN[timer][ch].Port,TIMER_CHANEL_PIN[timer][ch].Pin,GPO|SEL);
//初始化占空比及輸出波形
TIMERX[timer]->CCR[ch] = 0u;
TIMERX[timer]->CCTL[ch].IE = RESET; //關閉通道中斷
TIMERX[timer]->CCTL[ch].OUTMOD = DEFAULT_PWM_OUTMOD; //輸出波形設置
TIMERX[timer]->CCTL[ch].CAPMODE = RESET; //比較模式
}
va_end(ap);
return TIMER_PWM_SetFrequency(timer,fre);
}
設置頻率函數
/*******************************************************************************
* 函數名稱:TIMER_PWM_SetFrequency(TIMERn timer,uint32_t fre)
* 功能說明:定時器PWM頻率設置(注意這里沒有更改各個通道的占空比,所以修改頻率后占空比變了,需要從新設置占空比)
* 參數說明:TIMERn timer :定時器模塊
uint32_t fre :頻率
* 函數返回:不成功則返回ERROR,成功則返回SUCCESS
* 使用例程:TIMER_PWM_SetFrequency(TIMER_B0,1000); //將定時器B輸出頻率修改為1000Hz
********************************************************************************/
STATUS TIMER_PWM_SetFrequency(TIMERn timer,uint32_t fre)
{
if(fre == 0u)
{
TIMERX[timer]->MC = TIMER_MC_STOP; //暫停輸出PWM波
return SUCCESS;
}
TIMERX[timer]->CLR = BIT_SET;
TIMERX[timer]->SSEL = TIMER_SSEL_SMCLK; //先選擇時鐘源為SMCLK
上一篇:MSP430學習筆記3----定時器學習
下一篇:msp430 學習經驗總結
推薦閱讀
史海拾趣
在快速擴張的過程中,D1 International Inc公司始終堅守品質管理的原則。公司嚴格把控產品的每一個環節,從原材料采購到生產流程,再到最終的產品檢驗,都力求做到精益求精。這種對品質的執著追求,使得D1 International Inc公司的產品在市場上贏得了良好的口碑,也為公司的長期發展提供了有力保障。
為了加快產品國產化進程,昆泰芯微電子與世強先進(深圳)科技股份有限公司簽訂了授權代理合作協議。通過這一戰略合作,昆泰芯微電子成功將旗下高端傳感器產品觸達至終端市場,實現了市場的快速擴張。同時,這一合作也進一步提升了昆泰芯微電子在行業中的知名度和影響力。
面對全球化的趨勢,ARCOLECTRIC SWITCHES公司制定了國際化發展戰略。公司積極開拓海外市場,設立海外分支機構,拓展國際業務。在國際化進程中,公司注重跨文化管理,尊重不同國家和地區的文化差異,努力融入當地市場。通過國際化戰略的實施,ARCOLECTRIC SWITCHES公司的業務范圍不斷擴大,國際影響力逐漸提升。
這些故事雖然基于虛構,但反映了一個電子企業在發展過程中可能經歷的關鍵階段和挑戰。實際中,ARCOLECTRIC SWITCHES公司的發展歷程可能因市場條件、技術變革、競爭環境等多種因素而有所不同。如果您需要了解該公司具體的發展故事,建議查閱相關官方資料或行業報告。
背景:近年來,隨著環保意識的提高和可持續發展理念的普及,電子行業也開始向綠色化、低碳化方向發展。Handok積極響應這一趨勢,將綠色可持續發展作為公司的重要戰略之一。
發展:Handok加大了對環保技術的研發投入,推出了一系列綠色電子產品和解決方案。同時,公司還優化了生產流程和管理體系,實現了資源的高效利用和廢棄物的減量化處理。
影響:Handok的綠色可持續發展戰略不僅贏得了市場的廣泛認可,還為公司樹立了良好的社會形象。此外,這一戰略還有助于公司在未來更加激烈的市場競爭中保持領先地位。
AVG深知在競爭激烈的電子行業中,單打獨斗難以取得長遠的發展。因此,公司積極尋求與行業內外的合作伙伴建立緊密的合作關系。通過與上下游企業建立供應鏈合作關系,AVG確保了原材料的穩定供應和產品質量的可靠性;通過與高校和研究機構合作開展技術研發,AVG不斷引入新的技術和創新思路。這些合作伙伴關系的建立,為AVG的發展提供了有力支持,也促進了整個電子行業的共贏發展。
隨著業務的不斷擴展,Belden公司于1910年搬遷至芝加哥更大的區域,并在產品線上增加了橡膠絕緣電線。這一舉措不僅擴大了公司的生產規模,也進一步豐富了產品種類,滿足了市場的多樣化需求。隨后,百通工程師于1927年發明的軟橡膠塞技術,進一步推動了公司的技術創新和業務拓展。
本帖最后由 paulhyde 于 2014-9-15 08:56 編輯 07電子設計大賽論文.rar [ 本帖最后由 open82977352 于 2009-8-12 08:39 編輯 ] … 查看全部問答∨ |
|
為什么8051的P0口可驅動8個LS型TTL負載,而P1口只可驅動4個? 為什么8051的P0口可驅動8個LS型TTL負載,而P1口只可驅動4個?這個驅動數量是指低電平時P0口OD門能承受8個LS型TTL負載的電流還是指高電平時8個LS型TTL負載不會把電平拉低?… 查看全部問答∨ |
|
程序大概這樣的,一個視圖列表里顯示了CF卡中所有的文件,鼠標焦點可以放在文件上,但現在想做一個選取功能,就是,當鼠標單擊了一個文件就能直接或按另一個按鈕讀出他的名字,這樣好去CF卡中查找這個文件并對這個文件操作。問題是,怎么讀出文件的 ...… 查看全部問答∨ |
|
偶剛剛接觸STM32,發現了兩個令人費解的問題,請香主及各位幫忙(使用Keil uVision3 V3.55A):1、中斷子程序的起始地址影響中斷正常運行: 我將I2C2設成主機,并使用中斷方式與I2C1通信,起初一切正常,這時I2C2中 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析