1:高級(jí)定時(shí)器 計(jì)數(shù)方式(向上,向下)、預(yù)分頻值 1—65532、四通道,輸出輸入捕獲,PWM互補(bǔ)輸出
2:普通定時(shí)器 計(jì)數(shù)方式(向上,向下)、預(yù)分頻值 1—65532、四通道,輸出輸入捕獲
3:基本定時(shí)器計(jì)數(shù)方式(向上 )、預(yù)分頻值 1—65532、
二:定時(shí)器配置方法步驟:
在配置前我們要添加定時(shí)器的庫函數(shù) stm32f10x_tim.c
1:配置中斷向量表
2:配置定時(shí)器時(shí)鐘
3:配置定時(shí)器
4:使能定時(shí)器
5:使能中斷
三:事例分析(定時(shí)中斷3)
1:配置中斷向量表
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //定時(shí)器中斷3中斷向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
2:配置定時(shí)器時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
3:配置定時(shí)器(初始化)
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM3); //復(fù)位定時(shí)器
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; // 時(shí)鐘預(yù)分頻數(shù)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 定時(shí)器模式 向上計(jì)數(shù)
TIM_TimeBaseStructure.TIM_Period = 9999; // 自動(dòng)重裝載寄存器周期的值( 定時(shí)時(shí)間 ) 累計(jì) 0xFFFF
個(gè)頻率后產(chǎn)生個(gè)更新或者中斷 ( 也是說定時(shí)時(shí)間到 )
定時(shí)器時(shí)間計(jì)算:
每次進(jìn)入中斷服務(wù)程序間隔時(shí)間為((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; // 時(shí)間分割值
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定時(shí)器
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //清除定時(shí)器中斷標(biāo)志
TIM_Cmd(TIM3, ENABLE); // 4:使能定時(shí)器
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 打開中斷 溢出中斷 5:使能中斷
}
四:在主函數(shù)運(yùn)行時(shí)調(diào)用這三個(gè)函數(shù)對(duì)定時(shí)器進(jìn)行配置即可。
五:定時(shí)中斷函數(shù)的執(zhí)行
TIME3的定時(shí)中斷函數(shù)的執(zhí)行在中斷向量表中,即 stm32f10x_it.c 文件中。
因?yàn)槭褂玫暮瘮?shù)庫版本不同有的stm32f10x_it.c中給出了void TIM3_IRQHandler(void) {}函數(shù),只需要我們添加相應(yīng)的中斷服務(wù)程序即可,如果stm32f10x_it.c文件中沒有這個(gè)函數(shù)我們就自己創(chuàng)建一個(gè)同名函數(shù)即可。
如:
這個(gè)例子是判斷中斷標(biāo)志位是否溢出來進(jìn)入中斷,如果溢出就執(zhí)行中斷服務(wù)子程序,特別要注意的是在中斷服務(wù)執(zhí)行前或者執(zhí)行后一定要清楚中斷標(biāo)志位,以免影響后面中斷的進(jìn)入。
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)));
}
}