入門單片機(jī)stm32定時(shí)器詳解

一虐秋、基本定時(shí)器介紹


在STM32中,基本定時(shí)器有TIM6垃沦、TIM7等客给。基本定時(shí)器主要包含時(shí)基單元肢簿,提供16位的計(jì)數(shù)靶剑,能計(jì)數(shù)0~65535〕爻洌基本定時(shí)器除了計(jì)數(shù)功能以外桩引,還能輸出給DAC模塊一個(gè)TRGO信號(hào)∈湛洌基本定時(shí)器框圖如下:



二阐污、時(shí)基單元介紹


STM32的所有定時(shí)器都具備時(shí)基單元,時(shí)基單元的功能就是簡(jiǎn)單的計(jì)數(shù)咱圆,即計(jì)數(shù)時(shí)鐘源TMxCLK的脈沖個(gè)數(shù)笛辟,這個(gè)時(shí)鐘源來至APB1總線。高級(jí)和通用定時(shí)器還可以使用其他的時(shí)鐘源進(jìn)行計(jì)數(shù)序苏,在高級(jí)定時(shí)器和通用定時(shí)器中會(huì)詳細(xì)介紹手幢。在基本定時(shí)器框架中可知時(shí)基單元包含如下三個(gè)部分:

1.ARR 自動(dòng)重裝載寄存器

2.CNT 計(jì)數(shù)器

3.PSC? 預(yù)分頻器


基本定時(shí)器的定時(shí)(計(jì)數(shù))功能配置如下:



void TIM6_IRQHandler(void)

{

static int counter = 0;

if(TIM_GetITStatus(TIM6,TIM_IT_Update))

{

//在設(shè)置TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);后中斷進(jìn)去兩次

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

}

}


//基本定時(shí)器

void TIM6_Configuration()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

NVIC_InitTypeDef? NVIC_InitStruct;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //時(shí)鐘使能


TIM_TimeBaseInitStruct.TIM_Period = 10 -1;

TIM_TimeBaseInitStruct.TIM_Prescaler = 72;

TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);//? TIMx->EGR.UG? ?


NVIC_InitStruct.NVIC_IRQChannel? = TIM6_IRQn;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;

NVIC_Init(&NVIC_InitStruct);


TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

// TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);//如需配置單脈沖模式,開啟此注釋

TIM_ARRPreloadConfig(TIM6,ENABLE);

TIM_Cmd(TIM6,ENABLE);//CEN? 位

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

}


值得說明的是忱详,基本定時(shí)器還支持單脈沖模式围来,配置單脈沖模式如代碼注釋即可。單脈沖模式要注意的是在定時(shí)器溢出兩次后才關(guān)閉定時(shí)器,即失能定時(shí)器监透。在代碼中桶错,配置有中斷,在單脈沖模式下胀蛮,可以清晰的看到進(jìn)入定時(shí)器中斷2次院刁。


三、定時(shí)器信號(hào)輸出


定時(shí)器的信號(hào)輸出與定時(shí)器中的控制寄存器2(TIM6->CR2)的MMS位相關(guān)粪狼,基本定時(shí)器輸出的信號(hào)只能用作DAC的觸發(fā)退腥,而高級(jí)定時(shí)器、通用定時(shí)器的輸出信號(hào)可以觸發(fā)定時(shí)器以及DAC再榄,具體細(xì)節(jié)這里不細(xì)說狡刘。定時(shí)器信號(hào)輸出的例子可以參考我的博文http://blog.csdn.net/quentinecho/article/details/79068001。這個(gè)例子中使用TIM6輸出的TRGO信號(hào)啟動(dòng)了DAC產(chǎn)生一個(gè)三角波困鸥,當(dāng)然其他的DAC觸發(fā)方式也可以產(chǎn)生一個(gè)三角波嗅蔬。


#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "system_stm32f10x.h"

#include "stm32f10x_dac.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_tim.h"


/*DAC輸出 = Vref x (DOR/4095)*/


//DAC的兩個(gè)通道可以配置使用

//相同觸發(fā)源/不同觸發(fā)源

//同時(shí)觸發(fā)/獨(dú)立觸發(fā)? ? DAC_DualSoftwareTriggerCmd函數(shù)設(shè)置軟件同時(shí)觸發(fā)

//使用波形發(fā)生器/不使用波形發(fā)生器

//使用三角波發(fā)生器/使用噪聲發(fā)生器/不使用波形發(fā)生器

//設(shè)置相同DAC_LFSRUnmask_TriangleAmplitude的值/設(shè)置不相同DAC_LFSRUnmask_TriangleAmplitude的值

//等等以上各種情況可以任意組合,互不影響疾就。

void DAC_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

DAC_InitTypeDef DAC_InitStruct;

//第一步? 使能時(shí)鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);

//第二步? 配置參數(shù)

/*一旦使能DACx通道澜术,相應(yīng)的GPIO引腳就會(huì)自動(dòng)與DAC的模擬輸出相連,為了避免寄生的干擾和額外的功耗虐译,引腳PA4/PA5在之前應(yīng)當(dāng)設(shè)置成“模擬輸入”

注意是“模擬輸入“瘪板,因?yàn)镾TM32中沒有模擬輸出,所以雖然PA4 PA5是輸出模擬信號(hào)漆诽,也只能設(shè)置成GPIO_Mode_AIN*/

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_SetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5) ;//PA.4? PA.5輸入高 侮攀,上拉輸入起抗干擾的作用


// /*DAC 通道1? PA4 產(chǎn)生噪聲*/

// DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_Noise;

// DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;//DAC_Trigger_T6_TRGO;

// DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//輸出緩存可以用來減少輸出阻抗,無需外部運(yùn)放即可直接驅(qū)動(dòng)外部負(fù)載

// DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits10_0;//每次觸發(fā)計(jì)算一次LSFR算法厢拭,并將得到的值再加上DAC_DHRx的數(shù)值兰英,去掉溢出位后寫入DAC_DORx寄存器,輸出特定的電壓

// DAC_Init(DAC_Channel_1,&DAC_InitStruct);//參與LSFR算法的位數(shù)由DAC_LFSRUnmask_TriangleAmplitude來確定供鸠,DAC_LFSRUnmask_Bits10_0數(shù)值表示有10位參與LSFR計(jì)算


/*DAC 通道1? PA4 普通數(shù)模轉(zhuǎn)換*/

DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;//關(guān)閉波形發(fā)生器

DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;//DAC_Trigger_Software/DAC_Trigger_Ext_IT9

DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//輸出緩存可以用來減少輸出阻抗畦贸,無需外部運(yùn)放即可直接驅(qū)動(dòng)外部負(fù)載

DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;//該參數(shù)與噪聲/三角波發(fā)生器相關(guān),普通DAC轉(zhuǎn)換是設(shè)置為0即可

DAC_Init(DAC_Channel_1,&DAC_InitStruct); ?


/*DAC 通道2? PA5 產(chǎn)生三角波*/

DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;

DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;

DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;//內(nèi)部的三角波計(jì)數(shù)器每次觸發(fā)時(shí)候之后累加1楞捂,該計(jì)數(shù)器的值與DAC_DHRx的數(shù)值相加薄坏,去掉溢出位后寫入DAC_DORx寄存器,輸出電壓

DAC_Init(DAC_Channel_2,&DAC_InitStruct);//三角波計(jì)數(shù)器的最大值由DAC_LFSRUnmask_TriangleAmplitude來確定寨闹,當(dāng)計(jì)數(shù)器達(dá)到這個(gè)最大值胶坠,然后三角波計(jì)數(shù)器開始遞減


//第三步? 使能器件

//DAC_SetDualChannelData(DAC_Align_12b_R,4095,0);等價(jià)于DAC_SetChannel1Data(DAC_Align_12b_R, 4095); DAC_SetChannel2Data(DAC_Align_12b_R, 0);??

/*DAC 通道1? PA4 使能*/

DAC_SetChannel1Data(DAC_Align_12b_R, 4095);? //12位右對(duì)齊數(shù)據(jù)格式設(shè)置DAC值? 設(shè)置值最大為4095,設(shè)置成4096則溢出繁堡,DORx即為0

DAC_Cmd(DAC_Channel_1, ENABLE);? //使能DAC1


/*DAC 通道2? PA5 使能*/

DAC_Cmd(DAC_Channel_2, ENABLE);? //使能DAC1

DAC_SetChannel2Data(DAC_Align_12b_R, 0);? //12位右對(duì)齊數(shù)據(jù)格式設(shè)置DAC值

}



//基本定時(shí)器

void TIM6_Configuration()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

//第一步? 使能時(shí)鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //時(shí)鐘使能


//第二步 配置參數(shù)

TIM_TimeBaseInitStruct.TIM_Period = 10 -1;

TIM_TimeBaseInitStruct.TIM_Prescaler = 72;

TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);//? TIMx->EGR.UG? ?



/*TIM6,7可以輸出3種類型的TRGO信號(hào)

#define TIM_TRGOSource_Reset? ? ? ? ? ? ? ?((uint16_t)0x0000) //復(fù)位 UG

#define TIM_TRGOSource_Enable? ? ? ? ? ? ? ((uint16_t)0x0010) //使能 CEN

#define TIM_TRGOSource_Update? ? ? ? ? ? ? ((uint16_t)0x0020) //更新事件

*/


TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);//輸出觸發(fā)TRGO信號(hào)? 這里TRGO信號(hào)就是定時(shí)器溢出產(chǎn)生的更新信號(hào)


//第三步? 使能器件

TIM_Cmd(TIM6,ENABLE);//CEN? 位

}


int main()

{

DAC_Configuration();

TIM6_Configuration();

while(1)

{

}

}


看到這里還是沒懂的話可以參考這個(gè)視頻資料

http://www.makeru.com.cn/live/1392_1199.html?s=45051

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沈善,一起剝皮案震驚了整個(gè)濱河市乡数,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闻牡,老刑警劉巖净赴,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罩润,居然都是意外死亡玖翅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門哨啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烧栋,“玉大人写妥,你說我怎么就攤上這事拳球。” “怎么了珍特?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵祝峻,是天一觀的道長。 經(jīng)常有香客問我扎筒,道長莱找,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任嗜桌,我火速辦了婚禮奥溺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骨宠。我一直安慰自己浮定,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布层亿。 她就那樣靜靜地躺著桦卒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匿又。 梳的紋絲不亂的頭發(fā)上方灾,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音碌更,去河邊找鬼裕偿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痛单,可吹牛的內(nèi)容都是我干的嘿棘。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼桦他,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔫巩!你這毒婦竟也來了谆棱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤圆仔,失蹤者是張志新(化名)和其女友劉穎垃瞧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坪郭,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡个从,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歪沃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦锐。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沪曙,靈堂內(nèi)的尸體忽然破棺而出奕污,到底是詐尸還是另有隱情,我是刑警寧澤液走,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布碳默,位于F島的核電站,受9級(jí)特大地震影響缘眶,放射性物質(zhì)發(fā)生泄漏嘱根。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一巷懈、第九天 我趴在偏房一處隱蔽的房頂上張望该抒。 院中可真熱鬧,春花似錦顶燕、人聲如沸凑保。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愉适。三九已至,卻和暖如春癣漆,著一層夾襖步出監(jiān)牢的瞬間维咸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工惠爽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癌蓖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓婚肆,卻偏偏與公主長得像租副,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子较性,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361