需要用到的文件和函数如下:
(1)stm32f10x_tim.c
(2)stm32f10x_tim.h
(3) 自定义的定时器初始化函数
void TIM3_Int_Init(u16 arr,u16 psc)
(4)定时器时钟使能
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
(5)定时器参数初始化函数
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
(6)使能定时器方式函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);//使能定时器3更新使能中断
(7)设置中断向量分组以及中断初始化
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
NVIC_Init(&NVIC_InitStrure);
(8)打开定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
TIM_Cmd( TIM3, ENABLE);//打开定时器
(9)编写定时器中断函数
void TIM3_IRQHandler(void)—定时器中断处理函数名必须要用文件中固定的,否则不起作用
(10)获取某种中断的状态
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
TIM_GetITStatus(TIM3, TIM_IT_Update)
(11)清除中断状态标志位
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
1…定时器实验中在库函数文件夹中需要先加入两个头文件
(1)stm32f10x_tim.c
(2)stm32f10x_tim.h
2…在创建的timer.c文件中记得调用加入的 文件
3…对定时器进行初始化
void TIM3_Int_Init(u16 arr,u16 psc)
(1)对定时器时钟进行使能
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
(2)初始化定时器参数
void TIM_TimeBaseInit(TIM_TypeDef TIMx, TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct)**
周期和预分频值再主函数中初始化时进行设置 TIM3_Int_Init(4999,7199);
TIM_TimeBaseStructure.TIM_Period=arr;//tim周期
TIM_TimeBaseStructure.TIM_Prescaler=psc;//预分频值
创建定时器初始化参数结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//定时器参数初始化(周期,预分频,计数模式,时钟分频,重复计数)
TIM_TimeBaseStructure.TIM_Period=arr;//tim周期
TIM_TimeBaseStructure.TIM_Prescaler=psc;//预分频值
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频,不分频,就是72Mhz
//TIM_TimeBaseStructure.TIM_RepetitionCounter=//重复计数(高级定时器才能用到)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
(3)使能定时器中断
void TIM_ITConfig(TIM_TypeDef TIMx, uint16_t TIM_IT, FunctionalState NewState)*
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);//使能定时器3更新使能中断
(4)设置中断向量分组以及中断初始化
void NVIC_Init(NVIC_InitTypeDef NVIC_InitStruct)*
设置中断通道这个参数,在函数中是找不到的,需要到core文件夹中
启动头文件 startup_stm32f10x_hd.s中找到
NVIC_InitStrure.NVIC_IRQChannel=TIM3_IRQn;//通道3
创建中断初始化参数结构体
NVIC_InitTypeDef NVIC_InitStructure;
//中断分组参数初始化
NVIC_InitStrure.NVIC_IRQChannel=TIM3_IRQn;//通道3
NVIC_InitStrure.NVIC_IRQChannelPreemptionPriority=2;抢占优先级
NVIC_InitStrure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_InitStrure.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_Init(&NVIC_InitStrure);
(5)打开定时器
void TIM_Cmd(TIM_TypeDef TIMx, FunctionalState NewState)*
TIM_Cmd( TIM3, ENABLE);//打开定时器
4.写定时器中断处理函数
void TIM3_IRQHandler(void)—定时器中断处理函数名必须要用文件中固定的,否则不起作用
TIM3_IRQHandler 以及各个函数名均在core文件夹中的
启动头文件中startup_stm32f10x_hd.s找到
(1)获取某种中断的状态
ITStatus TIM_GetITStatus(TIM_TypeDef TIMx, uint16_t TIM_IT)*
TIM_GetITStatus(TIM3, TIM_IT_Update)
(2)清除中断状态标志位
void TIM_ClearITPendingBit(TIM_TypeDef TIMx, uint16_t TIM_IT)*
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
总体代码如下
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStrure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
//定时器参数初始化
TIM_TimeBaseStructure.TIM_Period=arr;//tim周期
TIM_TimeBaseStructure.TIM_Prescaler=psc;//预分频值
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;////计数模式,向上计数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频,不分频,就是72Mhz
//TIM_TimeBaseStructure.TIM_RepetitionCounter=//重复计数(高级定时器才能用到)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
//使能定时器中断
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
//中断分组参数初始化
NVIC_InitStrure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStrure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStrure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStrure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStrure);
TIM_Cmd( TIM3, ENABLE);//打开定时器
}
//定时器 3 中断服务程序⑥
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除
LED0=!LED0;
LED1=!LED1;
}
}