stm32 定时器TIM时钟步骤

1)TIM3 时钟使能 。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE); //时钟使能

2) 初始化定时器参数,设置自动重装值, 分频系数,计数方式等。

定时器的初始化函数TIM_TimeBaseInit

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,
TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); //前面指是哪个TIM,后面指TimeBaseInitStruct结构体指针。

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   //定义TIM初始化类型结构体变量

TIM_TimeBaseStructure.TIM_Period = 5000;   //设置自动重载计数周期值

TIM_TimeBaseStructure.TIM_Prescaler =7199;   //设置分频系数

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频因子

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置为向上计数方式

TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);  //初始化时钟TIMx

3) 设置 TIM3_DIER 允许更新中断 。

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
第一个参数是选择定时器号,这个容易理解,取值为 TIM1~TIM17。
第二个参数非常关键,是用来指明我们使能的定时器中断的类型,定时器中断的类型有很
多种,包括更新中断 TIM_IT_Update,触发中断 TIM_IT_Trigger,以及输入捕获中断等等。
第三个参数就很简单了, 就是失能还是使能 。

4) TIM3 中断优先级设置。

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 0 级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
TIM_Cmd(TIM3, ENABLE); //⑤使能 TIM3

5) 允许 TIMx工作,也就是使能 TIMx。

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) ;

6) 编写中断服务函数。

在固件库函数里面, 用来读取中断状态寄存器的值判断中断类型的函数是:
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t) ;

固件库中清除中断标志位的函数是:

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) ;

例如:我们判断定时器3是否发生更新(溢出)中断,并清除中断标志位。

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {

  TIM_ClearITPendingBit(TIM3, TIM_IT_Update );

}

//定时器 3 中断服务程序⑥
void TIM3_IRQHandler(void) //TIM3 中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志
LED1=!LED1;
}
}

知识来源:STM32F1开发指南-库函数版本_V3.1

上一篇:Trove系列(一)—入门篇


下一篇:斯坦福机器学习实现与分析之八(kmeans算法)