STM32定時(shí)器的小問題總結(jié)
stm32的定時(shí)器用的時(shí)候是根據(jù)原子開發(fā)版的程序直接應(yīng)用的,用的時(shí)候也沒有具體的考量,但是在用的時(shí)候出現(xiàn)了一個(gè)問題,就是定時(shí)器的中斷在設(shè)置之后,并沒有打開定時(shí)器但是程序執(zhí)行到這里就會進(jìn)入中斷,如果中斷中有其他一些硬件功能,例如在定時(shí)器中發(fā)送一些數(shù)據(jù),而這個(gè)時(shí)候串口并沒有初始化時(shí),就是出現(xiàn)程序死在這里的問題。通過網(wǎng)上查找資料發(fā)現(xiàn)是定時(shí)器中斷標(biāo)志未清除的問題,調(diào)用TIM_ClearFlag函數(shù)之后就不會發(fā)生以上問題了??磥碓谟布渲脮r(shí)一定要注意這個(gè)問題,不管是其他外圍設(shè)備的初始化都需要注意。之前看到SPI、USART等初始化的時(shí)候會經(jīng)常加上XXX_DeInit()函數(shù),看來也并非多余,對于硬件初始化是很有必要的,紀(jì)盡管在手冊上看到這些值的初始值都是0,但是在應(yīng)用中還是出現(xiàn)這種問題,因此今后在應(yīng)用中一定的多加注意。具體初始化程序如下:
本文引用地址:http://www.ex-cimer.com/article/201611/318483.htmvoid TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時(shí)鐘使能
TIM_DeInit(TIM2);
//定時(shí)器TIM2初始化
TIM_TimeBaseStructure.TIM_Period = 7199; //設(shè)置在下一個(gè)更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =9; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 輸出周期為T=(Prescaler+1)(Period+1)/72M
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(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寄存器
}
這是定時(shí)器的更新中斷,還有定時(shí)捕獲模式等,這些可以更加靈活的用于一些需要定時(shí)器的問題中,
評論