单片机
返回首页

基于霸道秉火的STM32F103ZET6嵌入式开发之------定时器中断3

2025-09-11 来源:cnblogs

 1 #include 'time.h'

 2 #include 'led.h'

 3 #include 'beep.h'

 4 //¶¨Ê±Æ÷ÖжÏ3³õʼ»¯

 5 void TIME3_Ini_Init(u16 arr,u16 psc)

 6 {

 7     NVIC_InitTypeDef NVIC_InitStructure;

 8     TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;

 9     //中断使能TIM3

10     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

11     

12     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分割

13     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数

14     TIM_TimeBaseInitStructure.TIM_Period = arr;//时钟周期

15     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//预分频系数16     //TIM_TimeBaseInitStructure.TIM_RepetitionCounter = ;

17     TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

18     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );//TIM3使能

19     

20     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//时间中断通道3

21     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能

22     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//其优先级0

23     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//抢占优先级3

24     

25     NVIC_Init(&NVIC_InitStructure);

26     TIM_Cmd(TIM3,ENABLE);

27     

28 }

29 //定时器中断3服务函数

30 void TIM3_IRQHandler(void)

31 {

32 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //判断是否又中断发生

33     {

34         TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除跟新中断标志位

35         LED1=!LED1;// 点灯

36         //Beep =1;

37     }

38 

39 }


一:定时器的时钟来源有 4 个:

1)内部时钟(CK_INT)

2)外部时钟模式 1:外部输入脚(TIx)

3)外部时钟模式 2:外部触发输入(ETR)

4)内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。


二:定时器3中断初始化过程:


编写定时器中断初始函数:void TIM3_Int_Init(u16 arr,u16 psc);其中arr为:自动重装值,psc:预分频系数


1,时钟TIM3使能


2,TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化 TIM3


3,TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //允许更新中断


void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);


第一个参数是选择定时器号,这个容易理解,取值为 TIM1~TIM17。

第二个参数非常关键,是用来指明我们使能的定时器中断的类型,定时器中断的类型有很

多种,包括更新中断 TIM_IT_Update,触发中断 TIM_IT_Trigger,以及输入捕获中断等等。

第三个参数就很简单了,就是失能还是使能。


4,进行中断优先级设置


5,使能TIM_Cmd(TIM3, ENABLE); 


代码如下:

 

 三,编写TIM3_IRQHandler()定时器3中断服务函数中断

第一步:判断定时器中断3是否发生

第二步:清除中断更新中断标志位

第三步:编写逻辑函数

 

 第四步:编写主函数

其中:TIME3_Ini_Init();溢出时间计算为:

溢出时间为 500ms,即 Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。

注意:启用中断切记不要忘了在主函数中设置中断优先级分组;NVIC_PriorityGroupConfig(); 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组2 

TIM3_Int_Init()该函数的 2 个参数用来设置 TIM3 的溢出时间。系统
初始化的时候在默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2分频,所以 APB1 的时钟为 36M,而从 STM32 的内部时钟树图得知:当 APB1 的时钟分频数为 1 的时候,TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此,TIM3 的时钟为 72M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。计算公式如下:
Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。
timer.h 文件的代码非常简单,一些函数申明,这里就不讲解。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章