定時器溢出中斷,在程序設計中經常用到。在使用TIM1和TIM8溢出中斷時,需要注意“TIM_TimeBaseStructure.TIM_RepetitionCounter=0;”,它表示溢出一次,并可以設置中斷標志位。?? ?
TIM1_Interrupt_Initializtion(1000,72);?//當arr=1000,psc=72時,則為1ms溢出一次就設置中斷標志位,,誤差為1us;
因為標準庫默認TIM_TimeBaseStructure.TIM_RepetitionCounter=10,就表示溢出10次,才設置中斷標志位。
若忘記設置,就是導致溢出時間不準確,嚴重會浪費調試時間。
時間久了,就會忘記,還是記錄一下,加深記憶。
TIM1程序如下:
#include "Timer1.h"u16 TIM1_MillisecondCounter;
u8 TIM1_SecondFlag;void TIM1_Interrupt_Initializtion(u16 arr,u16 psc);//函數聲明//定時器1中斷初始化
//APB2時鐘為72MHz
//arr:自動重裝值。
//psc:時鐘預分頻數
//TIM_CKD_DIV1:定時器時鐘 = 輸入頻率
//TIM_CKD_DIV2:定時器時鐘 = 輸入頻率/2
//TIM_CKD_DIV4:定時器時鐘 = 輸入頻率/4
//TIM1溢出時間: arr*psc/72000000/TIM_CKD_DIVx
//TIM1_Interrupt_Initializtion(1000,72);//當arr=1000,psc=72時,則為1ms,誤差為1us;
void TIM1_Interrupt_Initializtion(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;
// u8 ch;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定時器TIM1的APB2外設時鐘//定時器TIM1初始化TIM_TimeBaseStructure.TIM_Period = arr-1; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //設置用來作為TIMx時鐘頻率除數的預分頻值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim//計算公式:arr*psc/72000000/1,當arr=1000,psc=72時,則溢出時間為1ms,誤差為1us;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//TIM1溢出一次,則中斷1次;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx的時間基數單位TIM_SetCounter(TIM1,0); //設置TIM1的計數器值為0;TIM_ClearFlag(TIM1, TIM_FLAG_Update); //清除TIM1溢出的待處理標志位TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //清除TIM1中斷的待處理位TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //允許TIM1溢出產生中斷//中斷優先級NVIC設置//NVIC_PriorityGroup_4設置NVIC中斷分組4:表示搶占優先級為4位,取值為0~15,沒有響應優先級,取值為0//NVIC_PriorityGroup_3設置NVIC中斷分組3:表示搶占優先級為3位,取值為0~7,響應優先級只有1位,取值為0~1//NVIC_PriorityGroup_2設置NVIC中斷分組3:表示搶占優先級為2位,取值為0~3,響應優先級只有2位,取值為0~3//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //設置搶占優先級為1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //設置響應優先級為0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化NVIC嵌套向量中斷控制寄存器TIM_Cmd(TIM1, ENABLE);//使能TIM1外設TIM1_MillisecondCounter=0;
}//函數功能:TIM1每1ms溢出中斷一次
void TIM1_UP_IRQHandler()
{if (TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET) //TIM1計數器溢出產生中斷{TIM1_MillisecondCounter++;if(TIM1_MillisecondCounter>=1000){TIM1_MillisecondCounter=0;TIM1_SecondFlag=1;}TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除TIM1計數器的溢出中斷標志;}
}
TIM1頭文件
#ifndef __Timer1_H
#define __Timer1_H
#include "stm32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_textern u8 TIM1_SecondFlag;extern void TIM1_Interrupt_Initializtion(u16 arr,u16 psc);#endif
main,c程序
#include "stm32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "USART1.h"
//注意:"USART1.h"要放在 "stdio.h" 包含文件之后,如果這個位置顛倒了,業不能打印浮點數。
#include "Timer1.h"int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4USART1_Serial_Interface_Enable(115200);printf("\r\nCPU reset\r\n");TIM1_Interrupt_Initializtion(1000,72);//當arr=1000,psc=72時,則為1ms,誤差為1us;while(1){if(TIM1_SecondFlag){TIM1_SecondFlag=0;printf("TIM1_SecondFlag=%u\r\n",TIM1_SecondFlag);}}
}