stm32 自学笔记 杂记(1-6)(TIM定时器,)

TIM定时器

定时器可以对输入的时钟进行计数,并在计数值达到指定值的时触发中断

16位计数器,预分频器。自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。(2的16次方为65536,72M除以65536的平方的中断频率,并取倒数,约为59.65)

不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型



定时器的类型 

主从触发模

可以使内部硬件在不受程序的控制下实现自动运行(减轻CPU的负担)



基本定时器

 时钟单元

内部时钟的72MHz

预分频器:决定输出频率

输出频率=输入频率÷(预分频器+1)

1:产生中断(更新中断)   通往NVIC

2:产生事件 

自动重装计数器:存储计数目标



通用定时器



预分频时序图 

 

CK:时钟周期

CK_CNT:计数器计数频率

CK_PSC:预分频器的时钟

PSC:预分频数

CK_CNT_OV:计数器溢出频率

ARR:自动重载寄存器

计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)    = CK_PSC / (PSC + 1) / (ARR + 1)



定时器步骤

第一步:开启时钟

第二步:选择时基单元的时基源

第三步;配置时钟源(预分频器,自动重装器,计数模式等等)

第四步:配置中断控制,允许更新中断输出到NVIC;

第五步;配置NVIC

第六步:运行控制



常用函数

恢复缺省配置:

void TIM_DeInit(TIM_TypeDef* TIMx);

时基单元初始化:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx(选择某个定时器), TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
给结构体变量赋一个默认值:

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
使能计数器(运行控制):

void TIM_Cmd(TIM_TypeDef* TIMx(选择定制器), FunctionalState NewState(新的状态));

使能中断输出信号:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT(配置那个中断输出), FunctionalState NewState);
选择内部时钟

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

选择ITRx其他定时器时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource(选择接入那个其他的定时器));

选择TIx捕获通道的时钟

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter(输入的极性和滤波器));

选择ETR通过外部时钟模式1输入的时钟

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

选择ETR通过外部时钟模式2输入的时钟

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

单独配置ETR引脚的预分频器,极性,滤波器

void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);

单独写预分频值

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
改变计数器的计数模式

void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
自动重装器预装功能配置

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
给计数器写入值

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
给自动重装器写入值

void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
获取当前计数器的值

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
获取当前预分频器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
获取标志位,清除标志位

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

 

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值