一、编程要点
1、初始化时基结构体
2、配置中断优先级
3、写中断服务函数
4、写主函数
二、定时时间计算
定时时间 = 中断周期 * 中断次数 (以1S为例)
TIM_Prescaler -> TIMxPSC 寄存器
TIM_Period -> ARR (自动重装载寄存器)
TIMxCLK 系统时钟
CK_CLK = 1/(TIMxCLK/(PSC+1)) =1
中断周期 = 1/(CK_CLK * ARR) =0.001s
中断次数(time) =1000 定时时间 1*0.001*1000=1s
三、结构体&库函数
1、定时器初始化结构体
typedef struct
{
uint16_t TIM_Prescaler; /*!< 预分频器 配置TIMxPSC 寄存器 */
//uint16_t TIM_CounterMode; /*!< 计数器模式 向上/向下 基本定时器不用配置 */
uint16_t TIM_Period; /*!< 定时周期 配置 ARR (自动重装载寄存器) */
//uint16_t TIM_ClockDivision; /*!< 时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟
频率分频比,基本定时器不用配置 */
//uint8_t TIM_RepetitionCounter; /*!< 重复计数器 高级定时器专属 用于产生多少个PWM波 */
} TIM_TimeBaseInitTypeDef;
2、清除中断标志函数
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
TIM_ClearFlag( BASIC_TIMx , TIM_FLAG_Update); //清除中断标志
@brief 清除中断标志
@param1:TIM外设号
@param2:要清除的标志位
3、TIM中断使能函数
扫描二维码关注公众号,回复:
1838189 查看本文章
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
TIM_ITConfig(BASIC_TIMx ,TIM_IT_Update,ENABLE); //开启中断使能
@brief :开启中断使能
@param1:TIM外设号
@param2:中断源
@param3:使能或失能
四、中断服务函数
void TIM6_IRQHandler(void)
{
Timer++;
TIM_ClearFlag( BASIC_TIMx, TIM_FLAG_Update);//清除中断标志位
}
五、程序源码
1、BASIC_Timer.h
#ifndef __BASIC_TIMER_H
#define __BASIC_TIMER_H
#include "stm32f10x.h"
#define RCC_APBxPeriphClockCmd RCC_APB1PeriphClockCmd
#define RCC_APBx_Periph RCC_APB1Periph_TIM6
#define BASIC_TIMx TIM6
#define TIM_INQx TIM6_IRQn
void TIM6_Init(void);
#endif //__BASIC_TIMER_H
2、BASIC_Timer.c
#include "BASIC_Timer.h"
static void TIM_NVIC_Config(void) //配置嵌套向量中断控制器
{
NVIC_InitTypeDef NVIC_InitStructure; //定义初始化结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC 为优先级组1
NVIC_InitStructure.NVIC_IRQChannel = TIM_INQx; //中断源 TIM6
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级
NVIC_Init(&NVIC_InitStructure);
}
static void BASIC_TimerInit(void)
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APBxPeriphClockCmd( RCC_APBx_Periph, ENABLE);
TIM_InitStructure.TIM_Prescaler = 71;
TIM_InitStructure.TIM_Period = 1000;
TIM_TimeBaseInit(BASIC_TIMx, &TIM_InitStructure);
TIM_ClearFlag( BASIC_TIMx , TIM_FLAG_Update); //清除中断标志
TIM_ITConfig(BASIC_TIMx ,TIM_IT_Update,ENABLE); //开启中断使能
TIM_Cmd( BASIC_TIMx, ENABLE);
//RCC_APBxPeriphClockCmd( RCC_APBx_Periph, DISABLE);
}
void TIM6_Init(void)
{
TIM_NVIC_Config();
BASIC_TimerInit();
}
3、main.c
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
#include "bsp_led.h"
#include "exti.h"
#include "BASIC_Timer.h"
uint32_t Timer=0;
int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
LED_GPIO_Config();
EXTI_Key_Config();
TIM6_Init();
while(1)
{
if(Timer==1000)
{
GPIOB->ODR^=GPIO_Pin_5;// LED1 取反
Timer=0;
}
}
}