新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32定時器的小問題總結(jié)

STM32定時器的小問題總結(jié)

作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏

stm32定時器用的時候是根據(jù)原子開發(fā)版的程序直接應(yīng)用的,用的時候也沒有具體的考量,但是在用的時候出現(xiàn)了一個問題,就是定時器的中斷在設(shè)置之后,并沒有打開定時器但是程序執(zhí)行到這里就會進(jìn)入中斷,如果中斷中有其他一些硬件功能,例如在定時器中發(fā)送一些數(shù)據(jù),而這個時候串口并沒有初始化時,就是出現(xiàn)程序死在這里的問題。通過網(wǎng)上查找資料發(fā)現(xiàn)是定時器中斷標(biāo)志未清除的問題,調(diào)用TIM_ClearFlag函數(shù)之后就不會發(fā)生以上問題了??磥碓谟布渲脮r一定要注意這個問題,不管是其他外圍設(shè)備的初始化都需要注意。之前看到SPI、USART等初始化的時候會經(jīng)常加上XXX_DeInit()函數(shù),看來也并非多余,對于硬件初始化是很有必要的,紀(jì)盡管在手冊上看到這些值的初始值都是0,但是在應(yīng)用中還是出現(xiàn)這種問題,因此今后在應(yīng)用中一定的多加注意。具體初始化程序如下:

本文引用地址:http://butianyuan.cn/article/201611/318483.htm

void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能
TIM_DeInit(TIM2);
//定時器TIM2初始化
TIM_TimeBaseStructure.TIM_Period = 7199; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =9; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值 輸出周期為T=(Prescaler+1)(Period+1)/72M
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位

// TIM_ITConfig(TIM2,TIM_IT_UpdateTIM_IT_Trigger,ENABLE ); //使能指定的TIM2中斷,允許更新中斷
TIM_ClearFlag(TIM2 , TIM_FLAG_Update); //清除中斷標(biāo)志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中斷,允許更新中斷


//中斷優(yōu)先級NVIC設(shè)置
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占優(yōu)先級3級 優(yōu)先級設(shè)置最低
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級3級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器

}

這是定時器的更新中斷,還有定時捕獲模式等,這些可以更加靈活的用于一些需要定時器的問題中,



關(guān)鍵詞: stm32定時

評論


技術(shù)專區(qū)

關(guān)閉