STM32之通用定时器 (2)

再者,我们有请第二大神:初始化大神:TIM_TimeBaseInit(为什么是他呢?为什么?究竟是为什么?啊哈、、请看)

STM32之通用定时器

看到了吧、、所以请不要怀疑大神的地位哈、、至于参数具体是哪些,大家可以打开#include "stm32f10x_tim.h"哈,在这里就不多说了、、相信大家都是聪明人、

前两位大神出来了,我们还有大神、、哎、、大神无处不在、、来、有请类型中断使能大神

void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState  NewState)

 

看到中断、、大家又有想到什么猫腻没??条件发射就是这样炼成的、、没错了、、就是中断优先级设置大神啦、、这个大家应该有印象、我就不细说了哈,没印象的话这位大神可就要躲到某个角落伤心了,

看到以上大神、、其实还有一位大神没出现、、此大神没出现、、其他大神啥都不是、、对了、就是定时器启动大神

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

好了、、最后,编写中断服务函数,在中断函数里检查中断标志位中断标志位,还有你想要做的事,相信大家也是比较熟悉的了、、

   在这里,我们来谈谈时钟的问题、、大家可以看到系统时钟树图里:

STM32之通用定时器

看到我美丽销魂的涂鸦没、、由于我的系统时钟初始化是36MHZ的、而且设置APB1的预分频系数为2,所以定时器的时钟就为72MHZ,大家可以根据自己的系统时钟设置选择哈、、

到此,我们来总结下使用中断的定时器:

1.开启挂载在ABP1上的TIM3的时钟

2.对定时器进行初始化

3.设置中断类型

4.设置中断优先级

5.开启定时器3

6.编写中断服务函数 看一下参考代码:

1 void Timer_3_Init(u16 arr,u16 psc) 2 { 3 4 //Tout = (arr + 1) * (psc + 1) / 72; 5 6 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 7 NVIC_InitTypeDef NVIC_InitStructure; 8 9 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //1 此数字对应上面的步骤 10 11 TIM_TimeBaseStructure.TIM_Period = arr; //这个值在0~65535之间 为16位计数值 //2 12 TIM_TimeBaseStructure.TIM_Prescaler = psc; 13 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 14 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 15 TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure); 16 17 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //3 18 19 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //4 20 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 21 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 22 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 23 NVIC_Init(&NVIC_InitStructure); 24 25 TIM_Cmd(TIM3, ENABLE); //5 26 } 27 28 void TIM3_IRQHandler(void) //6 29 { 30 if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) 31 { 32 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); 33 LED1 = !LED1; 34 } 35 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdyyj.html