惠州企业网站建设选哪家,网站推广自己可以做吗,自己怎么建个网站,法治中国建设网站一、TIM 记录学习HAL配置TIM定时器 1.1 简介
TIM#xff08;timer#xff09;定时器#xff0c;16位或32位#xff08;TIM2和TIM5#xff09;计数器、预分频器#xff08;16位#xff09;、自动重装寄存器的时基单元#xff1b;可对输入时钟进行计数#xff0c;在计数…一、TIM 记录学习HAL配置TIM定时器 1.1 简介
TIMtimer定时器16位或32位TIM2和TIM5计数器、预分频器16位、自动重装寄存器的时基单元可对输入时钟进行计数在计数值达到设定值时触发中断根据复杂度和应用场景划分为了高级定时器、通用定时器和基本定时器控制器上所有定时器都是彼此独立的不共享任何资源。
类型编号总线功能高级TIM1、TIM8APB2通用寄存器全部功能重复计数器、死区生成、互补输出和刹车输入通用TIM2 to TIM5、TIM9 to TIM149、10和11在APB2其他在APB1基本定时器全功能内外时钟源选择、输入捕获、输出比较、编码器接口和主从触发模式9-14只支持向上计数基本TIM6、TIM7APB1定时中断、主模式触发DAC功能
1.2 通用定时器
TIM2 to TIM5拥有4个独立通道这里给出通用定时器框图 通过框图可以得到以下信息
TIMx_ETR外部触发接口ETR支持多种输入源输入引脚默认配置、比较器输出和模拟看门狗左侧TIMx_CHx4个独立通道主要用于输入捕获TRGO内部输出通道主要用于定时器级联ADC、DAC的定时器触发OCx4组输出比较单元右侧TIMx_CHx4个独立通道主要用于输出比较
最上面一部分是定时器的时钟选择有四个选择
内部时钟模式 CK_INT一般是84MHz。如果APB分频系数是1则APB总线定时器时钟APB总线时钟如果APB分频系数不是1则APB总线定时器时钟APB总线时钟x2。外部时钟模式1 外部时钟源使用外部输入引脚TIx作定时器时钟源。外部时钟模式2 外部时钟源使用外部触发输入ETR在TIM2 to TIM4中可用。内部触发输入 内部触发输入ITRx使用一个定时器作另一个定时器的时钟源。
框图右上角部分是控制器部分有三个部件
触发控制器对片内的一些外设输出即内部输出通道从模式控制器控制计数器的复位、使能、递增/递减计数编码器接口用于电机控制
框图中间部分是时基单元该部分包括三个寄存器
计数器寄存器TIMx_CNT 计数值是建立在分频的基础上如预分频后频率为84MH在那么计84次数为1us该寄存器以CK_CNT为时钟。预分频寄存器TIMx_PSC 用于设置定时器的分频。自动重加载寄存器TIMx_ARR 自动重加载寄存器是计数器寄存器能达到的最大计数值自动重加载寄存器内容是预装载的对其进行读写操作会访问预装载寄存器预装载寄存器内容既可以永久传送到影子寄存器让设置立即起到效果的寄存器能保证时钟同步也可以在每次更新事件时传送到影子寄存器就是让ARR寄存器的数值立即更新还是在每次更新事件发生的时候更新自动重加载寄存器的值不能直接传到计数器寄存器中间会经过一个影子寄存器最后传到计数器寄存器。
框图左下部分是输入捕获功能外部信号TIx由通道进入先经过输入滤波和边沿检测生成TIxFP1和TIxFP2捕获通道ICx会根据软件对输入信号进行选择后面的预分频器决定发生多少个事件进行一次捕获经过预分频器的信号ICxPS是最终被捕获的信号当发生捕获时计数器CNT的值会被锁存到捕获寄存器CCR中并产生CCxI中断。
框图右下部份是输出比较功能输出比较就是通过定时器的外部引脚对外输出控制信号有冻结、将通道Xx1,2,3,4设置为匹配时输出有效电平、将通道X设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1和PWM2这八种模式。当计数器CNT的值跟CCR的值相等时输出参考信号OCxREF的极性会被改变同时产生比较中断CCxI相应的标志位会置位在经过输出控制器后产生输出信号OCxOCx信号直接就是OCxREF信号。
1.3 时序图分析
预分频计数器时序 在预分频由1变为2的时序图 CK_CNT原以CK_PSC同频在改变分频系数后会等待更新事件以更新CK_CNT频率同时计数器寄存器会清零开始重新计数在写入一个新的分频值时更新事件发生之前计数器寄存器一直使用预分频器缓冲值影子寄存器进行计数在更新事件发生时这个缓冲值才会被更新然后计数器寄存器以更新后的分频值进行计数预分频计数器频率不变仍以预分频缓冲值为极点进行计数。在预分频由1变为4的时序图 CK_CNT原以CK_PSC同频在改变分频系数后会等待更新事件以更新CK_CNT频率同时计数器寄存器会清零开始重新计数在写入一个新的分频值时更新事件发生之前计数器寄存器一直使用预分频器缓冲值影子寄存器进行计数在更新事件发生时这个缓冲值才会被更新然后计数器寄存器以更新后的分频值进行计数预分频计数器频率不变仍以预分频缓冲值为极点进行计数。 计数器计数频率 C K _ C N T C K _ P S C ( P S C 1 ) CK\_CNT \frac{CK\_PSC}{(PSC1)} CK_CNT(PSC1)CK_PSC 定时器定时周期 T 1 C K _ C N T T \frac{1}{CK\_CNT} TCK_CNT1 计数器时序 这里设置ARR0x36改变时钟频率以查看计数器变化CK_INT CK_PSC 分频系数为1 可以看到在使能位出现后CNT在下一个上升沿更新频率计数器寄存器开始计数在遇到极值时计数器溢出事件发生同时更新事件发生产生更新中断标志计数器寄存器重新计数。 分频系数为2 可以看到CNT虽然在下一个上升沿就更新频率但并不是在下一个上升沿就开始工作而是在经过分频系数个上升沿后才开始工作 分频系数为4 分频系数为N 计数器溢出频率 C K _ C N T _ O V C K _ C N T / ( A R R 1 ) C K _ P S C / ( P S C 1 ) / ( A R R 1 ) CK\_CNT\_OV CK\_CNT/(ARR1) CK\_PSC/(PSC1)/(ARR1) CK_CNT_OVCK_CNT/(ARR1)CK_PSC/(PSC1)/(ARR1) 计数器预装时序 计数器无预装值 自动重加载寄存器没有预装值那么影子寄存器中也没有值计数器寄存器当前值会与ARR值进行比较若当前值大于ARR值则产生计数溢出事件若小于ARR值则继续计数直到溢出。 计数器有预装值 自动重加载寄存器没有预装值那么影子寄存器中有值计数器寄存器会以预装值为极值继续计数直到碰到预装值发生计数溢出同时更新ARR即计数极值。
1.4 捕获/比较通道 输入捕获模式 在输入捕获模式捕获/比较寄存器TIMx_CCRx用于在相应的ICx信号检测到转变后锁存计数器的值即通道输入引脚出现指定电平跳变时当前CNT的值会被锁存到CCR中。可用于测量PWM波频率、占空比、脉冲间隔、电平持续时间等可配置为PWMI模式同时测量频率和占空比可配置为主从触发模式实现硬件全自动测量。 输出比较模式 使用时基单元的寄存器仅仅能设置周期不能设置占空比。输出比较OC可以通过比较CNT与CCR的关系来对输出电平进行置1、置0或翻转的操作用于输出一定频率和占空比的PWM波。
二、TIM的HAL库用法
2.1 定时器寄存器结构体
在stm32f4xx.h文件中给出了这个类型定义
typedef struct
{ __IO uint32_t CR1; /*! TIM control register 1, Address offset: 0x00 */ __IO uint32_t CR2; /*! TIM control register 2, Address offset: 0x04 */ __IO uint32_t SMCR; /*! TIM slave mode control register, Address offset: 0x08 */ __IO uint32_t DIER; /*! TIM DMA/interrupt enable register, Address offset: 0x0C */ __IO uint32_t SR; /*! TIM status register, Address offset: 0x10 */ __IO uint32_t EGR; /*! TIM event generation register, Address offset: 0x14 */ __IO uint32_t CCMR1; /*! TIM capture/compare mode register 1, Address offset: 0x18 */ __IO uint32_t CCMR2; /*! TIM capture/compare mode register 2, Address offset: 0x1C */ __IO uint32_t CCER; /*! TIM capture/compare enable register, Address offset: 0x20 */ __IO uint32_t CNT; /*! TIM counter register, Address offset: 0x24 */ __IO uint32_t PSC; /*! TIM prescaler, Address offset: 0x28 */ __IO uint32_t ARR; /*! TIM auto-reload register, Address offset: 0x2C */ __IO uint32_t RCR; /*! TIM repetition counter register, Address offset: 0x30 */ __IO uint32_t CCR1; /*! TIM capture/compare register 1, Address offset: 0x34 */ __IO uint32_t CCR2; /*! TIM capture/compare register 2, Address offset: 0x38 */ __IO uint32_t CCR3; /*! TIM capture/compare register 3, Address offset: 0x3C */ __IO uint32_t CCR4; /*! TIM capture/compare register 4, Address offset: 0x40 */ __IO uint32_t BDTR; /*! TIM break and dead-time register, Address offset: 0x44 */ __IO uint32_t DCR; /*! TIM DMA control register, Address offset: 0x48 */ __IO uint32_t DMAR; /*! TIM DMA address for full transfer, Address offset: 0x4C */ __IO uint32_t OR; /*! TIM option register, Address offset: 0x50 */
} TIM_TypeDef; 2.2 常用API
HAL_TIM_Base_MspInit()底层初始化回调函数在调用HAL_TIM_Base_Init函数时会调用此函数该函数是弱定义的__HAL_TIM_GET_FLAG()函数获取定时器标志位是否被置位__HAL_TIM_CLEAR_FLAG()函数清除定时器标志位
2.3 定时器初始化流程
配置定时器工作模式底层初始化启动定时器外设