首先感谢河北科技大学航模协会-能给我这样的学习机会-感谢那些带我们教我们的学长学姐们.
如果我们想要去每隔一段时间去做一件事,或者说特定的时间去做某件事,但是我们所有的精力不能放在计时上,我们有主要的事情要做,但是我们还必须每隔一段时间就要做另外一件事.我们就必须找一个可以计时的东西,它的工作就是每隔特定的时间告诉我们一声.这样,我们既可以做那个主要的事,每隔一段时间需要做的事也可以做,这个计时的东西就是定时器.
与配置io口类似,定时器的初始化也是给一个结构体变量赋值,把参数传送给初始化函数.
下面是定时器3初始化的一个例子
void tim3(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period =1000-1;
TIM_TimeBaseStructure.TIM_Prescaler = 35999;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}
TIM_TimeBaseInitTypeDef结构体变量类型名
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);打开apb1总线上的定时器3的时钟
TIM_TimeBaseStructure.TIM_Period =1000-1;分频系数(将主频分割)个人理解
TIM_TimeBaseStructure.TIM_Prescaler = 35999;计数溢出值(计数到这个值产生消息)个人理解
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;时钟分频因子 不懂 默认0即可这个宏的值就是0
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;计数模式 向上计数 其他计数模式见手册
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);传入结构体地址,完成基本配置
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);打开定时器3中断
TIM_Cmd(TIM3,ENABLE);使能定时器3
void tim3youxianji(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断优先级配置,与外部中断相同,将中断通道改为定时器3即可NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn;
void TIM3_IRQHandler(void)
{
.......;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
中断服务函数,每产生一次计时消息进入一次中断服务函数.
计时消息计算公式 计时频率=处理器主频/分频系数/计数溢出值 计时频率即进入中断的频率
声明:转载请注明出处,本人入门级菜鸟,内容大多学习于网络,存在问题太多不一一列举,大佬多多指教.本人QQ941131649