定时器分类 1,基本定时器TIM6、TIM7;计时,能产生中断,没有输入输出引脚;
2,通用计时器TIM2、TIM3/TIM4/TIM5;计时、中断、比较/捕获,PWM方波输出,编码器接口;
3,高级定时器TIM1、TIM8;上面都具有,还具有三相6步电机的接口、刹车功能以及用于PWM驱动电路的四驱时间控制。
时钟源 TIM2-TIM7的时钟源是APB1
TIM1、TIM8的时钟源是APB2
应用代码 使用TIM2的基本定时器功能,配置过程
1、配置TIM2,打开时钟,重装载值设置(周期),时钟分频器,计数方式,使能中断
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
/* 打开时钟 72MHZ */
TIM_TimeBaseStructure.TIM_Period=1000;
/* 重装载值*/
TIM_TimeBaseStructure.TIM_Prescaler= 71;
/*时钟预分频数72,也就是本来72M,现在是1M */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
/* 对外部时钟进行采样的时钟频率,这里没有用到 */
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//设置TIM2参数
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//清除标志位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//使能中断TIM_Cmd(TIM2, ENABLE);
//使能定时器
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE);
/*先关闭,等待使用*/
}
接下来配置中断优先级
void TIM2_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//无主优先级,次优先级为16个
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
//指定中断服务函数
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
//这里0-15都可以
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
接下来写中断服务函数
extern volatile u32 time;
//volatile是修饰字符,不用优化
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
time++;
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
}
【STM32定时器使用(一)时钟定时】主函数的循环
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
//打开时钟开始计数
while(1)
{
if ( time == 1000 ) /* 1000 * 1 ms = 1s 周期,中断1000次,中断中期为1/1M = 1ms */
{
time = 0;
//做自己的事
}
}
推荐阅读
- stm32|基于STM32和freeRTOS智能门锁设计方案
- 日常分享|共享充电宝方案原理,具体部件组成以及主控MUC参数
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- STM32|STM32的四种IO输出模式
- STM32 远程升级(ISP / IAP)
- stm32|stm32f103can总线过滤器配置
- STM32CubeMX配置SDIO模式(非DMA方式)
- STM32|如何建一个STM32F030标准库工程模板
- STM32 时钟RCC相关配置参考stm32f10x_rcc.h
- STM32 NVIC