layout: post

tags: [STM32]

comments: true

重点内容

不管是基于标准库还是直接操作寄存器,因为TIM定时器的功能比较多,这里单纯只从定时器的角度进行学习,这里需要重点关注的地方应该有以下几点:

  • 定时器时钟频率的计算;
  • 计数器计数的模式,以及一般模式会有哪些应用场景;
    • 向上计数
    • 向下计数
    • 中央对齐模式:该模式下需要关注触发中断几种的方式
      • 向上溢出中断;
      • 向下溢出中断;
      • 向上和向下都产生溢出中断;

时基单元

TIM1定时器是一个16位计数器以及相关的自动装载寄存器,比较寄存器,预分频器,可以实现向上,向下,或者向上再向下的计数模式;

基本的时基单元分为:

  • 计数器寄存器(TIMx_CNT)
  • 预分频器寄存器 (TIMx_PSC)
  • 自动装载寄存器 (TIMx_ARR)
  • 重复次数寄存器 (TIMx_RCR)

可以参考STM32参考手册查看相关的寄存器配置说明

下面是TIM功能的整体框图,功能很多,提取了一下计数器的寄存器相应关系;

标准库中,时基单元封装到结构体TIM_TimeBaseInitTypeDef中;

源码如下;

/**
* @brief TIM Time Base Init structure definition
* @note This structure is used with all TIMx except for TIM6 and TIM7.
*/ typedef struct
{
uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock.
This parameter can be a number between 0x0000 and 0xFFFF */ uint16_t TIM_CounterMode; /*!< Specifies the counter mode.
This parameter can be a value of @ref TIM_Counter_Mode */ uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */ uint16_t TIM_ClockDivision; /*!< Specifies the clock division.
This parameter can be a value of @ref TIM_Clock_Division_CKD */ uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;

基于标准库的时钟频率计算:

TIMclock = SYSclock * 1/TIM_Prescaler * TIM_Period


/* Compute the value to be set in ARR regiter to generate signal frequency at 17.57 Khz */
TimerPeriod = (SystemCoreClock / 17570 ) - 1;
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = TIM_PSCReloadMode_Update;
//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

计数模式

  • 向上计数模式

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up
  • 向下计数模式

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down
  • 中央对齐模式

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1

中央对齐模式可以配置TIMx_CR1寄存器的CMS[1:0]位,从而有三种模式可以选择:

CMS[1:0] 选择中央对齐模式 (Center-aligned mode selection)
00 边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。
01 中央对齐模式1。计数器交替地向上和向下计数。产生下溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。
10 中央对齐模式2。计数器交替地向上和向下计数。产生上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。
11 中央对齐模式3。计数器交替地向上和向下计数。产生下溢和上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。

具体如下图所示;

最新文章

  1. 【转】 jquery遍历json数组方法
  2. Security10:授予访问Object的权限
  3. java运行过程
  4. IntelliJ IDEA 使用说明(For Eclipse user)
  5. 真假云主机,VPS资料集合
  6. Android Handler传值方式
  7. JAVA 快递查询接口API调用-快递鸟接口
  8. J2EE基础总结(1)——J2EE入门
  9. 权威指南之脚本化jquery
  10. [POJ1723]SOLDIERS(中位数)
  11. IntellJ IDEA下写JUnit
  12. url中特殊符号转换
  13. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十二之铭文升级版
  14. 【MySQL】死锁问题分析
  15. “全栈2019”Java多线程第三十三章:await与signal/signalAll
  16. MyEclipse10下创建web项目并发布到Tomcat
  17. Apache Thrift - 可伸缩的跨语言服务开发框架 ---转载
  18. PECL: configuration option &quot;php_ini&quot; is not set to php.ini location
  19. c实现 简单的文件管理 不含交互
  20. 优雅的go语言--入门篇

热门文章

  1. python批量爬取动漫免费看!!
  2. Cobalt Strike系列教程第六章:安装扩展
  3. SQLi —— 逗号,空格,字段名过滤突破
  4. selenium 时间等待的方法
  5. Spring5:面向切面
  6. Python网络爬虫:伪装浏览器
  7. 文件读取的时候要留意 -- 序列化serialize()与反序列化unserialize():
  8. 2019-2020-1 20199303《Linux内核原理与分析》第五周作业
  9. 对 ThreadLocal 的了解(一)
  10. 怎么在java中关闭一个thread