当前位置:   article > 正文

stm32学习笔记——TIM定时器中断_tim_etrclockmode2config(tim1, tim_exttrgpsc_off, t

tim_etrclockmode2config(tim1, tim_exttrgpsc_off, tim_exttrgpolarity_noninver

本节我们介绍通用定时器的定时中断功能,通用定时器就是在基本定时器的定时功能上加上了时钟源选择,看下面两幅框图即可一目了然

 通用定时器的2和基本定时器一样,只是多了一个时钟源选择1,2这一部分被称为时基单元,那我们就先对时基单元展开描述

时基单元

时基单元由16位的预分频器,16位的计数器,16位的重装寄存器,操作步骤大概为时钟经过分频器分频,然后每来一个时钟计数器计数,当计数器溢出产生中断请求和更新事件,重装寄存器给计数器赋初值(向上计数不存在),那么我们就具体来论述每一个部分。

分频器

分频器本质上是一个计数器,可以看下图预分频计数器,当你赋值给1时,实际上是对时钟源二分频也就是对半分,因为给1之后计数从0~1循环,因为是16位的寄存器,所以分频系数PSC可以给的很大,最大65535

计数器

先介绍三种计数方式

  1. 向上计数,从0一直加到重装寄存器的值(常用)
  2. 向下计数,从重装寄存器的值一直减到0 
  3. 中央对齐,像个三角波,从0到寄存器-1,从寄存器值到1

 重装寄存器

重装寄存器在计数方式的介绍中可以看出有两种功能

  1. 给计数器赋初值
  2. 与计数器作比较

 缓冲寄存器

重装寄存器和预分频寄存器都具有缓冲寄存器,缓冲寄存器可以让他们随时被写入,但生效的时机可以自由选择,是立刻生效还是等待更新事件之后,这个功能可以被函数开启或关闭,具体体会看下面的图

 中断和更新事件

计数器计数溢出会产生一个中断(如果使能了)和一个更新事件,更新事件更新所有寄存器

时钟源的选择 

我们主要讲内部时钟,外部时钟模式1和2,且只说调用方法

内部时钟

 内部时钟由系统时钟提供,为72MHZ,内部时钟代码调用

TIM_InternalClockConfig(TIM2);内部时钟调用

外部时钟模式2

外部时钟只有一个时钟源,就是ETR引脚,我只知道TIM2的ETR引脚是PA0,其他的TIM就不知道了 ,由图看来,要配置外部时钟模式2,需要配置ETR引脚信号的极性选择,分频系数,滤波器

  1. 极性选择,就是接了一个非门,变相选择上升沿还是下降沿有效
  2. 分频系数,跟极性选择配合起来,就是来分频系数个边沿才作为一个脉冲
  3. 滤波器(不太懂)

配置代码

  1. TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);
  2. *TIM2:TIMx
  3. *TIM_ExtTRGPSC_OFF:不对外部信号分频
  4. TIM_ExtTRGPSC_DIV2:2分频
  5. TIM_ExtTRGPSC_DIV4:4分频
  6. TIM_ExtTRGPSC_DIV8:8分频
  7. *TIM_ExtTRGPolarity_NonInverted:上升沿有效
  8. TIM_ExtTRGPolarity_Inverted:下降沿有效
  9. *0x00:滤波器,0x00~0x0F

外部模式1

最后,我们配置定时器定时中断的步骤就清晰了

  1. 时钟源
  2. 时基单元
  3. 中断使能
  4. 总开关控制

差点忘记最重要的一点了,如何计算定时中断的时间

中断频率  =  时钟源频率 /  分频系数+1  /  重装值+1  (以内部时钟,向上计数为例)

中断时间  =  中断频率倒数

例如我想产生一个1s的中断信号,也就是中断频率为1HZ,可以给分频系数7200-1,重装值10000-1以此来产生1s的中断

 TIM初始化代码

  1. void MyTIM_Init(void)
  2. {
  3. 开启时钟
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  6. 选择内部时钟
  7. TIM_InternalClockConfig(TIM2);
  8. 选择外部时钟ETR,外部时钟模式2
  9. TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);
  10. *TIM2:TIMx
  11. *TIM_ExtTRGPSC_OFF:不对外部信号分频
  12. TIM_ExtTRGPSC_DIV2:2分频
  13. TIM_ExtTRGPSC_DIV4:4分频
  14. TIM_ExtTRGPSC_DIV8:8分频
  15. *TIM_ExtTRGPolarity_NonInverted:上升沿有效
  16. TIM_ExtTRGPolarity_Inverted:下降沿有效
  17. *0x00:滤波器,0x00~0x0F
  18. 选择外部时钟ETR,但是外部时钟模式1
  19. TIM_ETRClockMode1Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0X00);
  20. *TIM2:TIMx
  21. *TIM_ExtTRGPSC_OFF:不对外部信号分频
  22. TIM_ExtTRGPSC_DIV2:2分频
  23. TIM_ExtTRGPSC_DIV4:4分频
  24. TIM_ExtTRGPSC_DIV8:8分频
  25. *TIM_ExtTRGPolarity_NonInverted:上升沿有效
  26. TIM_ExtTRGPolarity_Inverted:下降沿有效
  27. *0x00:滤波器,0x00~0x0F
  28. TIM_SelectInputTrigger(TIM2,TIM_TS_ETR);时钟源选择
  29. This parameter can be one of the following values:
  30. * @arg TIM_TS_ITR0: Internal Trigger 0
  31. * @arg TIM_TS_ITR1: Internal Trigger 1
  32. * @arg TIM_TS_ITR2: Internal Trigger 2
  33. * @arg TIM_TS_ITR3: Internal Trigger 3
  34. * @arg TIM_TS_TI1F_ED: TI1 Edge Detector
  35. * @arg TIM_TS_TI1FP1: Filtered Timer Input 1
  36. * @arg TIM_TS_TI2FP2: Filtered Timer Input 2
  37. * @arg TIM_TS_ETRF: External Trigger input
  38. ETR引脚初始化
  39. GPIO_InitTypeDef GPIO_InitStructure;
  40. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  41. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  42. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  43. GPIO_Init(GPIOA, &GPIO_InitStructure);
  44. 时基单元初始化
  45. TIM_TimeBaseInitTypeDef TIM_InitStructure;
  46. TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;高级定时器的功能
  47. TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;
  48. TIM_InitStructure.TIM_Period=7200-1;重装值
  49. TIM_InitStructure.TIM_Prescaler=10000-1;分频系数
  50. TIM_InitStructure.TIM_RepetitionCounter=0x00;高级定时器的功能
  51. TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
  52. 中断使能,计数器溢出中断是TIM_IT_Update
  53. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  54. NVIC配置
  55. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  56. NVIC_InitTypeDef NVIC_InitStructure;
  57. NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  58. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  59. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  60. NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  61. NVIC_Init(&NVIC_InitStructure);
  62. 总开关
  63. TIM_Cmd(TIM2,ENABLE);
  64. }

中断服务函数

  1. void TIM2_IRQHandler(void)
  2. {
  3. if(TIM_GetFlagStatus(TIM2,TIM_IT_Update)==SET)
  4. {
  5. 执行内容
  6. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  7. }
  8. }

Time.h函数库中与这一节比较重要的函数

TIM_TimeBaseInit                     时基单元初始化
TIM_Cmd                           总开关控制
TIM _ITConfig                    中断使能
TIM_InternalClockConfig          内部时钟
TIM_ETRClockMode1Config              外部时钟模式1
TIM_ETRClockMode2Config              外部时钟模式2
TIM_SelectInputTrigger                      外部时钟模式1的时钟源选择
TIM_PrescalerConfig                   写分频系数,同时使能或失能预分频寄存器的缓冲功能
TIM_CounterModeConfig           计数模式选择
TIM_ARRPreloadConfig             使能或使能重装寄存器的缓冲功能
TIM_SetCounter设置 TIMx 计数器寄存器值
TIM_SetAutoreload                      设置重装值
TIM_GetCounter获得 TIMx 计数器的值
TIM_GetPrescaler           获得分频系数
TIM_GetFlagStatus检查指定的 TIM 标志位设置与否
TIM_ClearFlag清除 TIMx 的待处理标志位
TIM_GetITStatus

检查指定的 TIM 中断发生与否

TIM_ClearITPendingBit               清除中断标志位

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/285282
推荐阅读
相关标签
  

闽ICP备14008679号