1:高級定時器 計數方式(向上,向下)、預分頻值 1—65532、四通道,輸出輸入捕獲,PWM互補輸出
2:普通定時器 計數方式(向上,向下)、預分頻值 1—65532、四通道,輸出輸入捕獲
3:基本定時器計數方式(向上 )、預分頻值 1—65532、
二:定時器配置方法步驟:
在配置前我們要添加定時器的庫函數 stm32f10x_tim.c
1:配置中斷向量表
2:配置定時器時鐘
3:配置定時器
4:使能定時器
5:使能中斷
三:事例分析(定時中斷3)
1:配置中斷向量表
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //定時器中斷3中斷向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
2:配置定時器時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
3:配置定時器(初始化)
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM3); //復位定時器
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; // 時鐘預分頻數
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 定時器模式 向上計數
TIM_TimeBaseStructure.TIM_Period = 9999; // 自動重裝載寄存器周期的值( 定時時間 ) 累計 0xFFFF
個頻率后產生個更新或者中斷 ( 也是說定時時間到 )
定時器時間計算:
每次進入中斷服務程序間隔時間為((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒
// 72000000/7200=10000
// 10000/10000=1s
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; // 時間分割值
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定時器
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //清除定時器中斷標志
TIM_Cmd(TIM3, ENABLE); // 4:使能定時器
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 打開中斷 溢出中斷 5:使能中斷
}
四:在主函數運行時調用這三個函數對定時器進行配置即可。
五:定時中斷函數的執行
TIME3的定時中斷函數的執行在中斷向量表中,即 stm32f10x_it.c 文件中。
因為使用的函數庫版本不同有的stm32f10x_it.c中給出了void TIM3_IRQHandler(void) {}函數,只需要我們添加相應的中斷服務程序即可,如果stm32f10x_it.c文件中沒有這個函數我們就自己創建一個同名函數即可。
如:
這個例子是判斷中斷標志位是否溢出來進入中斷,如果溢出就執行中斷服務子程序,特別要注意的是在中斷服務執行前或者執行后一定要清楚中斷標志位,以免影響后面中斷的進入。
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);
GPIO_WriteBit(GPIOE, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_3)));
}
}