目录
背景
程序
第一步、使能PCLK1外设时钟编辑
第二步、时基单元配置
第三步、配置NVIC(设置定时中断优先级)编辑
第四步、使能溢出中断
第五步、使能定时器
第六步、填写中断处理函数(ISR)
背景
在单片机开发当中,我们可以经常看到定周期函数。这些定周期函数都是通过定时器最基本定时中断功能。如果学习前面的PWM。会更快的了解相关概念。
时基单元
可编程通用定时器的主要部分是一个
16
位计数器和与其相关的自动装载寄存器。这个计数器可
以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。
计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。
时基单元包含:
● 计数器寄存器
(TIMx_CNT)
● 预分频器寄存器
(TIMx_PSC)
● 自动装载寄存器
(TIMx_ARR)
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在
TIMx_CR1
寄存器中的自动装载预装载使能位
(ARPE)
的设置,预装载寄存器的内容被立即或在
每次的更新事件
UEV
时传送到影子寄存器。当计数器达到溢出条件
(
向下计数时的下溢条件
)
并当
TIMx_CR1
寄存器中的
UDIS
位等于
’0’
时,产生更新事件。更新事件也可以由软件产生。随后会
详细描述每一种配置下更新事件的产生。
程序
//定时器时间计算公式Tout = ((重装载值+1)*(预分频系数+1))/时钟频率;
//例如:1秒定时,重装载值=9999,预分频系数=7199
void TIM3_Init(u16 arr,u16 psc){ //TIM3 初始化 arr重装载值 psc预分频系数
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重装载值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器向上溢出
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); //TIM3初始化设置
TIM3_NVIC_Init (); //开启TIM3中断向量
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//使能TIM3中断
TIM_Cmd(TIM3,ENABLE); //使能TIM3
}
void TIM3_NVIC_Init (void){ //开启TIM3中断向量
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x3; //设置抢占和子优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
第一步、使能PCLK1外设时钟
第二步、时基单元配置
输入到计数器的时钟为 72 000 000 /(7199 +1) = 1 000HZ
计数器溢出时长生Update中断频率: 10000HZ /(9999+1) =1HZ
为何+1有在PWM中介绍。
第三步、配置NVIC(设置定时中断优先级)

第四步、使能溢出中断
计数器溢出的中断就是update中断
第五步、使能定时器
第六步、填写中断处理函数(ISR)
void TIM3_IRQHandler(void){ //TIM3中断处理函数
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){ //判断是否是TIM3中断
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//此处写入用户自己的处理程序
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //取反LED1
}
}