<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32F10x 學(xué)習筆記10(基本定時(shí)器)

STM32F10x 學(xué)習筆記10(基本定時(shí)器)

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
大容量的STM32F101xx、STM32F103xx系列和互聯(lián)型產(chǎn)品中包含了兩個(gè)基本定時(shí)器,TIM6和TIM7。這兩個(gè)定時(shí)器功能非常簡(jiǎn)單,基本上和SysTick定時(shí)器相當。

但是我在使用的時(shí)候確是費了一番周折才調試通過(guò),所以還是應該將這兩個(gè)定時(shí)器的使用方法好好的寫(xiě)一寫(xiě)。

本文引用地址:http://dyxdggzs.com/article/201611/318846.htm

基本定時(shí)器TIM6和TIM7各包含一個(gè)16位自動(dòng)裝載計數器,由各自的可編程分頻器驅動(dòng)。簡(jiǎn)單的說(shuō)兩個(gè)定時(shí)器是從0計數到N(由自動(dòng)裝載計數器來(lái)確定N的具體值),然后復位回0重新計數。每次復位到0的時(shí)候可以產(chǎn)生對應的中斷信號,或者產(chǎn)生DMA請求,還可以觸發(fā)DAC同步電路。不過(guò)這次筆記不討論觸發(fā)DAC的問(wèn)題,等寫(xiě)到DAC的使用時(shí)在講解如何用這兩定時(shí)器驅動(dòng)DAC。

基本定時(shí)器TIM6和TIM7掛載在A(yíng)PB1總線(xiàn)上,在使用之前需要先使能對應的時(shí)鐘信號。對應的語(yǔ)句如下:

  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
  2. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);

APB1總線(xiàn)上的時(shí)鐘信號在進(jìn)入定時(shí)器之后第一件事情是被預分頻器TIMx_PSC分頻。程序中隨時(shí)都可以更改TIMx_PSC的值,但是TIMx_PSC是有緩沖的,只有發(fā)生了更新事件時(shí)新的預分頻值才會(huì )生效。

另外有一點(diǎn)必須要特別注意:如果我們想對CK_PSC時(shí)鐘信號N分頻的話(huà),TIMx_PSC中應該寫(xiě)入M-1,而不是M。

對應的語(yǔ)句如下:

  1. TIMx->PSC=M-1;

如果我們希望立刻更新預分頻器也是有辦法的,那就是軟件觸發(fā)一次更新事件。TIM6和TIM7有個(gè)事件產(chǎn)生寄存器(TIMx_EGR)就是起這個(gè)作用的。TIMx_EGR只有最低位有用,稱(chēng)之為UG位,向這一位寫(xiě)入1則產(chǎn)生更新事件,定時(shí)器的計數器被歸零。

對應的語(yǔ)句如下:

  1. TIMx->EGR=0x0001;

自動(dòng)重裝載寄存器TIMx_ARR決定了CNT計數器最高記到多少就會(huì )歸零。自動(dòng)重裝載寄存器也是帶緩存的。如果TIMx_CR1寄存器中的自動(dòng)重裝載預加載使能位(ARPE)為0,則寫(xiě)入自動(dòng)重裝載寄存器的值立即起作用。如果ARPE=1,則要等到發(fā)生了更新事件后才會(huì )起作用。舉例來(lái)說(shuō),當前自動(dòng)重裝載寄存器的值為20000,CNT計數器的值為1000,ARPE=1,這時(shí)我們向自動(dòng)重裝載寄存器寫(xiě)個(gè)5000,CNT計數器記到5000時(shí)并不會(huì )歸零,它還要繼續直到記到20000然后歸零,在歸零的同時(shí)產(chǎn)生計數器溢出事件,計數器溢出事件可以產(chǎn)生更新事件,之后自動(dòng)重裝載寄存器的值才真的變?yōu)?000了。

這里出現了兩個(gè)事件:計數器溢出事件和更新事件。這兩個(gè)實(shí)際是不同的。每次當計數器溢出時(shí)都會(huì )產(chǎn)生計數器溢出事件,但是不一定產(chǎn)生更新事件。

TIM6和TIM7控制寄存器1(TIMx_CR1)有一位UDIS:禁止更新(Updatedisable)位。

如果這位被設置為1,則計數器溢出事件不會(huì )產(chǎn)生更新事件。不產(chǎn)生更新事件則預分頻器的系數不能被更新,自動(dòng)重裝載寄存器的值也可能不能更新(ARPE=1)。

只是產(chǎn)生更新事件是沒(méi)有用的,我們最終需要的是產(chǎn)生中斷或DMA請求。這里先說(shuō)中斷的產(chǎn)生。

TIM6和TIM7DMA/中斷使能寄存器(TIMx_DIER)有一位為UIE。只有這一位為1時(shí)才能產(chǎn)生更新中斷。

對應的語(yǔ)句如下:

  1. TIMx->DIER|=0x0001;

TIM6和TIM7狀態(tài)寄存器(TIMx_SR)中也只有一位是有用的,位于這個(gè)寄存器的最低位,稱(chēng)之為UIF位。這一位為1標志著(zhù)產(chǎn)生了更新中斷。什么時(shí)候這一位才能為1呢?簡(jiǎn)單的說(shuō)就是產(chǎn)生更新事件這一位會(huì )被置位為1,不過(guò)也有特殊情況,我們知道有兩種情況會(huì )產(chǎn)生更新事件:計數器溢出事件和UG=1。如果TIMx_CR1的URS位被設為了1,則UG=1產(chǎn)生的更新事件不會(huì )將UIF位置位1。

一般來(lái)說(shuō)我們都不希望UG=1時(shí)產(chǎn)生中斷,所以多數時(shí)間我們會(huì )設置URS位為1。

對應的語(yǔ)句如下:

  1. TIMx->CR1|=0x0004;

下面是一個(gè)例子程序,使用TIM6,產(chǎn)生一個(gè)5Hz的定時(shí)中斷。時(shí)鐘頻率為72MHz。

  1. voidTIM6_Init(void)
  2. {
  3. NVIC_InitTypeDefNVIC_InitStructure;
  4. NVIC_InitStructure.NVIC_IRQChannel=TIM6_IRQn;
  5. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  6. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  7. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  8. NVIC_Init(&NVIC_InitStructure);
  9. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
  10. TIM6->PSC=7200-1;//分頻之后的時(shí)鐘頻率為10KHz
  11. TIM6->ARR=2000-1;//5Hz定時(shí)頻率
  12. TIM6->CR1=0x0004+0x0001;//URS=1CEN=1
  13. TIM6->DIER=0x0001;//使能更新中斷
  14. }
  15. voidTIM6_IRQHandler(void)
  16. {
  17. LED_Flash(GPIO_LED2);
  18. TIM6->SR=0x0000;//清標志位
  19. }

還可以完全用STM32F10xStandardPeripheralsFirmwareLibrary來(lái)寫(xiě)這個(gè)程序。下面用TIM7實(shí)現類(lèi)似的功能。

  1. voidTIM7_Init(void)
  2. {
  3. TIM_TimeBaseInitTypeDefTIM7_TimeBaseStructure;
  4. NVIC_InitTypeDefNVIC_InitStructure;
  5. NVIC_InitStructure.NVIC_IRQChannel=TIM7_IRQn;
  6. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  7. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  8. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  9. NVIC_Init(&NVIC_InitStructure);
  10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);//RCC_APB1Periph_TIM7
  11. TIM_TimeBaseStructInit(&TIM7_TimeBaseStructure);
  12. TIM7_TimeBaseStructure.TIM_Prescaler=36000-1;//分頻之后的時(shí)鐘頻率為2KHz
  13. TIM7_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  14. TIM7_TimeBaseStructure.TIM_Period=400-1;//5Hz定時(shí)頻率
  15. TIM7_TimeBaseStructure.TIM_ClockDivision=0;
  16. TIM_TimeBaseInit(TIM7,&TIM7_TimeBaseStructure);
  17. TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
  18. TIM_Cmd(TIM7,ENABLE);
  19. TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
  20. }
  21. voidTIM7_IRQHandler(void)
  22. {
  23. if(TIM_GetITStatus(TIM7,TIM_IT_Update)==SET)
  24. {
  25. LED_Flash(GPIO_LED3);
  26. TIM_ClearITPendingBit(TIM7,TIM_FLAG_Update);
  27. }
  28. }

程序寫(xiě)完了,這里說(shuō)幾點(diǎn)注意事項。

(1)在對TIMx 進(jìn)行設置之前一定要打開(kāi)APB1總線(xiàn)上對應的時(shí)鐘,否則所有的設置都不起作用。

(2)一定要設置NVIC,因為默認情況下這些外設的中斷都是被禁用的。


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>