找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4273|回復(fù): 0
收起左側(cè)

STM32通用定時器TIM2-5的基本用法

[復(fù)制鏈接]
ID:102668 發(fā)表于 2016-1-16 05:07 | 顯示全部樓層 |閱讀模式
STM32的定時器是個強大的模塊,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做PWM輸出或者輸入捕獲功能。從系統(tǒng)框架圖下看,名為TIMx的有八個,其中TIM1和TIM8掛在APB2總線上,而TIM2-TIM7則掛在APB1總線上。其中TIM1&TIM8稱為高級控制定時器(advanced control timer).他們所在的APB2總線也比APB1總線要好。APB2可以工作在72MHz下,而APB1最大是36MHz。

   由上圖可知,當APB1 的預(yù)分頻系數(shù)為1 時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1 的頻率;當APB1的預(yù)分頻系數(shù)為其它數(shù)值(即預(yù)分頻系數(shù)為2、4、8 或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1 的頻率兩倍。也就是,當APB1不分頻,TIM3的時鐘速度為36MHz,當2分頻是,APB1變成18MHz,但是TIM又會倍頻,即TIM時鐘等于18*2=36MHz。這里我們用向上計數(shù)的方式,即TIMx_CNT中的計數(shù)值達到TIMx_ARR中的值時,產(chǎn)生中斷,TIMx_CNT又從0開始計。

按以下步驟編程:
1.系統(tǒng)初始化,主要初始化時鐘等。
2.GPIO初始化,用于LED,有了燈就便于觀察了。
3.TIM3的配置。
4.NVIC的配置。
5.編寫中斷服務(wù)函數(shù)。

void GPIO_PA_Init()
{//PA8管腳配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_DeInit(GPIOA);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP ;//推挽輸出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能端口時鐘A
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIMER3_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM3);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period=10000;//ARR的值
TIM_TimeBaseStructure.TIM_Prescaler=7200-1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3, ENABLE); //開啟時鐘
}
void NVIC_Configuration()
{  
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   // 搶占式優(yōu)先級別
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//指定中斷源
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 指定響應(yīng)優(yōu)先級別1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{     
Stm32_Clock_Init(9); //系統(tǒng)時鐘設(shè)置
delay_init(72);      //延時初始化
GPIO_PA_Init();
TIMER3_Init();
NVIC_Configuration();
while(1);
}
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3 , TIM_IT_Update) == SET)
{
  TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
  if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) GPIO_ResetBits(GPIOA, GPIO_Pin_8);
  else GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
}


回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表