STM32學(xué)習(xí)筆記——利用通用定時(shí)器TIM2進(jìn)行精確延時(shí)
TIM_IT值
TIM_FLAG | 描述 |
TIME_FLAG_Update | TIM中斷源 |
…… | …… |
例:
- TIM_ITConfig(TIM2,TIME_FLAG_Update,ENABLE);
2.5函數(shù)TIM_Cmd
函數(shù)名 | TIM_Cmd |
函數(shù)原型 | voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState) |
功能描述 | 使能或者失能TIMx外設(shè) |
輸入?yún)?shù)1 | TIMx:x可以是2,3或者4,來選擇TIM外設(shè) |
輸入?yún)?shù)2 | NewState:TIMx中斷的新狀態(tài) 這個參數(shù)可以?。篍NABLE或者DISABLE |
例:
- TIM_Cmd(TIM2,ENABLE);
3例程程序
本例程主要使用TIM2進(jìn)行精準(zhǔn)延時(shí)并亮滅LED燈,其中NVIC部分暫做了解,后面再繼續(xù)深入。另外,需要注意3.0以后版本的固件庫相比2.0版有所更改,如刪除舊版NVIC部分函數(shù),或移動至misc.c文件中,通道名TIM2_IRQChannel更改為TIM2_IRQn等。完整構(gòu)架:
完整代碼:
- #include"stm32f10x.h"
- voiddelay1ms(u32nTimer);
- voidGPIO_Configuration(void);
- voidTIM2_IRQHandler(void);
- voidTimer2_Configuration(void);
- voidNVIC_Configuration(void);
- intmain(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC時(shí)鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2時(shí)鐘
- GPIO_Configuration();
- NVIC_Configuration();//配置中斷
- Timer2_Configuration();//配置定時(shí)器
- while(1)
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_6);
- GPIO_SetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8);
- delay1ms(1000);
- GPIO_ResetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8);
- GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_6);
- delay1ms(1000);
- GPIO_Write(GPIOC,0x0140);
- delay1ms(2000);
- GPIO_Write(GPIOC,0x0280);
- delay1ms(2000);
- }
- }
- voidGPIO_Configuration(void)
- {
- GPIO_InitTypeDefGPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_Init(GPIOC,&GPIO_InitStructure);
- }
- voidTimer2_Configuration(void)
- {
- TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
- TIM_DeInit(TIM2);//使用缺省值初始化TIM外設(shè)寄存器
- TIM_TimeBaseStructure.TIM_Period=1;//自動重裝載寄存器值為1
- TIM_TimeBaseStructure.TIM_Prescaler=(36000-1);//時(shí)鐘預(yù)分頻數(shù)為36000
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采樣分頻倍數(shù)1,未明該語句作用。
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//上升模式
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
- TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除更新標(biāo)志位
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中斷
- TIM_Cmd(TIM2,ENABLE);//使能TIM2定時(shí)器
- }
- voidNVIC_Configuration(void)
- {
- NVIC_InitTypeDefNVIC_InitStructure;
- NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
- NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//3.0版以后的函數(shù)庫將各通道TIM2_IRQChanel改名TIM2_IRQn
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);//NVIC_Init函數(shù)被包含在misc.c文件中。
- }
- volatileu32gTimer;
- voidTIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//檢查溢出信號
- {
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除溢出標(biāo)志
- gTimer--;
- }
- }
- voiddelay1ms(u32nTimer)
- {
- gTimer=nTimer;
- while(gTimer);
- }
完成編譯并燒錄后,開發(fā)板上四個LED燈先相鄰兩兩亮滅,亮滅時(shí)間延遲1秒,然后交替兩兩亮滅,亮滅時(shí)間延遲2秒。
參考文獻(xiàn)
[1]Sharkdo.STM32用定時(shí)器精確延時(shí)的方法[EB/OL].http://www.cnblogs.com/sharkdo/archive/2011/03/23/1993036.html,2011-03-23/2012-10-14
[2]Cdzlllfe.stm32 通用定時(shí)器精確延時(shí)程序[EB/OL].
http://blog.sina.com.cn/s/blog_88534dff01010t1a.html,2011-12-17/2012-10-14
[3]福州芯達(dá)工作室.《STM32入門系列教程——定時(shí)器與蜂鳴器》[EB/OL].http://ishare.iask.sina.com.cn/f/10918196.html,2010-10-20/2012-10-14.
[4]正點(diǎn)電子.《Stm32不完全手冊》[EB/OL].http://www.amobbs.com/forum.php?mod=viewthread&tid=4517523,2011-01-17/2012-10-15
[5]半壺水,《STM32菜鳥學(xué)習(xí)手冊-羅嗦版》,http://wenku.baidu.com/view/fc7c7d20ccbff121dd3683da.html,2012-08-19.
[6]ST.《如何從STM32F10xxx固件庫V2.0.3升級為STM32F10xxx標(biāo)準(zhǔn)外設(shè)庫V3.0.0》[EB/OL].http://ishare.iask.sina.com.cn/f/18297257.html?from=like,2011-08-22/2012-09-09.
評論