STM32学习笔记(基于B站江科大标准库教程)

TIM--基本定时器

类型编号总线功能
高级定时器TIM1、TIM8APB2拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器TIM2、TIM3、TIM4、TIM5APB1拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器TIM6、TIM7APB1拥有定时中断、主模式触发DAC的功能

 stm32f103c8t6只有TIM1 TIM2 TIM3 TIM4定时器

功能框图:

 

 基本定时器的核心是时基。

1.预分频器PSC:对输入的基准频率提前进行一个分频操作。预分频器可对计数时钟进行预分频, 输出频率=输入频率/(预分频值+1)[最大值65535+1]

2.实际分频值=预分频值+1 

3.计数器  计数器CNT是一个16位的计数器,只能向上计数,最大计数值为65535。计数达到自动重装寄存器的时候产生更新事件(中断),并且清零从头开始计数。

4.自动重装载寄存器  存储计数目标,达到目标后清零计数器并产生中断信号。

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

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

6.缓冲寄存器:某时刻将预分频器有0改1,当计数到一半的时候改变了分频值,这个变化不会马上生效,⽽是会等到本次计数周期结束时,产⽣了了更新事件,预分频器的值才会被传递到缓冲寄存器⾥⾯去,才会⽣效。 

举个例⼦,如果我们想改变ARR寄存器中的值,但是当前的定时还没有结束,在这时如 果未设置影⼦寄存器,那么设定的值会⽴即⽣效。⽽如果设置了影⼦寄存器,那么新的值会 在当前计数周期结束之后⽣效。

从基准时钟,到预分频器,再到计数器,计数器⾃增,同时不断地与⾃动重装寄存
器进⾏⽐较,计数器和⾃动重装寄存器的值相等时,即计时时间到,这时会产⽣⼀
个更新中断和更新事件, CPU 响应更新中断,就完成了定时中断的任务了。

开启定时器步骤
1. RCC 开启时钟
2. 选择时基单元的时钟源
3. 配置时基单元
4. 配置输出中断控制,允许更新中断输出到 NVIC
5. 配置 NVIC ,在 NVIC 中打开定时器中断的通道,并分配⼀个优先级
6. 运⾏控制
7. 使能计数器

定时器常⽤的库函数


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_TimeBaseStructInit(TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//结构体变量赋⼀个默认值函数
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器函数

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalStateNewState);//使能中断输出信号函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟函数
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_tTIM_InputTriggerSource);//选择ITRx其他定时器的时钟函数
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx,uint16_tTIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIx捕获通道的时钟函数
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_tTIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_tExtTRGFilter);//选择ETR通过外部时钟模式1输⼊的时钟函数
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_tTIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_tExtTRGFilter);//选择ETR通过外部时钟模式2输⼊的时钟函数
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//单独配置ETR引脚的预分频器、极性、滤波器这些参数的函数
代码示例:
void Timer_Init(void)
{
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
 
 TIM_InternalClockConfig(TIM2);//使⽤内部时钟
 
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义时基单元结构体
 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置不分
频
 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设
置向上计数
 TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR⾃动重装值
 TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC不分频
 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,
⾼级定时器特有
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写⼊参数
 
 TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除更新标志位
 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
 
 NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器通道
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
 NVIC_Init(&NVIC_InitStructure);//写⼊参数

 
 TIM_Cmd(TIM2, ENABLE);//开启定时器
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值