• STM32个人笔记-定时器


    笔记来源于STM32F103VET6,野火指南者,中文参考手册,HAL库开发手册和b站的野火指南者中级篇视频。观看过好多次高级篇了,但往往理解得不够全面,现记下小笔记,用来回顾。属于个人笔记,不用于商业。​​​​​ 

    STM32F1系列中,除了互联性的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。

      

    基本定时器只能定时,没有外部IO。 

    通用定时器可以定时,输出比较(如PWM),输入捕获(如脉冲),每个定时器有四个外部IO。

    高级定时器可以定时,输出比较(如PWM),输入捕获(如脉冲),三相电机互补输出,每个定时器有八个外部IO。

    基本定时器

    基本定时器功能框图

    对于框图第一点,时钟源。

    定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分配器分频提供。根据时钟树,得知如果APB1预分配系数等于1,则频率不变,否则频率系数*2。时钟树的APB1为低速时钟,经AHB2分频所得,即PCLK1=36M。所以定时器时钟TIMxCLK=36M*2=72M。

    对于框图第二点,PSC预分频器。

    定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。 PSC 是一个 16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。具体计算方式为: CK_CNT=TIMxCLK/(PSC+1)。

    对于框图第三点,CNT计数器。

    计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。

    对于框图第四点,ARR自动重装载寄存器。

    自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。如果使能了中断的话,定时器就产生溢出中断。

    定时时间的计算


    如:psc=71,add=999。则计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于:1/72M/72=1us。1000*1us=1ms。

    初始化结构体

    1. typedef struct
    2. {
    3. uint16_t TIM_Prescaler; //预分配器,0x0000~0xFFFF
    4. uint16_t TIM_CounterMode; //计数模式
    5. uint16_t TIM_Period; //定时周期,0x0000~0xFFFF。
    6. //实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为 0 至 65535
    7. uint16_t TIM_ClockDivision; //时钟分频
    8. uint8_t TIM_RepetitionCounter; //重复计数器,0x00~0xFF
    9. } TIM_TimeBaseInitTypeDef;

    对于TIM_CounterMode,有。基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初始化。

    1. #define TIM_CounterMode_Up ((uint16_t)0x0000) //边沿对齐模式,向上计数
    2. #define TIM_CounterMode_Down ((uint16_t)0x0010) //边沿对齐模式,向下计数
    3. #define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) //中央对齐模式1,计数器交替向上向下计数。
    4. //产生下溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。
    5. #define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) //中央对齐模式2,计数器交替向上向下计数。
    6. //产生上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。
    7. #define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) //中央对齐模式3,计数器交替向上向下计数。
    8. //产生下溢和上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。

    对于TIM_ClockDivision,有。设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。

    1. #define TIM_CKD_DIV1 ((uint16_t)0x0000)
    2. #define TIM_CKD_DIV2 ((uint16_t)0x0100)
    3. #define TIM_CKD_DIV4 ((uint16_t)0x0200)

    对于TIM_RepetitionCounter。属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数。这里不用设置。

    重复计数器的值。 每当RCR下计数为0时,就会产生一个更新事件,并从RCR值(N)重新开始计数。  这意味着在PWM模式下(N+1)对应于:  

    -边缘对齐模式下的PWM周期数  。

    -中心对齐模式下的半PWM周期数  。

  • 相关阅读:
    Java:Java 仍然很棒的7个原因
    JS对树结构进行模糊搜索,支持多关键字多字段搜索以及排序
    redis主从从,redis-7.0.13
    应急响应-计划任务排查
    (附源码)计算机毕业设计SSM教师教学质量评价系统
    【智能客服】聊天机器人的过去与未来
    Java ArrayList 与 LinkedList 的灵活选择
    Clickhouse分布式表式对本地表的对比
    一些服务器常见漏洞的修复方法
    【无标题】灵遁者:一个好听的名字当然重要,因为这个名字代表你
  • 原文地址:https://blog.csdn.net/weixin_47077788/article/details/125599860